如何在骆驼路线中手动确认/取消发布消息

时间:2019-09-01 22:10:05

标签: apache-camel google-cloud-pubsub

我正在使用ackMode = NONE设置骆驼路线,这意味着不会自动进行确认。如何明确确认路由中的消息?

在我的骆驼路线定义中,我已将ackMode设置为NONE。根据文档,我应该能够手动确认下游消息:

https://github.com/apache/camel/blob/master/components/camel-google-pubsub/src/main/docs/google-pubsub-component.adoc

“ AUTO =交换在完成时被确认/不确认。NONE =下游进程必须明确确认/不确认”

但是我不知道如何发送确认。

from("google-pubsub:<project>:<subscription>?concurrentConsumers=1&maxMessagesPerPoll=1&ackMode=NONE")
                .bean("processingBean");

我的PubSub订阅的确认截止日期为10秒,因此由于ackMode = NONE,我的消息每10秒不断发送一次。这是预期的。但是,我无法找到一种方法来在处理完成后手动确认消息并停止重新发送。

2 个答案:

答案 0 :(得分:0)

我认为最好看看Camel组件如何使用ackMode=AUTO来实现。拥有look at this class(方法acknowledge

但是您为什么要做这项额外的工作?迷上Camel是为了通过抽象掉底层代码来简化集成。

因此,当您使用 ackMode=AUTO 时,骆驼自动提交成功处理的邮件(当邮件成功通过整个路径时)并回滚您无法处理的邮件

答案 1 :(得分:0)

我能够深入研究Camel组件并弄清楚它是如何完成的。首先,我创建了一个GooglePubSubConnectionFactory bean:

@Bean
    public GooglePubsubConnectionFactory googlePubsubConnectionFactory() {
        GooglePubsubConnectionFactory connectionFactory = new GooglePubsubConnectionFactory();
        connectionFactory.setCredentialsFileLocation(pubsubKey);
        return connectionFactory;
    }

然后我能够从标题中引用消息的确认ID:

@Header(GooglePubsubConstants.ACK_ID) String ackId

然后我使用以下代码来确认该消息:

List<String > ackIdList = new ArrayList<>();
        ackIdList.add(ackId);
        AcknowledgeRequest ackRequest = new AcknowledgeRequest().setAckIds(ackIdList);
        Pubsub pubsub = googlePubsubConnectionFactory.getDefaultClient();
        pubsub.projects().subscriptions().acknowledge("projects/<my project>/subscriptions/<my subscription>", ackRequest).execute();