クラス org.objectweb.cjdbc.controller.core.ControllerWorkerThread

org.objectweb.cjdbc.controller.core.ControllerWorkerThreadのコラボレーション図

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

説明

The ControllerWorkerThread handles a connection with a C-JDBC driver. It reads a String containing the virtual database name from the driver and sends back the corresponding ConnectionPoint.

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

ControllerWorkerThread.java49 行で定義されています。

Public メソッド

 ControllerWorkerThread (ControllerServerThread serverThread)
void run ()

スタティック変数

Trace logger

Private 変数

ControllerServerThread serverThread
boolean isKilled = false


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

org.objectweb.cjdbc.controller.core.ControllerWorkerThread.ControllerWorkerThread ControllerServerThread  serverThread  ) 
 

Creates a new ControllerWorkerThread instance.

引数:
serverThread the ControllerServerThread that created us.
ControllerWorkerThread.java77 行で定義されています。
00078 { 00079 super("ControllerWorkerThread"); 00080 this.serverThread = serverThread; 00081 }


メソッド

void org.objectweb.cjdbc.controller.core.ControllerWorkerThread.run  ) 
 

Gets a connection from the connection queue and process it. ControllerWorkerThread.java86 行で定義されています。

参照先 org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase.addCurrentNbOfThread(), org.objectweb.cjdbc.controller.core.ControllerServerThread.controller, org.objectweb.cjdbc.controller.core.ControllerServerThread.controllerServerThreadPendingQueue, org.objectweb.cjdbc.common.stream.CJDBCOutputStream.flush(), org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase.getActiveThreads(), org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase.getCurrentNbOfThreads(), org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase.getIdleThreads(), org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase.getMaxNbOfConnections(), org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase.getMaxNbOfThreads(), org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase.getMinNbOfThreads(), org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase.getPendingConnections(), org.objectweb.cjdbc.controller.core.Controller.getVirtualDatabase(), org.objectweb.cjdbc.controller.core.ControllerServerThread.idleWorkerThreads, org.objectweb.cjdbc.controller.core.ControllerWorkerThread.isKilled, org.objectweb.cjdbc.controller.core.ControllerServerThread.isShuttingDown, org.objectweb.cjdbc.controller.core.ControllerWorkerThread.logger, org.objectweb.cjdbc.common.stream.CJDBCInputStream.readInt(), org.objectweb.cjdbc.common.stream.CJDBCInputStream.readUTF(), org.objectweb.cjdbc.controller.core.ControllerWorkerThread.serverThread, と org.objectweb.cjdbc.common.stream.CJDBCOutputStream.writeObject().

