Сообщение всем подписчикам - PullRequest
0 голосов
/ 16 февраля 2019

Я использую служебную шину 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" я использую утилиту remaonAsync, чтобы не удалять сообщение, а для следующих получателей получит сообщение.Но я получил много сообщений с одинаковым содержанием в каждом экземпляре приложения.Если я использую метод completeAsync, сообщение будет удалено, и никто другой его не получит.

Реально ли отправлять сообщения всем подписчикам в теме без удаления и без дублирования?

1 Ответ

0 голосов
/ 16 февраля 2019

Ваш обработчик сообщений настроен на автоматическое заполнение входящих сообщений.Тем не менее, внутри метода обратного вызова сообщения не принимаются.Это означает, что они никогда не будут заполняться автоматически, а скорее доставляются столько раз, сколько настроено для MaxDeliveryCount подписки (при условии, что вы извлекаете сообщения из подписки).

Код обработчика должен не отказаться и либо позволить автозаполнению занять его место, либо, наоборот, отключить автозаполнение и вызвать .completeAsync() после завершения обработки входящего сообщения.

Кроме того, автоматическое обновлениеопределяется как 1 секунда.Это выключено.Это должно быть как минимум больше, чем LockDuration период или не указано вообще.

Реально ли отправлять сообщения всем подписчикам в теме без удаления и без дублирования?

Да.Вам не понадобится дедупликация, поскольку проблема не в том, что дубликаты отправлены , а в том, что дубликаты обрабатываются .

...