Rabbitmq 将格式无效的Park XML消息发送到AMQP停车场队列

Rabbitmq 将格式无效的Park XML消息发送到AMQP停车场队列,rabbitmq,amqp,spring-amqp,spring-integration-dsl,spring-integration-amqp,Rabbitmq,Amqp,Spring Amqp,Spring Integration Dsl,Spring Integration Amqp,假设我有积分流 IntegrationFlows.from( Amqp.inboundAdapter(rabbitConnectionFactory,队列) .messageConverter(新编组messageConverter(xmlMarshaller)) .defaultRequeueRejected(false) .消费者(2) .maxConcurrentConsumers(4) .channeltransact(真) .errorHandler(新的ConditionalReje

假设我有积分流

IntegrationFlows.from(
Amqp.inboundAdapter(rabbitConnectionFactory,队列)
.messageConverter(新编组messageConverter(xmlMarshaller))
.defaultRequeueRejected(false)
.消费者(2)
.maxConcurrentConsumers(4)
.channeltransact(真)
.errorHandler(新的ConditionalRejectingErrorHandler())
)
.log(信息、AMQP\u记录器\u类别)
.publishSubscribeChannel(s->s)
.订阅(f->f
.手柄(死亡检查手柄)
.订阅(f->f.handle(服务))
)
.get();
其中
deathCheckHandler

@组件
公共类死亡检查处理程序{
私有静态最终记录器Logger=LoggerFactory.getLogger(lookup().lookupClass());
私有静态最终整数重试计数=3;
私人最终RabbitTemplate RabbitTemplate;
专用最终封送员xmlMarshaller;
公共死亡检查处理器(RabbitTemplate RabbitTemplate,Jaxb2Marshaller xmlMarshaller){
this.rabbitmplate=rabbitmplate;
this.xmlMarshaller=xmlMarshaller;
}
@服务激活器
公共无效检查(消息){
MessageHeaders=message.getHeaders();
可选拒绝=findAnyRejectedXDeathMessageHeader(Header);
如果(已拒绝.isPresent()){
int rejectedCount=rejected.get().getCount();
debug(“拒绝计数为{}”,拒绝计数);
如果(拒绝计数>重试计数){
停车信息(信息);
}
}
}
专用无效停车信息(信息信息){
对象负载=message.getPayload();
MessageHeaders=message.getHeaders();
String parkingExchange=(String)headers.get(“amqp_receivedExchange”);
String parkingRoutingKey=((String)headers.get(“amqp_consumerQueue”)).replace(“queue”,“plq”);
setMessageConverter(新的MarshallingMessageConverter(xmlMarshaller));
logger.warn(“尝试了{}次以上。驻车拒绝消息:{}到交换{}和路由键{}”,重试计数,有效负载,驻车交换,驻车路由键);
rabbitTemplate.convertAndSend(驻车交换、驻车路由键、有效载荷);
//使消息得到确认,而不是路由到DLQ
抛出新的ImmediateAcknowledgeAmqpException(“放弃重试消息:“+有效负载”);
}
}
DeathCheckHandler
处理AMQP队列上设置的死信

如何以不正确的格式存放XML消息,即当
MarshallingMessageConverter
抛出
UnmarshallingFailureException

我想以类似于在
DeathCheckHandler\parkMessage


使用
ConditionalRejectingErrorHandler
可能是可行的,但我不知道如何克隆
ConditionalRejectingErrorHandler

将此方法用作模板

@覆盖
公共无效句柄错误(可丢弃的t){
对数(t);
如果(!this.causechainsaradre(t)&这个例外策略是致命的(t)){
if(此.DiscardFatalWithxDeath&&t ListenerExecutionFailedException实例){
消息失败=((ListenerExecutionFailedException)t).getFailedMessage();
如果(失败!=null){
列表xDeath=失败。getMessageProperties().getXDeathHeader();
如果(xDeath!=null&&xDeath.size()>0){
this.logger.error(“在具有致命异常的消息上检测到x-death标头;”
+“可能是从DLQ重新获得的?-丢弃:+失败);
抛出新的ImmediateAcknowledgeAmqpException(“致命和x死亡存在”);
}
}
}
抛出新的AmqpRejectAndDontRequeueException(“错误处理程序已将异常转换为致命异常”),this.rejectManual,
t) );
}
}
默认情况下,带有x-death标头的致命异常将通过
ImmediateAcknowledgeAmqpException
丢弃

子类化和重写这个方法并不容易,因为字段是私有的,所以复制这个类(并在抛出IAAE之前发布到停车场)是最容易的

我将对此类进行一些改进,使其更易于自定义/重写