zeromq PUB-SUB模式中的信封問題

問題描述:

       在之前的例子中我們沒有使用特別的TOPIC來區分,這次我們對發佈的消息進行TOPIC區分,但是發現這個TOPIC不能存在一個相似度,看如下代碼:

package com.guo.server;

import org.zeromq.ZMQ;
import org.zeromq.ZMQ.Context;
import org.zeromq.ZMQ.Socket;

public class Publisher {

   public void start(){
       System.out.println("===========publisher start=============");
       Context context = ZMQ.context(1);
       Socket socket = context.socket(ZMQ.PUB);
       socket.setLinger(5000);
       socket.setSndHWM(0);
       socket.bind("tcp://192.168.124.130:6666");
       try {
           Thread.sleep(10000);
       } catch (InterruptedException e) {
       }
       for(int i=0;i<10;i++){
           String pubstr ="WORK task"+i;
           socket.sendMore("NEWS");
           socket.send(pubstr);
           socket.sendMore("NEWSONE");
           socket.send("can not receive");
           try {
               Thread.sleep(1000);
           } catch (InterruptedException e) {
           }
       }
       socket.send("END", 0);
       System.out.println("===========publisher end=============");
       socket.close();
       context.term();
   }

}

這裏發佈了2個TOPIC,然而訂閱端做了一個訂閱

package com.guo.client;

import org.zeromq.ZMQ;
import org.zeromq.ZMQ.Context;
import org.zeromq.ZMQ.Socket;

public class Subscriber {

   public void start(){
       System.out.println("===========subscriber start=============");
       Context context = ZMQ.context(1);
       Socket socket = context.socket(ZMQ.SUB);
       socket.connect("tcp://192.168.124.130:6666");
       socket.subscribe("NEWS".getBytes());
       while(true){
           byte[] top =socket.recv(0);
           String topStr = new String(top);
           byte[] res =socket.recv(0);
           String resStr = new String(res);
           System.out.println("substring is ="+topStr+" "+resStr);
           if("END".equalsIgnoreCase(resStr)){
               break;
           }
       }
       System.out.println("===========subscriber end=============");
       socket.close();
       context.term();
   }

}

結果是兩個主題都有消息接收。如果將發佈的代碼調整爲:

           socket.sendMore("NEWS");
           socket.send(pubstr);
           socket.sendMore("ONE");

這樣訂閱端可以正常使用。經測試個人認爲這是使用正則造成的一個小的BUG,問題待日後求證。

這裏如果發佈端採用單一的發送方式:socket.send(pubstr);則在訂閱端我們可以通過訂閱WORK主題來得到完整的消息:socket.subscribe("WORK".getBytes());byte[] res =socket.recv(0);如果這裏的訂閱主題換成其他的則是得不到消息的。


上述代碼結束有點問題,請忽略一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章