【发布时间】:2017-05-08 21:04:56
【问题描述】:
我正在使用 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;
}
【问题讨论】:
-
也不例外。你正在捕捉一切。 Spring 需要看到一个异常来回滚/不承认它,但是当你捕捉它(并吞下)Spring 认为一切都很好。
-
您好,感谢您的澄清。但是我对这种方法有一个疑问,如果我抛出异常,消息将重新排队,但是监听器会再次将其拉回并再次抛出异常形成循环,我该如何处理这种情况?
-
这是您想在代理处处理的事情(我对 SQS 选项不太熟悉),但通常您可以配置多次重新传递消息,然后丢弃或移动到不同的频道/队列。
-
感谢您的解释,我刚刚查了一下,发现 SQS 中的 DLQ 是出于完全相同的目的。
标签: java amazon-web-services spring-boot amazon-sqs spring-jms