クラス org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread

org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThreadのコラボレーション図

Collaboration graph
[凡例]
すべてのメンバ一覧

説明

Process sequentially a set of tasks and send them to a backend.

作者:
Emmanuel Cecchet
バージョン:
1.0

BackendWorkerThread.java41 行で定義されています。

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


コンストラクタとデストラクタ

org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.BackendWorkerThread DatabaseBackend  backend,
AbstractLoadBalancer  loadBalancer
throws SQLException
 

Creates a new BackendWorkerThread.

引数:
backend the backend this thread is associated to.
loadBalancer the load balancer instanciating this thread
例外:
SQLException if an error occurs

BackendWorkerThread.java73 行で定義されています。

参照先 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   }


メソッド

void org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.addPriorityTask AbstractTask  task,
long  transactionId
 

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

引数:
task the task to add
transactionId transaction id in which this task execute

BackendWorkerThread.java170 行で定義されています。

参照先 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   }

void org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.addPriorityTask AbstractTask  task  ) 
 

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.

引数:
task the task to add

BackendWorkerThread.java152 行で定義されています。

参照先 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().

00153   {
00154     if (!isKilled)
00155     {
00156       taskList.add(0, task);
00157       // We assume that all requests here are writes
00158       backend.addPendingWriteRequest(task);
00159     }
00160   }

void org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.addTask AbstractTask  task,
long  transactionId
 

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.

引数:
task the task to add
transactionId transaction id in which this task execute

BackendWorkerThread.java133 行で定義されています。

参照先 org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.addTask(), org.objectweb.cjdbc.controller.loadbalancer.tasks.AbstractTask.setHasTid(), と org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.tidList.

00134   {
00135     if (!isKilled)
00136     {
00137       task.setHasTid(true);
00138       addTask(task);
00139       if (tidList == null) // Instantiate the list if needed
00140         tidList = new ArrayList();
00141       tidList.add(new Long(transactionId));
00142     }
00143   }

void org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.addTask AbstractTask  task  ) 
 

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.

引数:
task the task to add

BackendWorkerThread.java115 行で定義されています。

参照先 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.addTask(), org.objectweb.cjdbc.controller.requestmanager.RequestManager.addWorkerTask(), org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2.callStoredProcedure(), org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1.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.raidb1.RAIDb1.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().

00116   {
00117     if (!isKilled)
00118     {
00119       taskList.add(task);
00120       // We assume that all requests here are writes
00121       backend.addPendingWriteRequest(task);
00122     }
00123   }

DatabaseBackend org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.getBackend  ) 
 

Returns the backend.

戻り値:
a DatabaseBackend instance

BackendWorkerThread.java430 行で定義されています。

参照元 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   }

Trace org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.getLogger  ) 
 

Returns the logger for tracing.

戻り値:
a Trace instance

BackendWorkerThread.java440 行で定義されています。

00441   {
00442     return logger;
00443   }

synchronized void org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.kill  ) 
 

Kills this thread after the next task processing. It also marks all remaining tasks in the task list as failed.

BackendWorkerThread.java313 行で定義されています。

参照先 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   }

boolean org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.removeTask AbstractTask  task  ) 
 

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.

引数:
task the task to add
戻り値:
true if the task has been removes or false if the task does not exist.

BackendWorkerThread.java189 行で定義されています。

参照先 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   }

void org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.run  ) 
 

Process the tasklist and call wait() (on itself) when the tasklist becomes empty.

BackendWorkerThread.java335 行で定義されています。

参照先 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   }

void org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.waitForAllTasksToComplete  ) 
 

Waits for all current tasks to complete.

BackendWorkerThread.java262 行で定義されています。

参照先 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   }

void org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.waitForAllTasksToComplete long  transactionId  ) 
 

Waits for all tasks of the specified transaction to complete.

引数:
transactionId the transaction identifier

BackendWorkerThread.java213 行で定義されています。

参照先 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   }


変数

DatabaseBackend org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.backend [private]
 

BackendWorkerThread.java52 行で定義されています。

参照元 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().

boolean org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.currentlyProcessing = false [private]
 

BackendWorkerThread.java58 行で定義されています。

参照元 org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.run(), と org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.waitForAllTasksToComplete().

boolean org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.isKilled = false [private]
 

BackendWorkerThread.java55 行で定義されています。

AbstractLoadBalancer org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.loadBalancer [private]
 

BackendWorkerThread.java51 行で定義されています。

参照元 org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.BackendWorkerThread(), と org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.run().

Trace org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.logger = null [private]
 

BackendWorkerThread.java60 行で定義されています。

ArrayList org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.taskList [private]
 

BackendWorkerThread.java53 行で定義されています。

参照元 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().

ArrayList org.objectweb.cjdbc.controller.loadbalancer.BackendWorkerThread.tidList [private]
 

BackendWorkerThread.java54 行で定義されています。

参照元 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().


このクラスの説明は次のファイルから生成されました:
CJDBCversion1.0rc6に対してWed May 5 18:02:20 2004に生成されました。 doxygen 1.3.6