0

我检查了 ZMQ 指南中给出的几个示例,但由于某种原因,订阅者没有收到任何消息。这是我要测试的代码,但徒劳无功。请为此提出解决方案 -

public class SyncPubTest {

    protected static int SUBSCRIBERS_EXPECTED = 2;  

    public static void main (String[] args) {  
        Context context = ZMQ.context(1);  
        Socket publisher = context.socket(ZMQ.PUB);  
        publisher.bind("tcp://*:5561");  
        try {  
            //zmq??  
            Thread.sleep (1000);  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }    

        int update_nbr;  
        for (update_nbr = 0; update_nbr < 10; update_nbr++){  
            publisher.send("Rhubarb".getBytes(), ZMQ.NOBLOCK);  
        }  
        publisher.send("END".getBytes(), 0);  

       // publisher.close();  
        //context.term();  
    }  
}  

public class SyncSubTest {

    public static void main(String[] args) {  
        Context context = ZMQ.context(1);  
        Socket subscriber = context.socket(ZMQ.SUB);  
        subscriber.connect("tcp://localhost:5561");  
        subscriber.subscribe("".getBytes());  
        int update_nbr = 0;  
        while (true) {  
            byte[] stringValue = subscriber.recv(0);  
            String string = new String(stringValue);  
            if (string.equals("END")) {  
                break;  
            }  
            update_nbr++;  
            System.out.println("Received " + update_nbr + " updates. :" + string);  
        }  

        //subscriber.close();  
        //context.term();  
    }  
}  

For some reason, context.term()  hangs even all the sockets created in the context are closed.

请帮我解决这个问题。谢谢!!!

4

2 回答 2

4

我假设您正在运行两个程序。一个用于发布者,另一个用于订阅者。

在这种情况下,您需要先启动订阅者,然后再启动发布者。

原因是出版商是“一劳永逸”的。它不等待订阅者连接。这在获取消息部分的指南中被描述为“慢加入者”症状。

于 2013-06-27T13:19:23.370 回答
1
  1. 您必须先启动发布者。
  2. 然后你就可以启动订阅者了。

    订阅者何时连接到发布者并不重要。一旦订阅者连接到发布者并且发布者正在发布它,订阅者就必须获取数据。

    有关示例程序,请参阅以下链接 http://learning-0mq-with-pyzmq.readthedocs.org/en/latest/pyzmq/patterns/pubsub.html

于 2016-01-29T07:26:28.477 回答