ZeroMQ:我希望Publish-Subscribe删除旧消息,而不是更新消息

时间:2014-09-19 19:19:49

标签: zeromq publish-subscribe

我正在使用ZeroMQ发布 - 订阅套接字来连接两个进程。发布过程是一个传感器,刷新率比订阅过程快得多。我希望订阅过程只使用队列中的最新消息 - 并完全忽略旧消息。

我尝试在订阅者身上设置一个高水位标记,但这似乎会删除较新的消息,而不是旧消息。

是否有人可以指示我出于此目的的发布 - 订阅模式?

2 个答案:

答案 0 :(得分:7)

阅读documentation on zeromq中的混淆功能(这是一种新的),我认为这正是你想要的。

来自文档:

  

ZMQ_CONFLATE:仅保留最后一条消息   如果设置,套接字应仅保留   在其入站/出站队列中有一条消息,此消息是最后一条消息   收到的消息/要发送的最后一条消息。忽略' ZMQ_RCVHWM'和   ' ZMQ_SNDHWM'选项。不支持多部分消息   特别是,它只有一部分保存在套接字内部队列中。

答案 1 :(得分:0)

好的,我找到了一个解决方案,但我不知道它是否是最好的解决方案 - 所以我还没有把它标记为正确。

zmq::message_t message;
int events = 0;
size_t events_size = sizeof(int);

// Priming read
subscriber.recv(&message);

// See if there are more messages to read
subscriber.getsockopt(ZMQ_EVENTS, static_cast<void*>(&events), &events_size);
while (events & ZMQ_POLLIN) {

  // Receive the new (and perhaps most recent) message
  subscriber.recv(&message);

  // Poll again for additional messages
  subscriber.getsockopt(ZMQ_EVENTS, static_cast<void*>(&events), &events_size);
}

// Now, message points to the most recent received data.

此策略的另一个优点是队列不应该填满。缺点是我的发布者可以发送比订阅者发送更快的发送,然后它将无限循环。

这似乎不太可能,但我想让它变得不可能。我还不太确定如何实现这一目标。