我想处理AMQP消息,然后将其发送到另一个队列进行进一步处理。
我使用Spring集成DSL将其归档如下,
@Bean
public IntegrationFlow ocr(ConnectionFactory connectionFactory, AmqpTemplate amqpTemplate,
OCRService ocrService) {
return IntegrationFlows.from(Amqp.inboundGateway(connectionFactory, NOTE_INCOMING_QUEUE)
.concurrentConsumers(2))
.transform(new JsonToObjectTransformer(Note.class))
.handle(msg -> {
// doing ocr here
amqpTemplate.convertAndSend(NOTE_EXCHANGE, NOTE_OCRED_BINDING, note);
})
.get();
}
@Bean
public IntegrationFlow typeProcess(ConnectionFactory connectionFactory) {
return IntegrationFlows.from(Amqp.inboundGateway(connectionFactory, NOTE_OCRED_QUEUE)
.concurrentConsumers(4))
.transform(new JsonToObjectTransformer(Note.class))
.handle(msg -> {
// doing some work for type processing
}).get();
}
但是我发现当新消息在类型处理阶段处理时, NOTE_INCOMING_QUEUE 队列中的消息仍未被解除。请参见下面的rabbitmq management截图。
我想知道为什么即使处理程序已经成功执行, NOTE_INCOMING_QUEUE 中的消息仍然未被解包。是我的代码中弹簧集成amqp的设计还是错误的?
答案 0 :(得分:1)
使用Amqp.inboundAdapter()
代替网关 - 网关正在等待永远不会到达的回复。
网关用于请求/回复方案;通道适配器适用于单向场景。