Для клиента cometd дождитесь сообщения publi sh в очереди перед завершением работы - PullRequest
0 голосов
/ 19 июня 2020

Мы закрываем клиент cometd следующим образом. Есть ли способ обеспечить публикацию всех ожидающих событий? Иногда мы сталкиваемся с проблемой, когда некоторые события, отправленные непосредственно перед запуском выключения, теряются.

public void shutdown() {

        try {
            if (bayeuxClient != null) {
                bayeuxClient.getChannel(getChannelInfo()).unsubscribe();
                bayeuxClient.disconnect(10000L);
                bayeuxClient.waitFor(10000L, BayeuxClient.State.DISCONNECTED);
            }
            if (client != null) {
                client.stop();
            }
        } catch (Exception e) {
            log.warn(e.getMessage());
        } finally {
            client = null;
            bayeuxClient = null;
        }

    }

1 Ответ

0 голосов
/ 22 июня 2020

Если вы публикуете и отключаетесь от параллельных потоков, существует вероятность того, что отключение настигнет publi sh.

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

У вас есть следующие варианты:

Использовать пакетную обработку

Пакетная обработка обеспечивает порядок:

bayeuxClient.batch(() -> {
  // Last publish
  bayeuxClient.getChannel("/foo").publish("data");
  bayeuxClient.disconnect();
  // You can wait here.
  bayeuxClient.waitFor(10000L, BayeuxClient.State.DISCONNECTED);
});

Используйте MessageListener

Используйте прослушиватель сообщений из publish(), чтобы вы получали уведомление о том, когда последний sh publi завершен, а затем вы можете отключиться:

// Last publish
bayeuxClient.getChannel("/foo").publish("data", publishReply -> {
  // Do not wait inside CometD listeners.
  bayeuxClient.disconnect();
});
// Wait outside CometD listeners. 
bayeuxClient.waitFor(10000L, BayeuxClient.State.DISCONNECTED);
...