提问人:user9482282 提问时间:6/19/2020 更新时间:6/22/2020 访问量:199
对于 cometd 客户端,在关闭之前等待队列中的发布消息
For cometd client wait for publish message in queue before shutting down
问:
我们以以下方式关闭 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);
评论