将消息保留在队列中以重试,直到成功处理
Keeping messages in queue for retry untill processed successfully
我正在使用 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 块中的所有错误,因此队列认为我已成功处理消息。但是,我不能抛出异常,因为父接口会导致问题,因为它不会抛出任何错误。
有没有一种方法可以让我在不自己做太多代码更改的情况下做到这一点?
不清楚你所说的
是什么意思
because the parent method will cause problem
容器调用onMessage()
,不涉及您的其他代码。在任何情况下,即使您重新排队,消息也会立即重新传送。
对于格式错误 JSON 等致命错误,您可能应该设置死信 exchange/queue 并通过抛出 AmqpRejectAndDontRequeueException
.[=14= 将消息路由到那里]
或者,使用 RabbitTemplate
将错误消息发送到 DLQ。
我用 RuntimeException 包装异常并将其抛给它的调用者。
catch (Exception e) {
throw new RuntimeException(e);
}
我正在使用 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 块中的所有错误,因此队列认为我已成功处理消息。但是,我不能抛出异常,因为父接口会导致问题,因为它不会抛出任何错误。
有没有一种方法可以让我在不自己做太多代码更改的情况下做到这一点?
不清楚你所说的
是什么意思because the parent method will cause problem
容器调用onMessage()
,不涉及您的其他代码。在任何情况下,即使您重新排队,消息也会立即重新传送。
对于格式错误 JSON 等致命错误,您可能应该设置死信 exchange/queue 并通过抛出 AmqpRejectAndDontRequeueException
.[=14= 将消息路由到那里]
或者,使用 RabbitTemplate
将错误消息发送到 DLQ。
我用 RuntimeException 包装异常并将其抛给它的调用者。
catch (Exception e) {
throw new RuntimeException(e);
}