我正在使用 JMS 向 SQS 队列发送/接收消息,但是即使在使用 client_acknowledge 时出现异常,我也无法重新传递消息。如何实现这一目标?
我尝试了一个简单的测试,
@JmsListener(destination = "test-normalqueue")
public void receiveNormalQueue(String message)
{
try {
logger.info("message received in normal queue: " + message);
throw new NullPointerException();
} catch (Exception e) {
logger.error(LoggingUtil.getStackTrace(e));;
}
}
即使在异常消息之后也不会返回队列。
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(getSQSConnectionFactory());
factory.setConcurrency("1-2");
factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
return factory;
}
您必须使用 DMLC 进行交易。
Use Session.AUTO_ACKNOWLEDGE
and setSessionTransacted(true)
.
如果侦听器正常退出,则消息将被删除。如果听者throws发生异常时,消息将回滚到队列中。
您还可以使用客户端模式进行事务,但您必须自己确认成功的消息。
您不必使用带有SimpleMessageListenerContainer
但您仍然必须抛出异常才能使消息重新排队。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)