如何在Apache Camel中使事件驱动的使用者删除消耗的消息?

时间:2014-08-08 10:32:25

标签: java apache-camel activemq

我有一个休息服务,它将消息发送到我的队列,然后将这些消息路由到文件:

from("test-jms:queue:test.queue").to("file://test");

此外,我在端点上有一个事件驱动的使用者。现在,只有在消息消耗时才会写入日志:

final Consumer consumer = endpoint.createConsumer(new Processor() {
        @Override
        public void process(Exchange exchange) throws Exception {
            String message = exchange.getIn().getBody(String.class);

            LOG.info("Message processed: " + message);
        }
    });

这一切都很好。在/test文件夹中,我收到的每封邮件都有一个新文件,另外消费者创建了一个附加.camelLock的标记文件。使用readLock=none选项可以防止使用者按预期生成这些标记文件。

但是,消费后消息文件和标记文件都不会被删除。我可能在我的消费者实施中遗漏了一些东西吗?

2 个答案:

答案 0 :(得分:4)

当您手动创建具有内联处理器的消费者时,您需要在完成触发删除/移动文件等工作时手动完成Exchange的UoW。

exchange.getUnitOfWork().done(exchange);

您也可以尝试使用应该为您完成UnitOfWork的UnitOfWorkProducer包装处理器。

答案 1 :(得分:3)

正如Claus Ibsen指出的那样,这里的关键是完成UnitOfWork(UoW)。现在,我的事件驱动型消费者看起来像这样:

final Consumer consumer = endpoint.createConsumer(new Processor() {
    @Override
    public void process(Exchange exchange) throws Exception {
        String message = exchange.getIn().getBody(String.class);

        LOG.info("Message processed: " + message);

        ConsumerTemplate consumerTemplate = camelContext.createConsumerTemplate();
        consumerTemplate.doneUoW(exchange);
    }
});

此外,创建端点时必须使用delete=true选项:

Endpoint endpoint = camelContext.getEndpoint("file://test?delete=true");