2013-06-27 3 views
0

Я hv проверил несколько примеров, приведенных в руководстве ZMQ, но почему-то подписчик не получает сообщений в каких-либо. Вот код, который я пытаюсь проверить, но тщетно. Пожалуйста, исправьте это -ZeroMQ/JZMQ - Подписчик не получает сообщений

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

Я предполагаю, что вы используете две программы. Один для издателя, а другой для подписчика.

В этом случае вам нужно сначала запустить подписчика, а затем издателя.

Причина в том, что издатель является «огнем и забыл». Он не ждет, пока подписчики смогут подключиться. Это описано в руководстве в разделе Getting the Message Out как символ «медленного столяра».

+0

Спасибо! После запуска подписчика сначала он печатает первый символ «R», но не всю строку. Что-то не так в коде? – user2508012

+0

На самом деле я могу это разрешить. Кажется, это была ошибка в старой версии. Я обновил JAR-файл до jzmq-2.1.3.jar, и теперь он показывает ожидаемые результаты. Большое спасибо за вашу помощь!! – user2508012

1
  1. Сначала вы должны начать издавать.
  2. Тогда вы можете начать подписку.

    Не имеет значения, когда абонент подключается к издателю. Подписчик должен получить данные после подключения к издателю, и издатель публикует его.

    Обратится по следующей ссылке выборочных программ http://learning-0mq-with-pyzmq.readthedocs.org/en/latest/pyzmq/patterns/pubsub.html