PDA

View Full Version : Problem in DefaultMessageListenerContainer after connection failed



muellerc
Jan 19th, 2006, 07:57 AM
Hi all,

i use springs (2.0 M1) asynchronous JMS receiver support with Oracle AQ. If the connection failed after a while, the DefaultMessageListenerContainer runs in an endless loop.
The AsyncMessageListenerInvoker call in a loop the method executeListener(session, consumer) from the DefaultMessageListenerContainer. This method catchs all exception and the AsyncMessageListenerInvoker do'nt know the problem...



public class DefaultMessageListenerContainer extends AbstractMessageListenerContainer {
...
protected void executeListener(final Session session, final MessageConsumer consumer) {
if (this.transactionTemplate.getTransactionManager() != null) {
this.transactionTemplate.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
try {
doExecuteListener(session, consumer);
}
catch (Throwable ex) {
status.setRollbackOnly();
logger.error("Execution of JMS message listener failed - rolling back transaction", ex);
}
}
});
}
else {
try {
doExecuteListener(session, consumer);
}
catch (JMSException ex) {
logger.error("Execution of JMS message listener failed", ex);
}
}
}

...

private class AsyncMessageListenerInvoker implements Runnable {

public void run() {
synchronized (monitor) {
listenersRunning++;
}
Session session = null;
MessageConsumer consumer = null;
try {
session = createSession(getConnection());
consumer = createListenerConsumer(session);
while (isActive()) {
executeListener(session, consumer);
}
}
catch (JMSException ex) {
logger.error("Setup of JMS message listener invoker failed", ex);
}
finally {
JmsUtils.closeMessageConsumer(consumer);
JmsUtils.closeSession(session);
synchronized (monitor) {
listenersRunning--;
}
}
}
}
}



Maybe a reconnect is usefull!?

Christian