問題描述:
在之前的例子中我們沒有使用特別的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);如果這裏的訂閱主題換成其他的則是得不到消息的。
上述代碼結束有點問題,請忽略一下。