Spring JMS 侦听器承认



我正在使用 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方法中。

最新更新