对于 cometd 客户端,在关闭之前等待队列中的发布消息

For cometd client wait for publish message in queue before shutting down

提问人:user9482282 提问时间:6/19/2020 更新时间:6/22/2020 访问量:199

问:

我们以以下方式关闭 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;
        }

    }
爪哇 彗星 彗星

评论


答:

0赞 sbordet 6/22/2020 #1

如果要发布并断开与并发线程的连接,则断开连接可能会超过发布。

通常,此问题必须在应用程序级别解决,即应用程序应协调上次发布和断开连接。

您有以下选择:

使用批处理

批处理可确保订购:

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

使用 MessageListener

使用消息侦听器,以便在上次发布完成时收到通知,然后可以断开连接:publish()

// 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);