我正在使用JMS从IBM MQ消息代理发送接收消息。我目前正在处理侦听器服务,抛出未处理的异常消息并发送了消息无需确认就返回队列。我希望该服务重试可配置的时间并抛出该异常,这意味着侦听器服务不可用的完整异常消息。
我的监听器和容器工厂如下所示。
@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)
}
您可以将Session
作为另一个参数添加到JmsListener
方法。