Each connection pings the server once every PingPeriod. This is configured
on the ConnectionFactory (e.g. jms/deploy/uil2-service.xml) and defaults to 60
seconds.
Its purpose is for the client to be able detect that the connection with the server
has been broken.
Client sends a ping to the server and rests for the PingPeriod
After the PingPeriod has expired it checks that it got a Pong from the server
Repeat from 1
The connection is broken, use Connection.setExceptionListener() to handle broken connections (usually by closing the old connection and reconnecting)
Something horrible is going on, e.g. very long garbage collections or massive amounts of paging means the ping/pong doesn't get enough cpu to process in time i.e. either the client or server is failing big time to keep up with requests
You send a large message that takes more than PingPeriod to send over the connection, the ping or pong waits behind the message for its turn to be processed UIL2 has a ChunkSize that simulates a Pong when that many bytes are sent over the network to avoid this problem.
Some other problem like a deadlock see READTHISFIRST for how to debug this.
You don't need to for an MDB, JBoss does it for you.
For anything else, you should be using the JMS resource adapter which also does it for you.
Typical example from the forum, can you see the error? Don't cheat...
protected void stopConnection() {
try {
if (queueConnection != null) {
queueConnection.setExceptionListener(null);
queueConnection.stop();
queueConnection.close();
}
} catch (Exception ex) {
logger.error("Error when try to stop Connection = " + ex.getMessage());
}
Yes, the correct answer is that the
connection.stop()throws a
JMSException
and
connection.close()is not done.
This will almost certainly happen since the connection is probably broken, as detected by the ping timeout.
The
stop()and any other tidyup is redundant anyway.
connection.close()does ALL the work
required to close sessions, producers, consumers, null the exception listener and the
stop()itself.
Enable TRACE logging for jbossmq
The stacktrace where the connection was opened will be shown in the log, NOTE the connection id, e.g. Connection@29683960 in the following case:
2007-03-20 11:46:30,250 TRACE [org.jboss.mq.Connection] Connection Initializing userName=null Connection@29683960[clientID=null rcvstate=STOPPED]
2007-03-20 11:46:30,250 TRACE [org.jboss.mq.Connection] Getting the serverIL Connection@29683960[clientID=null rcvstate=STOPPED]
2007-03-20 11:46:30,250 TRACE [org.jboss.mq.Connection] serverIL=org.jboss.mq.il.uil2.UILServerIL@a83a13 Connection@29683960[clientID=null rcvstate=STOPPED]
2007-03-20 11:46:30,250 TRACE [org.jboss.mq.Connection] Authenticating user null Connection@29683960[clientID=null rcvstate=STOPPED]
2007-03-20 11:46:30,252 TRACE [org.jboss.mq.il.uil2.UILServerIL] Begin connect loop, maxRetries=10, delay=0
2007-03-20 11:46:30,252 TRACE [org.jboss.mq.il.uil2.UILServerIL] Connecting with addr=0:0:0:0:0:0:0:1, port=8093, localAddr=null, localPort=0, socketFactory=javax.net.
DefaultSocketFactory@a89ce3, enableTcpNoDelay=true, bufferSize=2048, chunkSize=1000000
2007-03-20 11:46:30,269 TRACE [org.jboss.mq.il.uil2.SocketManager] start called
java.lang.Exception: Start stack trace
at org.jboss.mq.il.uil2.SocketManager.start(SocketManager.java:112)
at org.jboss.mq.il.uil2.UILServerIL.createConnection(UILServerIL.java:523)
at org.jboss.mq.il.uil2.UILServerIL.getSocketMgr(UILServerIL.java:390)
at org.jboss.mq.il.uil2.UILServerIL.authenticate(UILServerIL.java:277)
at org.jboss.mq.Connection.authenticate(Connection.java:1065)
at org.jboss.mq.Connection.<init>(Connection.java:252)
at org.jboss.mq.Connection.<init>(Connection.java:323)
at org.jboss.mq.SpyConnection.<init>(SpyConnection.java:116)
at org.jboss.mq.SpyConnectionFactory.internalCreateConnection(SpyConnectionFactory.java:137)
at org.jboss.mq.SpyConnectionFactory.createQueueConnection(SpyConnectionFactory.java:108)
at org.jboss.example.Client.main(Client.java:36)
This can be matched to the stacktrace on the asynch failure:
2007-03-20 11:46:36,317 TRACE [org.jboss.mq.Connection] Notified of failure reason=Unexpected ping failure Connection@29683960[token=ConnectionToken:ID:7/324cfef34bc4f
c7c4824d5ee727f1ae7 rcvstate=STARTED]
org.jboss.mq.SpyJMSException: Cannot ping the JMS server; - nested throwable: (java.io.IOException: Client is not connected)
at org.jboss.mq.SpyJMSException.getAsJMSException(SpyJMSException.java:72)
at org.jboss.mq.SpyJMSException.rethrowAsJMSException(SpyJMSException.java:57)
at org.jboss.mq.Connection.pingServer(Connection.java:846)
at org.jboss.mq.Connection$PingTask.run(Connection.java:1315)
at EDU.oswego.cs.dl.util.concurrent.ClockDaemon$RunLoop.run(ClockDaemon.java:364)
at java.lang.Thread.run(Thread.java:595)
Caused by: java.io.IOException: Client is not connected
at org.jboss.mq.il.uil2.SocketManager.internalSendMessage(SocketManager.java:264)
at org.jboss.mq.il.uil2.SocketManager.sendReply(SocketManager.java:238)
at org.jboss.mq.il.uil2.UILServerIL.ping(UILServerIL.java:345)
at org.jboss.mq.Connection.pingServer(Connection.java:842)
... 3 more
2007-03-20 11:46:36,317 WARN [org.jboss.mq.Connection] Connection failure, use javax.jms.Connection.setExceptionListener() to handle this error and reconnect
org.jboss.mq.SpyJMSException: Cannot ping the JMS server; - nested throwable: (java.io.IOException: Client is not connected)
There are no comments on this article