BackendWorkerThread.java の 41 行で定義されています。
Public メソッド | |
BackendWorkerThread (DatabaseBackend backend, AbstractLoadBalancer loadBalancer) throws SQLException | |
void | addTask (AbstractTask task) |
void | addTask (AbstractTask task, long transactionId) |
void | addPriorityTask (AbstractTask task) |
void | addPriorityTask (AbstractTask task, long transactionId) |
boolean | removeTask (AbstractTask task) |
void | waitForAllTasksToComplete (long transactionId) |
void | waitForAllTasksToComplete () |
synchronized void | kill () |
void | run () |
DatabaseBackend | getBackend () |
Trace | getLogger () |
Private 変数 | |
AbstractLoadBalancer | loadBalancer |
DatabaseBackend | backend |
ArrayList | taskList |
ArrayList | tidList |
boolean | isKilled = false |
boolean | currentlyProcessing = false |
Trace | logger = null |
|
Creates a new
BackendWorkerThread.java の 73 行で定義されています。 参照先 org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.backend, org.objectweb.cjdbc.controller.backend.DatabaseBackend.checkDriverCompliance(), org.objectweb.cjdbc.common.log.Trace.error(), org.objectweb.cjdbc.common.log.Trace.getLogger(), org.objectweb.cjdbc.controller.backend.DatabaseBackend.getName(), org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.loadBalancer, と org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.taskList.
00075 { 00076 // Sanity checks 00077 if (backend == null) 00078 { 00079 String msg = Translate.get("backendworkerthread.null.backend"); 00080 logger = Trace 00081 .getLogger("org.objectweb.cjdbc.controller.backend.DatabaseBackend"); 00082 logger.error(msg); 00083 throw new SQLException(msg); 00084 } 00085 00086 backend.checkDriverCompliance(); 00087 00088 logger = Trace 00089 .getLogger("org.objectweb.cjdbc.controller.backend.DatabaseBackend." 00090 + backend.getName()); 00091 00092 if (loadBalancer == null) 00093 { 00094 String msg = Translate.get("backendworkerthread.null.loadbalancer"); 00095 logger.error(msg); 00096 throw new SQLException(msg); 00097 } 00098 00099 this.backend = backend; 00100 this.loadBalancer = loadBalancer; 00101 taskList = new ArrayList(); 00102 } |
|
Adds a task upfront to the task list so that this task will be the next executed task. Warning! This method is not synchronized and the caller must synchronize on the thread before calling this method
BackendWorkerThread.java の 170 行で定義されています。 参照先 org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.addPriorityTask(), org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.setHasTid(), と org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.tidList.
00171 { 00172 if (!isKilled) 00173 { 00174 task.setHasTid(true); 00175 addPriorityTask(task); 00176 tidList.add(0, new Long(transactionId)); 00177 } 00178 } |
|
Adds a task upfront to the task list so that this task will be the next executed task. Warning! This method is not synchronized and the caller must synchronize on the thread before calling this method.
BackendWorkerThread.java の 152 行で定義されています。 参照先 org.objectweb.cjdbc.controller.backend.DatabaseBackend.addPendingWriteRequest(), org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.backend, と org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.taskList. 参照元 org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.addPriorityTask(), org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2ec.disableBackend(), org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2.disableBackend(), org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1ec.disableBackend(), org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1.disableBackend(), と org.objectweb.cjdbc.controller.loadbalancer.raidb0.RAIDb0.disableBackend().
|
|
Adds a task at the end of the task list. Warning! This method is not synchronized and the caller must synchronize on the thread before calling this method.
BackendWorkerThread.java の 133 行で定義されています。 参照先 org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.addTask(), org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.setHasTid(), と org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.tidList.
|
|
|
Returns the backend.
BackendWorkerThread.java の 430 行で定義されています。 参照元 org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2.callStoredProcedure(), org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2.commit(), org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1.commit(), org.objectweb.cjdbc.controller.loadbalancer.raidb0.RAIDb0.commit(), org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2ec.disableBackend(), org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2.disableBackend(), org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1ec.disableBackend(), org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1.disableBackend(), org.objectweb.cjdbc.controller.loadbalancer.raidb0.RAIDb0.disableBackend(), org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2.execWriteRequest(), org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2.rollback(), org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1.rollback(), org.objectweb.cjdbc.controller.loadbalancer.raidb0.RAIDb0.rollback(), org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2.waitForAllWritesToComplete(), と org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1.waitForAllWritesToComplete().
00431 { 00432 return backend; 00433 } |
|
Returns the logger for tracing.
BackendWorkerThread.java の 440 行で定義されています。
00441 { 00442 return logger; 00443 } |
|
Kills this thread after the next task processing. It also marks all remaining tasks in the task list as failed. BackendWorkerThread.java の 313 行で定義されています。 参照先 org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.backend, org.objectweb.cjdbc.controller.backend.DatabaseBackend.getName(), org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.notifyFailure(), と org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.taskList.
00314 { 00315 int size = taskList.size(); 00316 String msg = "Backend " + backend.getName() + " is shutting down"; 00317 for (int i = 0; i < size; i++) 00318 { 00319 AbstractTask task = (AbstractTask) taskList.get(i); 00320 try 00321 { 00322 task.notifyFailure(this, 1, new SQLException(msg)); 00323 } 00324 catch (SQLException ignore) 00325 { 00326 } 00327 } 00328 isKilled = true; 00329 } |
|
Removes a task from the task list if it has not been already executed. Warning! This method is not synchronized and the caller must synchronize on the thread before calling this method.
BackendWorkerThread.java の 189 行で定義されています。 参照先 org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.backend, org.objectweb.cjdbc.controller.backend.DatabaseBackend.removePendingRequest(), org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.taskList, と org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.tidList. 参照元 org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2.callStoredProcedure(), org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1.callStoredProcedure(), と org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1.execWriteRequest().
00190 { 00191 backend.removePendingRequest(task); 00192 if (tidList == null) 00193 return taskList.remove(task); 00194 else 00195 { 00196 int idx = taskList.indexOf(task); 00197 if (idx == -1) 00198 return false; 00199 else 00200 { 00201 taskList.remove(idx); 00202 tidList.remove(idx); 00203 return true; 00204 } 00205 } 00206 } |
|
Process the tasklist and call BackendWorkerThread.java の 335 行で定義されています。 参照先 org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.backend, org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.currentlyProcessing, org.objectweb.cjdbc.common.log.Trace.debug(), org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.disableBackend(), org.objectweb.cjdbc.common.log.Trace.error(), org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.execute(), org.objectweb.cjdbc.common.log.Trace.fatal(), org.objectweb.cjdbc.controller.backend.DatabaseBackend.getName(), org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.hasTid, org.objectweb.cjdbc.common.log.Trace.isDebugEnabled(), org.objectweb.cjdbc.controller.backend.DatabaseBackend.isReadEnabled, org.objectweb.cjdbc.controller.backend.DatabaseBackend.isWriteEnabled, org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.loadBalancer, org.objectweb.cjdbc.controller.backend.DatabaseBackend.removePendingRequest(), org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.taskList, org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.tidList, と org.objectweb.cjdbc.common.log.Trace.warn().
00336 { 00337 AbstractTask task = null; 00338 00339 while (!isKilled) 00340 { 00341 synchronized (this) 00342 { 00343 if (taskList.isEmpty()) 00344 { // Nothing to do, go to bed! 00345 try 00346 { 00347 wait(); 00348 } 00349 catch (InterruptedException e) 00350 { 00351 logger.warn(Translate.get("backendworkerthread.wait.interrupted")); 00352 } 00353 } 00354 try 00355 { // Take the 1st task from the list 00356 task = (AbstractTask) taskList.remove(0); 00357 currentlyProcessing = true; 00358 } 00359 catch (IndexOutOfBoundsException oob) 00360 { 00361 logger.warn(Translate.get("backendworkerthread.no.task")); 00362 } 00363 } 00364 // Execute the task out of the sync block 00365 try 00366 { 00367 if (logger.isDebugEnabled()) 00368 logger.debug(Translate.get("backendworkerthread.execute.task", task 00369 .toString())); 00370 task.execute(this); 00371 } 00372 catch (SQLException e) 00373 { 00374 logger.warn(Translate.get("backendworkerthread.task.failed", e)); 00375 } 00376 catch (RuntimeException re) 00377 { 00378 logger.fatal(Translate.get( 00379 "backendworkerthread.task.runtime.exception", task.toString()), re); 00380 } 00381 finally 00382 { 00383 try 00384 { 00385 backend.removePendingRequest(task); 00386 } 00387 catch (RuntimeException e) 00388 { 00389 logger.warn( 00390 Translate.get("backendworkerthread.remove.task.error", e), e); 00391 } 00392 } 00393 00394 if (task.hasTid()) 00395 { 00396 // Notify the completion of the task if someone is waiting for 00397 // the completion of this transaction (@see #waitForAllTasksToComplete) 00398 synchronized (this) 00399 { 00400 if (tidList != null) 00401 tidList.remove(0); 00402 notifyAll(); 00403 currentlyProcessing = false; 00404 } 00405 } 00406 } 00407 00408 // Automatically disable the backend when the thread dies 00409 try 00410 { 00411 if (backend.isReadEnabled() || backend.isWriteEnabled()) 00412 loadBalancer.disableBackend(backend); 00413 } 00414 catch (SQLException e) 00415 { 00416 logger.error(Translate.get("backendworkerthread.backend.disable.failed", 00417 new String[]{backend.getName(), e.getMessage()})); 00418 } 00419 } |
|
Waits for all current tasks to complete. BackendWorkerThread.java の 262 行で定義されています。 参照先 org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.currentlyProcessing, org.objectweb.cjdbc.common.log.Trace.debug(), org.objectweb.cjdbc.common.log.Trace.isDebugEnabled(), org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.taskList, と org.objectweb.cjdbc.common.log.Trace.warn().
00263 { 00264 synchronized (this) 00265 { 00266 Object current; 00267 if (taskList.size() == 0) 00268 { 00269 if (currentlyProcessing) 00270 { 00271 try 00272 { 00273 if (logger.isDebugEnabled()) 00274 logger.debug(Translate.get("backendworkerthread.waiting.task")); 00275 wait(); 00276 } 00277 catch (InterruptedException ignore) 00278 { 00279 logger.warn(Translate 00280 .get("backendworkerthread.no.full.task.synchronization")); 00281 } 00282 return; 00283 } 00284 else 00285 { // No task currently executing 00286 return; 00287 } 00288 } 00289 else 00290 current = taskList.get(taskList.size() - 1); 00291 00292 if (logger.isDebugEnabled()) 00293 logger.debug(Translate.get("backendworkerthread.waiting.request", 00294 current.toString())); 00295 00296 while (taskList.contains(current)) 00297 { 00298 try 00299 { 00300 wait(); 00301 } 00302 catch (InterruptedException ignore) 00303 { 00304 } 00305 } 00306 } 00307 } |
|
Waits for all tasks of the specified transaction to complete.
BackendWorkerThread.java の 213 行で定義されています。 参照先 org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.currentlyProcessing, org.objectweb.cjdbc.common.log.Trace.debug(), org.objectweb.cjdbc.common.log.Trace.isDebugEnabled(), と org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.tidList. 参照元 org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2.waitForAllWritesToComplete(), と org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1.waitForAllWritesToComplete().
00214 { 00215 if ((transactionId == 0) || (tidList == null)) 00216 return; 00217 00218 Long tid = new Long(transactionId); 00219 synchronized (this) 00220 { 00221 if (!tidList.contains(tid)) 00222 { 00223 if (currentlyProcessing) 00224 { // We are not sure that the task currently executing belongs to the 00225 // transaction we are interested in or not. So we wait for the 00226 // completion of the current task, it is safer. 00227 try 00228 { 00229 if (logger.isDebugEnabled()) 00230 logger.debug(Translate.get("backendworkerthread.waiting.task")); 00231 wait(); 00232 } 00233 catch (InterruptedException ignore) 00234 { 00235 } 00236 return; 00237 } 00238 else 00239 return; 00240 } 00241 00242 while (tidList.contains(tid)) 00243 { 00244 if (logger.isDebugEnabled()) 00245 logger.debug(Translate.get("backendworkerthread.waiting.transaction", 00246 String.valueOf(tid))); 00247 00248 try 00249 { 00250 wait(); 00251 } 00252 catch (InterruptedException ignore) 00253 { 00254 } 00255 } 00256 } 00257 } |
|
BackendWorkerThread.java の 52 行で定義されています。 参照元 org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.addPriorityTask(), org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.addTask(), org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.BackendWorkerThread(), org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.kill(), org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.removeTask(), と org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.run(). |
|
BackendWorkerThread.java の 58 行で定義されています。 参照元 org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.run(), と org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.waitForAllTasksToComplete(). |
|
BackendWorkerThread.java の 55 行で定義されています。 |
|
BackendWorkerThread.java の 51 行で定義されています。 参照元 org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.BackendWorkerThread(), と org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.run(). |
|
BackendWorkerThread.java の 60 行で定義されています。 |
|
BackendWorkerThread.java の 53 行で定義されています。 参照元 org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.addPriorityTask(), org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.addTask(), org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.BackendWorkerThread(), org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.kill(), org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.removeTask(), org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.run(), と org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.waitForAllTasksToComplete(). |
|
BackendWorkerThread.java の 54 行で定義されています。 参照元 org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.addPriorityTask(), org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.addTask(), org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.removeTask(), org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.run(), と org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.waitForAllTasksToComplete(). |