我有以下 PHP 应用程序。将用户注册发布到消息队列。 Java 应用程序从该队列中读取并导入它。希望下图能够描述它。我只处理 Java 方面的事情。 json 消息已经存在于队列中。
路由(Java 消费端)。
@Component
public class SignUpRouting {
errorHandler(deadLetterChannel("rabbitmq://signUpDeadLetter.exchange?username=etc..").useOriginalMessage());
from("rabbitmq://phpSignUp.exchange?username=etc....")
.routeId("signUpRoute")
.processRef("signUpProcessor")
.end();
//....
处理器..
@Component
public class SignupProcessor implements Processor {
private ObjectMapper mapper = new ObjectMapper();
@Override
public void process(Exchange exchange) throws Exception {
String json = exchange.getIn().getBody(String.class);
SignUpDto dto = mapper.readValue(json, SignUpDto.class);
SignUp signUp = new SignUp();
signUp.setWhatever(dto.getWhatever());
//etc....
// save record
signUpDao.save(signUp);
}
}
My question is this.. What should I do I do when the Processor fails to import the message.
例如,假设有一个 DAO 异常。数据字段可能太长或导入的格式不正确。我不想丢失消息。我想查看错误并重试导入。但我不想每 30 秒重试一次消息。
我在想我需要创建另一个队列..一个死信队列并且每 6 小时无限期地重试消息吗?..然后我会查看日志看到错误并上传修复并且消息会被再加工?
我将如何实现?还是我走错了路?
EDIT I have tried setting deadLetterExchange to see if would get things on the right direction... However it errors and says queue cannot be non null
rabbitmq://phpSignUp.exchange?username=etc...&deadLetterExchange=signUpDeadLetter.exchange
最佳答案
下面是一个使用死信头的例子:
<from uri="rabbitmq://localhost/youexchange?queue=yourq1&
exchangeType=topic&
routingKey=user.reg.*&
deadLetterExchange=dead.msgs&
deadLetterExchangeType=topic&
deadLetterRoutingKey=dead.letters&
deadLetterQueue=dead.letters&
autoAck=false&
autoDelete=false"/>
<!--We can use onException to make camel to retry, and after that, dead letter queue are the fallback-->
<onException useOriginalMessage="true">
<exception>java.lang.Exception</exception>
<redeliveryPolicy asyncDelayedRedelivery="true" maximumRedeliveries="3" redeliveryDelay="5000"/>
</onException>
我们需要关闭autoAck并设置deadLetterQueue,这样如果有异常抛出,消息就会进入死信队列。 使用onException,我们可以控制camel将消息丢弃到死信队列之前的重试。
关于java - RabbitMQ - Apache Camel Reading Messages 如何处理失败的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33190592/