Hi there again,
I've created a simple standalone-client-scenario to reproduce the above warnings:
public class TestScenario {
// ############### CONFIG #################
private final static String sJMS_CONNECTION_FACTORY_NAME = "ClusteredConnectionFactory";
private final static int sCONCURRENT_CALLS = 25;
private final static long sSLEEP_TIME = sCONCURRENT_CALLS * 100;
// ########################################
private final static CountDownLatch sCDL = new CountDownLatch(sCONCURRENT_CALLS);
private final static SimpleDateFormat sDATE_FORMATER = new SimpleDateFormat("HH:mm:ss.SSS ");
public static void main(String[] args) {
for (int i = 0; i < sCONCURRENT_CALLS; i++) {
final int lIteration = i;
Thread lThread = new Thread(new Runnable() {
@Override
public void run() {
try {
doIteration();
} catch (Throwable t) {
t.printStackTrace();
}
}
}, "Thread-no." + lIteration);
lThread.setDaemon(true);
lThread.start();
}
try {
Thread.sleep(sSLEEP_TIME);
} catch (InterruptedException e) {
e.printStackTrace();
}
log("...ready!");
}
/**
* @throws NamingException
*/
private static void doIteration() throws NamingException {
log("...lookup JMSConnectionFactory...");
ConnectionFactory lConnectionFactory = lookUpJMSConnectionFactory();
sCDL.countDown();
Connection lConnection;
try {
log("...create JMSConnection...");
lConnection = lConnectionFactory.createConnection();
log("...close JMSConnection...");
lConnection.close();
} catch (JMSException e) {
e.printStackTrace();
}
log("...ready!");
}
/**
* @return
* @throws NamingException
*/
private static ConnectionFactory lookUpJMSConnectionFactory() throws NamingException {
Context lContext = new InitialContext();
return (ConnectionFactory) lContext.lookup(sJMS_CONNECTION_FACTORY_NAME);
}
private static void log(String pLog) {
System.out.println(sDATE_FORMATER.format(new Date()) + Thread.currentThread().getName() + pLog);
}
}
This will create ${sCONCURRENT_CALLS} daemon threads. Each thread gets a jms connectionfactory, creates a connection and closes the connection. The main thread will sleep ${sSLEEP_TIME} milli seconds before terminating.
With the above config, I receive everytime the following ConcurrentModificationException within the client:
Exception in thread "Thread-1" java.util.ConcurrentModificationException
at java.util.WeakHashMap$HashIterator.nextEntry(WeakHashMap.java:762)
at java.util.WeakHashMap$KeyIterator.next(WeakHashMap.java:795)
at org.jboss.jms.client.delegate.ClientClusteredConnectionFactoryDelegate$FinalizerShutdownHook.run(ClientClusteredConnectionFactoryDelegate.java:462)
In server.log the following can be seen:
2010-09-02 11:57:05,510 WARN [org.jboss.remoting.transport.bisocket.BisocketClientInvoker] (Timer-4) Unable to send ping: shutting down PingTimerTask
java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at org.jboss.remoting.transport.bisocket.BisocketClientInvoker$PingTimerTask.run(BisocketClientInvoker.java:723)
at java.util.TimerThread.mainLoop(Unknown Source)
at java.util.TimerThread.run(Unknown Source)
And:
2010-09-02 11:56:59,401 ERROR [org.jboss.remoting.transport.socket.ServerThread] (WorkerThread#40[10.3.4.124:4488]) WorkerThread#40[10.3.4.124:4488] failed
java.io.IOException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
at java.io.BufferedOutputStream.flush(Unknown Source)
at java.io.DataOutputStream.flush(Unknown Source)
at org.jboss.jms.wireformat.NullResponse.write(NullResponse.java:53)
at org.jboss.jms.wireformat.JMSWireFormat.write(JMSWireFormat.java:237)
at org.jboss.remoting.transport.socket.ServerThread.versionedWrite(ServerThread.java:1051)
at org.jboss.remoting.transport.socket.ServerThread.completeInvocation(ServerThread.java:807)
at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:721)
at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:575)
at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:234)
I assume, these warnings and errors occur because the clients brake away. Can anyone confirm this?
Thanks,
Kevin