我正在使用ZeroMQ发布 - 订阅套接字来连接两个进程。发布过程是一个传感器,刷新率比订阅过程快得多。我希望订阅过程只使用队列中的最新消息 - 并完全忽略旧消息。
我尝试在订阅者身上设置一个高水位标记,但这似乎会删除较新的消息,而不是旧消息。
是否有人可以指示我出于此目的的发布 - 订阅模式?
答案 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.
此策略的另一个优点是队列不应该填满。缺点是我的发布者可以发送比订阅者发送更快的发送,然后它将无限循环。
这似乎不太可能,但我想让它变得不可能。我还不太确定如何实现这一目标。