Apache camel Camel RaabitMQ确认

Apache camel Camel RaabitMQ确认,apache-camel,rabbitmq,Apache Camel,Rabbitmq,我正在为我的消息传递应用程序使用Camel。在我的用例中,我有一个生产者(这里是RabbitMQ),消费者是一个bean from("rabbitmq://127.0.0.1:5672/exDemo?queue=testQueue&username=guest&password=guest&autoAck=false&durable=true&exchangeType=direct&autoDelete=false")

我正在为我的消息传递应用程序使用Camel。在我的用例中,我有一个生产者(这里是RabbitMQ),消费者是一个bean

from("rabbitmq://127.0.0.1:5672/exDemo?queue=testQueue&username=guest&password=guest&autoAck=false&durable=true&exchangeType=direct&autoDelete=false")
                .throttle(100).timePeriodMillis(10000)
                .process(new Processor() {                              
                        @Override
                        public void process(Exchange exchange) throws Exception {
                            MyCustomConsumer.consume(exchange.getIn().getBody())
                        }
                    });
显然,如果autoAck为false,则在process()执行完成时发送确认(如果我在此处出错,请更正)


现在我不想确认process()的执行何时完成,我想在以后的阶段完成。我在MyCustomConsumer中有一个
BlockingQueue
,其中consume()正在放置消息,MyCustomConsumer有不同的机制来处理它们。我只想在MyCustomConsumer完成处理来自
BlockingQueue
的消息时确认消息。如何实现这一点?

你可以考虑使用CAMEL调用CuBeCube,一旦你从阻塞队列中处理消息。

< P>我碰到了同样的问题。

Camel RabbitMQConsumer.RabbitConsumer实现没有

consumer.getProcessor().process(exchange);

long deliveryTag = envelope.getDeliveryTag();
if (!consumer.endpoint.isAutoAck()) {
  log.trace("Acknowledging receipt [delivery_tag={}]", deliveryTag);
  channel.basicAck(deliveryTag, false);
}
所以它只是希望有一个同步处理器。 例如,如果将其绑定到seda路由,process方法将立即返回,您几乎回到了autoAck情况

我的理解是,我们需要制作自己的RabbitMQ组件来执行以下操作

consumer.getAsyncProcessor().process(exchange, new AsynCallback() {
  public void done(doneSync) {
    if (!consumer.endpoint.isAutoAck()) {
      long deliveryTag = envelope.getDeliveryTag();
      log.trace("Acknowledging receipt [delivery_tag={}]", deliveryTag);
      channel.basicAck(deliveryTag, false);
    }
  }
});
即使这样,“doneSync”参数的语义对我来说也不清楚。我认为这仅仅是一个标记,用来确定我们是在处理一个真正的异步处理器,还是一个自动包装成异步处理器的同步处理器

也许有人可以验证或使此解决方案无效

是否有更轻/更快/更强的替代方案


或者可以建议将其作为RabbitMQConsumer的默认实现吗?

感谢您为我指出异步处理器API。比如说,如果我的处理完成了,那么在这种情况下,我应该向谁明确发送确认?否则,如果我没有明确地发送确认,它将如何工作?我只是在新的2.14.x版本中检查了implem。它在处理错误和将基本对象发送回Rabbit方面做得更好,但在我看来它仍然是同步的:(我通过成批确认消息而不是单独确认每条消息来解决问题。@arry您能分享解决方案吗?在RabbitMQ使用者之后放置
阻塞队列
可能是个坏主意。如果与后面的使用者相比,从使用者到
阻塞队列
的路由是轻量级的,我RabbitMQ中的消息将很快被消耗,直到队列已满。您的消息存储在内存中,因此,如果您的进程死亡,它们将丢失。我还观察到,RabbitMQ消费程序在
BlockingQueue
中的一个块后暂停。即使
BlockingQueue
中的消费程序处理完所有消息后,剩余的g来自RabbitMQ的消息直到Camel上下文重新启动后才被使用。@StijnVanBael:同意当进程终止时,消息将丢失。但是不需要重新启动Camel上下文来处理剩余的消息;route将继续将消息传递到BlockingQueue。这也是我的想法。但实践证明并非如此。我观察到了网络流量。当队列阻塞时,驼峰消费者告诉代理等待。但它从未告诉代理恢复发送。我们没有这样做。可能是因为我们的用例。