After my posts concerning presentation of Queue/BlockingQueue, and the Queue/BlockingQueue implementations I would continue with a post about a concrete example of these implementations: the Multi servers dispatching.
Multi-server operating system:
This system provides a pool of available connections due to:
- ConfigParametersAndUtils: Configuration’s parameters and useful methods
- MyHostConnectionProxy: Encapsulates the real connection. This class manage the connection transaction timeout too, if a connection duration exceed the defined transactionTimeOut, it will be automatically closed.
- MyHostConnectionProxyFactory: The main goals of MyHostConnectionProxyFactory class is to provide and close the connection via its connection pools:
– Unused and available connections (connectionPool) ;
– Used connections (usedconnectionPool) ;
– Unavailable connections (unavailableConnectionPool);
-> Open Connection: execute the MyHostConnectionProxyFactory.openConnection method;
-> Open Connection with a same server: execute the MyHostConnectionProxyFactory.openConnectionWithSameServer method;
-> Close a connection: execute the MyHostConnectionProxyFactory.closeConnection method; - MyHostConnectionProxyAutoCloseConnection: It is a runnable is attached to each used connection in order to detect a timeout (MyHostConnectionProxy.transactionTimeOut) and close the connection (use of ScheduledExecutorService),
- MyHostConnectionMock: Mock connection encapsulated by the instance of MyHostConnectionProxy in the tests
Test n°1:
The test case Launch5ThreadsTest checks the working of multi server dispatching with a pool of 2 connections available and 5 runnable clients.
Initializing the connection pools:
main --------------- Initializing the connection pools... --------------- main Following connection added : host:port=server0/8200 - transactionTimeOut=null - autoCloseConnectionRunnable is done=false main Following connection added : host:port=server1/8201 - transactionTimeOut=null - autoCloseConnectionRunnable is done=false main --------------- Connection pools initialized... ---------------
Here, the traces concerning the connections established for each client thread and the mock remote server:
Thread1 --------> Connection established with : host:port=server0/8200 - transactionTimeOut=300 - autoCloseConnectionRunnable is done=true ... Thread5 --------> Connection established with : host:port=server1/8201 - transactionTimeOut=300 - autoCloseConnectionRunnable is done=true ... Thread5 --------> Connection established with : host:port=server1/8201 - transactionTimeOut=300 - autoCloseConnectionRunnable is done=true Thread5 --------> OpenConnectionWithSameServer : following connection opened : host:port=server1/8201 - transactionTimeOut=300 - autoCloseConnectionRunnable is done=true ...
the traces concerning the connections closure:
Thread1 --------> CloseConnection : connection released connectionToRelease : host:port=server0/8200 - transactionTimeOut=300 - autoCloseConnectionRunnable is done=true ) ... Thread5 --------> CloseConnection : releasing connection connectionToRelease : host:port=server1/8201 - transactionTimeOut=300 - autoCloseConnectionRunnable is done=true ) ... Thread4 --------> CloseConnection : connection released connectionToRelease : host:port=server0/8200 - transactionTimeOut=300 - autoCloseConnectionRunnable is done=true ) ... Thread2 --------> CloseConnection : connection released connectionToRelease : host:port=server0/8200 - transactionTimeOut=300 - autoCloseConnectionRunnable is done=true ) ... Thread3 --------> CloseConnection : releasing connection connectionToRelease : host:port=server1/8201 - transactionTimeOut=300 - autoCloseConnectionRunnable is done=true ) ...
Test n°2:
The test case Launch3ThreadsTimeOutWithAutoCloseTest checks the working of the AutoClose runnable used to detect a timeout and close the connection with a pool of 2 connections available and 3 runnable clients. This runnable is attached to each connection.
Initializing the connection pools:
main --------------- Initializing the connection pools... --------------- main Following connection added : host:port=server0/8200 - transactionTimeOut=null - autoCloseConnectionRunnable is done=false main Following connection added : host:port=server1/8201 - transactionTimeOut=null - autoCloseConnectionRunnable is done=false main --------------- Connection pools initialized... ---------------
To enforce the timeout, we have changed the connection time out to 1 seconds. So, if an connection is open more than this time. A thread will close it automatically. Here, the traces concerning the MyHostConnectionProxyAutoCloseConnection runnable for each connection:
ThreadAutoCloseConnection - server0:8200 --------> Start of the run() function : trying to automatically close the connection having a transaction time out. ThreadAutoCloseConnection - server0:8200 --------> CloseConnection : releasing connection connectionToRelease : host:port=server0/8200 - transactionTimeOut=1 - autoCloseConnectionRunnable is done=true ) ThreadAutoCloseConnection - server0:8200 --------> Start of the cancel() function : trying to unschedule the runnable that automatically close the connection if a transaction time out occurs. ThreadAutoCloseConnection - server0:8200 --------> End of the cancel() function. ThreadAutoCloseConnection - server0:8200 --------> MyHostConnectionMock.close() on 'server0/8200' and going to sleep for 2170 milliseconds. ... ThreadAutoCloseConnection - server1:8201 --------> Start of the run() function : trying to automatically close the connection having a transaction time out. ThreadAutoCloseConnection - server1:8201 --------> CloseConnection : releasing connection connectionToRelease : host:port=server1/8201 - transactionTimeOut=1 - autoCloseConnectionRunnable is done=true ) ThreadAutoCloseConnection - server1:8201 --------> Start of the cancel() function : trying to unschedule the runnable that automatically close the connection if a transaction time out occurs. ThreadAutoCloseConnection - server1:8201 --------> End of the cancel() function. ThreadAutoCloseConnection - server1:8201 --------> MyHostConnectionMock.close() on 'server1/8201' and going to sleep for 1992 milliseconds. ... ThreadAutoCloseConnection - server0:8200 --------> CloseConnection : connection released connectionToRelease : host:port=server0/8200 - transactionTimeOut=1 - autoCloseConnectionRunnable is done=true ) ThreadAutoCloseConnection - server0:8200 --------> End of the run() function. ThreadAutoCloseConnection - server1:8201 --------> CloseConnection : connection released connectionToRelease : host:port=server1/8201 - transactionTimeOut=1 - autoCloseConnectionRunnable is done=true ) ThreadAutoCloseConnection - server1:8201 --------> End of the run() function. ...
Here, a concrete example of the Queues implementations, however, contact me for more explanations.
The source code of this article and the a test cases are in the ZIP file attachement.
Download: java_queue.zip
Best regards,