【问题标题】:ZeroMQ (cppzmq) subscriber with filters which start with the same string具有以相同字符串开头的过滤器的 ZeroMQ (cppzmq) 订阅者
【发布时间】:2019-10-15 22:55:07
【问题描述】:

我在示例发布者中使用了两个主题。两者都以相同的字符串开头。当我仅使用两个主题之一过滤订阅者中的消息时,订阅者会收到两个主题

如果我使用两个不同的主题,它会起作用

我的示例发布者

try (ZContext context = new ZContext()) {
    final ZMQ.Socket socket = context.createSocket(SocketType.PUB);
    socket.bind("tcp://*:5555");
    int i = 0;
    while (!Thread.currentThread().isInterrupted() && !stopped) {

        logger.debug("sending C1 message");
        final String env = "topic";
        final String msg = "Hello, world #" + i++;
        socket.sendMore(env);
        socket.send(msg);

    logger.debug("sending C2 message");

        final String env2 = "topic2";
        final String msg2 = "Hello, world #" + i++;
        socket.sendMore(env2);
        socket.send(msg2);

        try {
            sleep(5000);
        } catch (final InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

还有我的示例订阅者:

zmq::context_t ctx;
zmq::socket_t sock(ctx, zmq::socket_type::sub);
sock.connect("tcp://127.0.0.1:5555");
std::string filter="topic";
sock.setsockopt(ZMQ_SUBSCRIBE,filter.c_str(),filter.length());
while(true) {
    zmq::message_t env;
    sock.recv(&env);
    std::string env_str = std::string(static_cast<char*>(env.data()), env.size());
    std::cout << "Received Enveloppe '" << env_str << "'" << std::endl;

    zmq::message_t msg;
    sock.recv(&msg);
    std::string msg_str = std::string(static_cast<char*>(msg.data()), msg.size());
    std::cout << "Received '" << msg_str << "'" << std::endl;
}

我的订阅者应该只显示与主题“主题”相关的消息,而不是同时显示两者。

【问题讨论】:

    标签: java c++ zeromq


    【解决方案1】:

    声明: “我的订阅者应该只显示与主题“主题”相关的消息,而不是同时显示两者。”

    不正确,恰恰相反。

    文档很清楚。 ZeroMQ API 明确声明:

    非空option_value订阅所有以指定前缀开头的消息。多个过滤器可以附加到单个 ZMQ_SUB 套接字,在这种情况下,如果一条消息与至少一个过滤器匹配,则应接受该消息。

    +-----------+---------------+
    |期权价值类型 |二进制数据 |
    +-----------+---------------+

    示例: 一条消息,在 PUB 端发送为:

    PUB.send( "123456------------" );
    

    将获得 .recv()-ed 在以下任一订阅 SUB-s:

    SUB.setsockopt( zmq.SUBSCRIBE, "" );      // this one .recv()-es EVERY message
    SUB.setsockopt( zmq.SUBSCRIBE, "1" );    //  this one .recv()-es "1{0+[*]}"
    SUB.setsockopt( zmq.SUBSCRIBE, "12" );  //   this one .recv()-es "12{0+[*]}"
    SUB.setsockopt( zmq.SUBSCRIBE, "123" );//    this one .recv()-es "123{0+[*]}"
    

    【讨论】:

    • 感谢您的回答。当我阅读文档时,我错过了一些东西。我必须仔细选择我的主题名称
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多