当MessageListener抛出异常时,RabbitMQ侦听器停止侦听消息

时间:2017-04-18 07:49:54

标签: spring rabbitmq spring-amqp spring-rabbit spring-rabbitmq

我使用Spring AMQP处理RabbitMQ中的消息。

以下是问题:
1.(比如)RabbitMQ中有3条处于就绪状态的消息 2.第一个由MessageListener选取并开始处理。 (比如)它最终会抛出异常 3.在这种情况下,容器保持运行状态,但在重新启动容器之前,不会处理剩余的2条消息。第一封邮件也处于未确认状态。

这是预期的行为吗?如果没有,如何确保处理其他2条消息而不管第一条消息处理失败?

MQ配置

<rabbit:connection-factory id="connectionFactory" host="localhost" username="guest" password="guest" /> 

<rabbit:admin connection-factory="connectionFactory" />

<rabbit:listener-container
    connection-factory="connectionFactory" 
    concurrency="1"
    acknowledge="auto">
    <rabbit:listener queue-names="testQueue" ref="myProcessorListener " />
</rabbit:listener-container>

MessageListener类

public class MyProcessorListener implements MessageListener{
....
    @Override
public void onMessage(Message message) {
try{
...Some logic...

} catch (Exception e) {
  throw new RuntimeException(e.getMessage(), e);
}

1 个答案:

答案 0 :(得分:2)

消息一遍又一遍地重新传递;为了拒绝它(并丢弃或路由到死信队列),您需要抛出if (Environment.MEDIA_MOUNTED.equals(state)) { File Root = Environment.getExternalStorageDirectory(); File Dir = new File(Root.getAbsolutePath() + "/FLOW DATA"); if (!Dir.exists()) { Dir.mkdir(); } File file = new File(Dir`enter code here`, "FLOW DATA.txt"); try { FileOutputStream fileOutputStream = new FileOutputStream(file); fileOutputStream.write(message.getBytes()); fileOutputStream.close(); Toast.makeText(context, "Message Saved", Toast.LENGTH_LONG).show(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } else { Toast.makeText(context, "SD CARD NOT FOUND", Toast.LENGTH_LONG).show(); } } 或将容器的AmqpRejectAndDontRequeueException属性设置为requeue-rejected。使用Java进行配置时,false

您还可以使用自定义错误处理程序。

全是explained in the reference manual

相关问题