最近發現公司項目中用的activemq隊列總出現這樣那樣的問題,可能沒有相關告訴解決,非常頭疼。做爲我的來講也很想尋找一款跨語言、高速的消息隊列「玩一玩」,發現zeromq比較知足這個要求。 java
因而在oschina中看到相關的介紹(http://www.oschina.net/p/0mq),到相關網站下載了最新版本3.2.3各類安裝包。首先安裝ZeroMQ-3.2.3~miru2.3-x86這個,發現裏面只有c接口,就目前來講可能不太符合我測試的要求,我首先須要的java接口的zeromq,在網上尋找了相關資料發現:zeromq (The ØMQ project) · GitHub 有不少語言支持包,須要下載後編譯,目前我下載的是jzmq-master,是個實現是jni方式,當時也有純java版的接口包,感興趣的朋友能夠試一試。 c++
其實最主要的問題是zeromq和jzmq-master在window下的編譯。最新版本的zeromq支持vs2010,恰好我機器上安裝vs2010,可是jzmq-master沒有,須要用vs2010打開後轉換一下工程。 git
編譯zeromq github
解壓zeromq.zip包,我存放的目錄是:E:\c_project\,打開vs2010,導入項目(項目目錄爲E:\c_project\zeromq-3.2.3\builds\msvc),而後編譯便可,若是沒有特殊修改會編譯出debug方式的庫,因爲jzmq-master編譯須要是release方式的庫,因此編譯zeromq時再修改一下release編譯相關庫,若是不出異常的話會在E:\c_project\zeromq-3.2.3\lib\Win32目錄中編譯出libzmq、libzmq_d等文件,在E:\c_project\zeromq-3.2.3\bin\Win32目錄中會編譯出libzmq.dll等文件(注意libzmq.dll這個文件在java實現的時候須要導入,我在作這個過程當中因爲不知道,耽誤了半天時間怎麼也搞不明白,後來通過depends.exe分析動態庫依賴關係工具才知道須要這個庫,後來拷貝出來java代碼測試經過) eclipse
編譯jzmq-master socket
解壓jzmq-master到E:\c_project\jzmq-master目錄,vs2010導入jzmq-master項目,因爲最新的不支持vs2010,因此項目會提示轉換,咱們只須要肯定轉換就能夠。因爲須要編譯jni接口,因此在vs2010中的項目須要進行如下設置: tcp
一、打開屬性頁,點擊vc++目錄 工具
二、選擇包含目錄,編輯添加如下三項:E:\c_project\zeromq-3.2.3\include(zeromq的頭文件),C:\Java\jdk1.6.0_43\include和C:\Java\jdk1.6.0_43\include\win32(java的頭文件) 測試
三、選擇引用目錄,編輯添加E:\c_project\zeromq-3.2.3\lib\Win32一項(增長相關庫鏈接) 網站
四、選擇庫目錄,編輯添加E:\c_project\zeromq-3.2.3\lib\Win32(增長相關庫鏈接)
而後就能夠編譯了,正常的話會編譯出E:\c_project\jzmq-master\lib目錄下的jzmq.dll和zmq.jar文件。
對zeromq的java接口測試
打開myeclipse或者eclipse,新建工程,將zmq.jar添加到工程,寫測試程序。直接上代碼:
客戶端:
import org.zeromq.ZMQ;
public class zeromqclient {
/**
* @param args
*/
public static void main(String[] args) {
ZMQ.Context context = ZMQ.context(1);
ZMQ.Socket socket = context.socket(ZMQ.REQ);
socket.connect("tcp://localhost:5555");
socket.setReceiveTimeOut(60000);
for (int request_nbr = 0; request_nbr <= 1000; request_nbr++) {
try{
// 建立一個末尾爲0的字符串
String requestString = "Hello" + " ";
byte[] request = requestString.getBytes();
request[request.length - 1] = 0;
// 發送
socket.send(request, ZMQ.NOBLOCK);
// 得到返回值
byte[] reply = socket.recv(0);
if(reply!=null)
// 輸出去掉末尾0的字符串
System.out.println("Received reply " + request_nbr + ": [" + new String(reply, 0, reply.length - 1) + "]");
}catch(Exception e){
socket.close();
e.printStackTrace();
try {
Thread.sleep(10000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
socket = context.socket(ZMQ.REQ);
socket.connect("tcp://localhost:5555");
socket.setReceiveTimeOut(2000);
}
}
}
}
服務端:
import org.zeromq.ZMQ; public class zeromqserver { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //System.load("C:/WINDOWS/system32/libzmq"); //System.load("C:/WINDOWS/system32/jzmq.dll"); // System.load(System.getProperty("user.dir")+"/lib/MFC42D.dll"); // System.load(System.getProperty("user.dir")+"/lib/getcpu.dll"); ZMQ.Context context = ZMQ.context(3); ZMQ.Socket socket = context.socket(ZMQ.REP); socket.bind("tcp://*:5555"); //socket.send("ddd".getBytes(), ZMQ.NOBLOCK); System.out.println(System.currentTimeMillis()); while (true) { byte[] request; // 等待下一個client端的請求 // 等待一個以0結尾的字符串 // 忽略最後一位的0打印 request = socket.recv(0); String hello = new String(request, 0, request.length - 1); if(hello.equals("Hello")) System.out.println("Received request: [" + hello + "]"); else System.out.println("Received request: [ fuck ]"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // 返回一個最後一位爲0的字符串到客戶端 String replyString = "World" + " "; byte[] reply = replyString.getBytes(); reply[reply.length - 1] = 0; socket.send(reply, ZMQ.NOBLOCK); } } } 這裏須要注意的就是libzmq.dll文件,若是這個文件找不到就會報錯:找不到相關的庫,因爲開始不知道,因此我用庫依賴工具查找出來後將jzmq.dll和libzmq.dll文件放到了C:\Java\jdk1.6.0_43\bin目錄下,這樣程序就直接能夠引用了,編譯也成功了。