我有一个 MessageBean,它从我们将命名为MainQ 的队列中读取。 如果 onMessage 代码的执行抛出了一个基于用户的异常,我们将其命名为UserException我想捕获它并将此消息放在一个名为UserErrorQ的单独队列中。如果异常不属于此类型,则会引发异常以由 DMQ 处理。
这是我的问题:
- 在我的 catch 块中,我尝试通过 ErrorQueueHandler 将此新消息放在 UserErrorQ 上。当我尝试连接到 connectionFactory 以将消息发送到 UserErrorQ 时,这会导致错误。
- 显然创建到 QueueConnectionFactory(javax.jms.ConnectionFactory) 的新连接会导致问题
错误:
com.sun.messaging.jms.JMSException: MQRA:DCF:allocation failure:createConnection:Error in allocating a connection. Cause: javax.transaction.RollbackException
at com.sun.messaging.jms.ra.DirectConnectionFactory._allocateConnection(DirectConnectionFactory.java:548)
at com.sun.messaging.jms.ra.DirectConnectionFactory.createConnection(DirectConnectionFactory.java:265)
at com.sun.messaging.jms.ra.DirectConnectionFactory.createConnection(DirectConnectionFactory.java:244)`
消息豆:
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void onMessage(Message message) {
try{
.
.
}catch(Exception e){
if(isUserExceptionWrappedInException(e){
errorQueueHandler.sendToErrorQueue(message);
}
}
}
private boolean isUserExceptionWrappedInException(Throwable t) {
if (t == null)
return false;
else if (t instanceof UserException)
return true;
else
return isUserExceptionWrappedInException(t.getCause());
}
错误队列处理程序:
public void sendToErrorQueue(Message message) {
try {
createConnection();
send((TextMessage)message);
} finally {
closeConnection();
}
}
private void createConnection() throws Exception {
try {
connection = connectionfactory.createConnection();
connection.start();
} catch (JMSException e) {
String msg = "Error while attempting to initialize connection to jms destination " + ERROR_QUEUE;
throw new OperationalException(msg, e, OperationalExceptionType.APPLIKASJONSTJENER);
}
}
如前所述,尝试建立连接时会发生错误。有人对此有解决办法吗?