ZeroMQ學習:window下編譯zeromq-3.2.3和jzmq-master

最近發現公司項目中用的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目錄下,這樣程序就直接能夠引用了,編譯也成功了。

相關文章
相關標籤/搜索