00087 { 00088 Socket clientSocket; 00089 00090 if (serverThread == null) 00091 { 00092 logger.error(Translate.get("controller.workerthread.null.serverthread")); 00093 isKilled = true; 00094 } 00095 else if (serverThread.controllerServerThreadPendingQueue == null) 00096 { 00097 logger.error(Translate.get("controller.workerthread.null.pendingqueue")); 00098 isKilled = true; 00099 } 00100 00101 // Main loop 00102 while (!isKilled) 00103 { 00104 if (serverThread.isShuttingDown()) 00105 break; 00106 // Get a connection from the pending queue 00107 synchronized (serverThread.controllerServerThreadPendingQueue) 00108 { 00109 while (serverThread.controllerServerThreadPendingQueue.isEmpty()) 00110 { 00111 // Nothing to do, let's sleep ... 00112 serverThread.idleWorkerThreads++; 00113 boolean timeout = false; 00114 try 00115 { 00116 long before = System.currentTimeMillis(); 00117 serverThread.controllerServerThreadPendingQueue 00118 .wait(ControllerConstants.DEFAULT_CONTROLLER_WORKER_THREAD_SLEEP_TIME); 00119 long now = System.currentTimeMillis(); 00120 // Check if timeout has expired 00121 timeout = now - before >= ControllerConstants.DEFAULT_CONTROLLER_WORKER_THREAD_SLEEP_TIME; 00122 } 00123 catch (InterruptedException ignore) 00124 { 00125 } 00126 serverThread.idleWorkerThreads--; 00127 // We are shutting down 00128 if (serverThread.controllerServerThreadPendingQueue == null) 00129 { 00130 isKilled = true; 00131 break; 00132 } 00133 if (timeout 00134 && serverThread.controllerServerThreadPendingQueue.isEmpty()) 00135 { 00136 // Nothing to do, let's die. 00137 isKilled = true; 00138 break; 00139 } 00140 } 00141 00142 if (isKilled) 00143 break; 00144 00145 // Get a connection 00146 clientSocket = (Socket) serverThread.controllerServerThreadPendingQueue 00147 .remove(0); 00148 } // synchronized (serverThread.controllerServerThreadPendingQueue) 00149 00150 if (clientSocket == null) 00151 { 00152 logger.error(Translate.get("controller.workerthread.null.socket")); 00153 continue; 00154 } 00155 else if (logger.isDebugEnabled()) 00156 logger.debug(Translate.get("controller.workerthread.connection.from", 00157 new String[]{clientSocket.getInetAddress().toString(), 00158 String.valueOf(clientSocket.getPort())})); 00159 00160 try 00161 { 00162 // Disable Nagle algorithm else small messages are not sent 00163 // (at least under Linux) even if we flush the output stream. 00164 clientSocket.setTcpNoDelay(true); 00165 00166 // Handle connection 00167 CJDBCInputStream in = new CJDBCInputStream(clientSocket); 00168 CJDBCOutputStream out = new CJDBCOutputStream(clientSocket); 00169 00170 // Check protocol version for driver compatibility 00171 int version = in.readInt(); 00172 if (version != Commands.ProtocolVersion) 00173 { 00174 logger.warn(Translate.get( 00175 "controller.workerthread.protocol.incompatible", version)); 00176 continue; 00177 } 00178 String virtualDatabaseName = in.readUTF(); 00179 00180 // Read the virtual database name 00181 VirtualDatabase vdb = serverThread.controller 00182 .getVirtualDatabase(virtualDatabaseName); 00183 if (vdb == null) 00184 { 00185 String msg = Translate.get("virtualdatabase.not.found", 00186 virtualDatabaseName); 00187 logger.warn(msg); 00188 continue; 00189 } 00190 00191 // At this point we have the virtual database the driver wants to 00192 // connect to and we have to give the job to a 00193 // VirtualDatabaseWorkerThread 00194 ArrayList vdbActiveThreads = vdb.getActiveThreads(); 00195 ArrayList vdbPendingQueue = vdb.getPendingConnections(); 00196 00197 if (vdbActiveThreads == null) 00198 { 00199 logger.error(Translate 00200 .get("controller.workerthread.null.active.thread")); 00201 isKilled = true; 00202 } 00203 if (vdbPendingQueue == null) 00204 { 00205 logger 00206 .error(Translate.get("controller.workerthread.null.connection")); 00207 isKilled = true; 00208 } 00209 00210 // Start minimum number of worker threads 00211 boolean tooManyConnections; 00212 synchronized (vdbActiveThreads) 00213 { 00214 while (vdb.getCurrentNbOfThreads() < vdb.getMinNbOfThreads()) 00215 { 00216 // Fork a new worker thread 00217 if (logger.isDebugEnabled()) 00218 logger.debug(Translate 00219 .get("controller.workerthread.starting.thread.for.minimum")); 00220 VirtualDatabaseWorkerThread thread = new VirtualDatabaseWorkerThread( 00221 serverThread.controller, vdb); 00222 vdbActiveThreads.add(thread); 00223 vdb.addCurrentNbOfThread(); 00224 thread.start(); 00225 } 00226 00227 // Check if maximum number of concurrent connections has been 00228 // reached 00229 tooManyConnections = (vdb.getMaxNbOfConnections() > 0) 00230 && vdbActiveThreads.size() + vdbPendingQueue.size() > vdb 00231 .getMaxNbOfConnections(); 00232 } 00233 if (tooManyConnections) 00234 { 00235 out.writeObject(new SQLException(Translate 00236 .get("controller.workerthread.too.many.connections"))); 00237 out.flush(); 00238 continue; 00239 } 00240 00241 // Put the connection in the queue 00242 synchronized (vdbPendingQueue) 00243 { 00244 vdbPendingQueue.add(in); 00245 vdbPendingQueue.add(out); 00246 // Nullify the socket else it is closed in the finally block 00247 clientSocket = null; 00248 synchronized (vdbActiveThreads) 00249 { // Is a thread available? 00250 if (vdb.getIdleThreads() == 0) 00251 { // No 00252 if ((vdb.getCurrentNbOfThreads() <= vdb.getMaxNbOfThreads()) 00253 || (vdb.getMaxNbOfThreads() == 0)) 00254 { 00255 // Fork a new worker thread 00256 if (logger.isDebugEnabled()) 00257 logger.debug(Translate 00258 .get("controller.workerthread.starting.thread")); 00259 VirtualDatabaseWorkerThread thread = new VirtualDatabaseWorkerThread( 00260 serverThread.controller, vdb); 00261 vdbActiveThreads.add(thread); 00262 vdb.addCurrentNbOfThread(); 00263 thread.start(); 00264 } 00265 else if (logger.isInfoEnabled()) 00266 logger.info(Translate.get( 00267 "controller.workerthread.maximum.thread", vdb 00268 .getMaxNbOfThreads())); 00269 } 00270 else 00271 { 00272 if (logger.isDebugEnabled()) 00273 logger.debug(Translate 00274 .get("controller.workerthread.notify.thread")); 00275 // Here we notify all threads else if one thread doesn't wake 00276 // up after the first notify() we will send a second notify() 00277 // and one signal will be lost. So the safe way is to wake up 00278 // everybody and that worker threads go back to sleep if there 00279 // is no job. 00280 vdbPendingQueue.notifyAll(); 00281 } 00282 } 00283 } 00284 } 00285 // } 00286 catch (OptionalDataException e) 00287 { 00288 logger 00289 .error(Translate.get("controller.workerthread.protocol.error", e)); 00290 } 00291 catch (IOException e) 00292 { 00293 logger.error(Translate.get("controller.workerthread.io.error", e)); 00294 } 00295 finally 00296 { 00297 try 00298 { 00299 if (clientSocket != null) 00300 { 00301 if (logger.isDebugEnabled()) 00302 logger.debug(Translate 00303 .get("controller.workerthread.connection.closing")); 00304 clientSocket.close(); 00305 } 00306 } 00307 catch (IOException ignore) 00308 { 00309 } 00310 } 00311 } 00312 00313 if (logger.isDebugEnabled()) 00314 logger.debug(Translate.get("controller.workerthread.terminating")); 00315 }


変数

boolean org.objectweb.cjdbc.controller.core.ControllerWorkerThread.isKilled = false [private]
 

ControllerWorkerThread.java61 行で定義されています。

参照元 org.objectweb.cjdbc.controller.core.ControllerWorkerThread.run().

Trace org.objectweb.cjdbc.controller.core.ControllerWorkerThread.logger [static, package]
 

初期値:

Trace .getLogger("org.objectweb.cjdbc.controller.core.Controller")
Logger instance. ControllerWorkerThread.java64 行で定義されています。

参照元 org.objectweb.cjdbc.controller.core.ControllerWorkerThread.run().

ControllerServerThread org.objectweb.cjdbc.controller.core.ControllerWorkerThread.serverThread [private]
 

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

参照元 org.objectweb.cjdbc.controller.core.ControllerWorkerThread.run().


このクラスの説明は次のファイルから生成されました:
CJDBCversion1.0.4に対してTue Oct 12 15:16:41 2004に生成されました。 doxygen 1.3.8