zeromq/jzmq pub/sub發佈訂閱java代碼

引用:http://iyuan.iteye.com/blog/973013

這裏的發佈與訂閱角色是絕對的,即發佈者無法使用recv,訂閱者不能使用send,並且訂閱者需要設置訂閱條件"setsockopt"。 

按照官網的說法,在這種模式下很可能發佈者剛啓動時發佈的數據出現丟失,原因是用zmq發送速度太快,在訂閱者尚未與發佈者建立聯繫時,已經開始了數據發佈(內部局域網沒這麼誇張的)。官網給了兩個解決方案;1,發佈者sleep一會再發送數據(這個被標註成愚蠢的);2,(還沒有看到那,在後續中發現的話會更新這裏)。 


 上代碼:
發佈端:
package com.zeromq.test.Sync_pub_sub;
import org.zeromq.ZMQ;
import org.zeromq.ZMQ.Context;
import org.zeromq.ZMQ.Socket;

/**
 * @author 呂桂強
 * @email [email protected]
 * @version 創建時間:2012-4-26 下午8:17:40
 */
public class syncpub{
	//等待10個訂閱者
	protected static int SUBSCRIBERS_EXPECTED = 10;

	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();
	}
}

訂閱者:
package com.zeromq.test.Sync_pub_sub;

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

/**
 * @author 呂桂強
 * @email [email protected]
 * @version 創建時間:2012-4-26 下午8:36:42
 */
public class syncsub {
	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();
	}
}



發佈了111 篇原創文章 · 獲贊 349 · 訪問量 51萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章