首页 > 解决方案 > 给所有订阅者的消息

问题描述

我使用 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”方法中,我使用放弃Async 不删除消息,并且下一个接收者将收到消息。但是我在每个应用程序实例中都收到了很多内容相同的消息。如果我使用 completeAsync 方法,消息将被删除,并且没有其他人会得到它。

在不删除和不重复的情况下向 Topic 中的所有订阅者发送消息是真的吗?

标签: azureazureservicebusazure-servicebus-topics

解决方案


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

处理程序代码不应放弃并让自动完成代替它,或者,禁用自动完成并.completeAsync()在处理程序处理完传入消息后调用。

此外,自动更新定义为 1 秒。那是关闭的。这应该至少比LockDurationperiod 长或根本没有指定。

在不删除和不重复的情况下向 Topic 中的所有订阅者发送消息是真的吗?

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


推荐阅读