给所有用户的讯息

时间:2019-02-16 15:08:10

标签: azure azureservicebus azure-servicebus-topics

我使用Azure服务总线,并希望向主题中的所有订阅者发送消息。客户的应用程序是用JavaFX编写的,为了处理,我使用下一个代码:

IMessageHandler messageHandler = new IMessageHandler() {


        // callback invoked when the message handler loop has obtained a message
        public CompletableFuture<Void> onMessageAsync(IMessage message) {
            String body = new String(message.getBody());
            System.out.println(body);
            decorator.showToastWithTitleAndBody("", body);
            return receiveClient.abandonAsync(message.getLockToken());
        }

        public void notifyException(Throwable throwable, ExceptionPhase exceptionPhase) {
            System.out.printf(exceptionPhase + "-" + throwable.getMessage());
        }
    };



    receiveClient.registerMessageHandler(
            messageHandler,
            // callback invoked when the message handler has an exception to report
            // 1 concurrent call, messages are auto-completed, auto-renew duration
            new MessageHandlerOptions(1, true, Duration.ofSeconds(1)));

在“ onMessageAsync”方法中,我使用abandonAsync不删除消息,下一次接收者将收到消息。但是我在每个应用程序实例中都收到了很多内容相同的消息。如果我使用completeAsync方法,消息将被删除,没有其他人将得到它。

将消息发送给主题中的所有订户而不删除并重复就真的吗?

1 个答案:

答案 0 :(得分:1)

您的消息处理程序配置为自动完成传入的消息。但是,在回调方法中,消息被放弃了。这意味着它们将永远不会自动完成,而是按照订阅的MaxDeliveryCount配置为重新发送多次(假设您正在从订阅中获取消息)。

不应该不要放弃处理程序代码,或者让自动完成取代它,或者禁用自动完成功能,并在处理完传入消息后立即调用.completeAsync()。< / p>

此外,自动更新被定义为1秒。没事了该时间至少应超过LockDuration个周期,或者完全不指定。

  

将消息发送给主题中的所有订户而不删除并重复就真的吗?

是的。您不需要重复数据删除,因为这不是重复发送的问题,而是重复的处理