我使用Spring amqp MessageListener实现来处理消息。 bean定义和工作示例如下。
public class AutomationMessageListenerServiceImpl implements MessageListener {
public void onMessage(Message message) {
EntityMessage message= null;
try {
message= jsonDeserializer.covertPayload(message.getBody());
dispatchToHandler(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
<rabbit:listener-container connection-factory="rabbitConnectionFactory">
<rabbit:listener queue-names="${listen.queue}" ref="messageListener"/>
</rabbit:listener-container>
<bean id="messageListener" class="com.tcl.gvg.itsm.automation.core.messaging.AutomationMessageListenerServiceImpl"/>
这里的问题是,我正在处理catch块中的所有错误,因此队列认为我成功处理了消息。但是,我不能抛出异常,因为父接口会引起问题,因为它不会抛出任何错误。
我是否有办法在不自行更改代码的情况下完成此操作?
答案 0 :(得分:1)
目前尚不清楚你的意思
因为父方法会导致问题
容器调用onMessage()
并且不涉及您的其他代码。在任何情况下,即使您将其重新排队,也会立即重新传递该消息。
对于像JSON格式错误这样的致命错误,您应该设置一个死信交换/队列,并通过抛出AmqpRejectAndDontRequeueException
来将消息路由到那里。
或者,使用RabbitTemplate
将错误消息发送到DLQ。
答案 1 :(得分:0)
我用RuntimeException包装了异常并将其抛给它的调用者。
catch (Exception e) {
throw new RuntimeException(e);
}