我使用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);
}
答案 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
。
您还可以使用自定义错误处理程序。