我正在使用 JMS 从 IBM MQ 消息代理发送接收消息。我目前正在处理侦听器服务抛出未经处理的excepion和发送的消息 返回队列而不确认。 我希望服务重试可配置的时间数,并抛出侦听器服务不可用的完整异常消息。
我的侦听器和容器工厂如下所示。
@JmsListener(destination = "testqueue", containerFactory = "queuejmsfactory")
public void consumer(String message) throws JMSException
{ handle(message); }
@Bean(name = "queuejmsfactory") public JmsListenerContainerFactory getQueueTopicFactory(ConnectionFactory con ,
DefaultJmsListenerContainerFactoryConfigurer config)
{ DefaultJmsListenerContainerFactory d = new DefaultJmsListenerContainerFactory();
d.setSessionTransacted(true);
d.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE);
config.configure(d,con);
return d; }
我简短地说,我有一个使用SessionawareMessageListener onMessage的现有代码,我正在尝试 复制到@JmsListener。如何自动处理会话提交和回滚,以及 如果必须像 onMessage 一样手动处理,我如何在 JmsListener 中获取会话。
@Override
public void onMessage(Mesage mes, Session ses) throws JMSException
{ try
{ TestMessage txtMessage = (TextMessage)message;
handle(txtMessage); ses.commit();
} catch (Exception exp)
{ if (shouldRollback(message))
{ ses.rollback();}
else{logger,warn("moved to dlq");
ses.commit();
}
} }
private boolean shouldRollback(Message mes) throws JMSException
{ int rollbackcount = mes.getIntProperty("JMSXDeliveryCount");
return (rollbackcount <= maxRollBackCountFromApplication.properties)
}
更新的代码:
@JmsListener(destination = "testqueue", containerFactory = "queuejmsfactory")
public void consumer(Message message) throws JMSException
{
try {TestMessage txtMessage = (TextMessage)message;
handle(txtMessage);}
catch(Excepton ex) {
if shouldRollback(message)
{throw ex;}
else {logger.warn("moved to dlq")}
}}
private boolean shouldRollback(Message mes) throws JMSException
{ int rollbackcount = mes.getIntProperty("JMSXDeliveryCount");
return (rollbackcount <= maxRollBackCountFromApplication.properties)
}
@Bean(name = "queuejmsfactory") public JmsListenerContainerFactory getQueueTopicFactory(ConnectionFactory con ,
DefaultJmsListenerContainerFactoryConfigurer config)
{ DefaultJmsListenerContainerFactory d = new DefaultJmsListenerContainerFactory();
d.setSessionTransacted(true);
d.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE);
config.configure(d,con);
return d; }
我还尝试从标头访问 JMSXDeliveryCount,但无法获得访问交付计数的确切对象。你能澄清一下吗?
@JmsListener(destination = "testqueue", containerFactory = "queuejmsfactory")
public void consumer(Message message,
@Header(JmsHeaders.CORRELATION_ID) String correlationId,
@Header(name = "jms-header-not-exists") String nonExistingHeader,
@Headers Map<String, Object> headers,
MessageHeaders messageHeaders,
JmsMessageHeaderAccessor jmsMessageHeaderAccessor) {}
可以将Session
作为另一个参数添加到JmsListener
方法中。