ZeroMQ–使用jzmq進行程式設計
一、環境搭建
wget http://download.zeromq.org/zeromq-2.1.7.tar.gz
tar -xzf zeromq-2.1.7.tar.gz
cd zeromq-2.1.7
./configure
make
sudo make install
git clone https://github.com/nathanmarz/jzmq.git
cd jzmq
./autogen.sh
./configure
make
sudo make install
如果沒有安裝libtool、libuuid-devel則需要先安裝,否則安裝失敗
yum install libtool
yum install libuuid-devel
常見問題:
出現java.lang.UnsatisfiedLinkError: /usr/local/lib/libjzmq.so.0.0.0: libzmq.so.1: cannot open shared object file: No such file or directory異常
原因是未找到zmq動態連結庫。
解決方法1:export LD_LIBRARY_PATH=/usr/local/lib
解決方法2:編輯/etc/ld.so.conf檔案,增加一行:/usr/local/lib。再執行sudo ldconfig命令
Exception in thread “main” java.lang.UnsatisfiedLinkError: no jzmq in java.library.path
未設定native library
在eclipse設定native library為/usr/local/lib
或在jvm增加引數
-Djava.library.path=/usr/local/lib
或在啟動指令碼中增加
java -Djava.library.path=/usr/local/lib
二、使用jzmq進行程式設計
1.建立maven專案,pom.xml的內容參見pom.xml
注意:jzmq的版本不能太高,建議使用2.1.0,目前storm也是使用這個版本的jzmq-2.1.0.jar
否則報: java.lang.UnsatisfiedLinkError: org.zeromq.ZMQ$Socket.nativeInit()V
2.編寫Publisher.java,Subscriber.java,參見原始碼
Publisher.java
package com.catt.mqtest.pubsub;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.zeromq.ZMQ;
import org.zeromq.ZMQ.Context;
import org.zeromq.ZMQ.Socket;
public class Publisher {
// 等待10個訂閱者
private static final int SUBSCRIBERS_EXPECTED = 10;
// 定義一個全域性的記錄器,通過LoggerFactory獲取
private final static Logger log = LoggerFactory.getLogger(Publisher.class);
public static void main(String[] args) throws InterruptedException{
Context context = ZMQ.context(1);
Socket publisher = context.socket(ZMQ.PUB);
publisher.bind("tcp://*:5557");
try {
// zmq傳送速度太快,在訂閱者尚未與釋出者建立聯絡時,已經開始了資料釋出
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
publisher.send("send start......".getBytes(), 0);
for (int i = 0; i < 10; i++) {
publisher.send(("Hello world "+i).getBytes(), ZMQ.NOBLOCK);
}
publisher.send("send end......".getBytes(), 0);
publisher.close();
context.term();
}
}
Subscriber.java
package com.catt.mqtest.pubsub;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.zeromq.ZMQ;
import org.zeromq.ZMQ.Context;
import org.zeromq.ZMQ.Socket;
public class Subscriber {
// 定義一個全域性的記錄器,通過LoggerFactory獲取
private final static Logger log = LoggerFactory.getLogger(Subscriber.class);
public static void main(String[] args) {
Context context = ZMQ.context(1);
Socket subscriber = context.socket(ZMQ.SUB);
subscriber.connect("tcp://192.168.230.128:5557");
subscriber.subscribe("".getBytes());
int total = 0;
while (true) {
byte[] stringValue = subscriber.recv(0);
String string = new String(stringValue);
if (string.equals("send end......")) {
break;
}
total++;
System.out.println("Received " + total + " updates. :" + string);
}
subscriber.close();
context.term();
}
}
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.catt</groupId>
<artifactId>mqtest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mqtest</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.zeromq</groupId>
<artifactId>jzmq</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
相關文章
- 使用Cassandra進行.Net程式設計NY程式設計
- 使用 VS Code 進行 Python 程式設計Python程式設計
- 使用Python進行併發程式設計Python程式設計
- 快速使用 vscode 進行 Java 程式設計VSCodeJava程式設計
- 使用 Go 進行 iOS 和 Android 程式設計GoiOSAndroid程式設計
- 使用Java 9 Flow進行響應式程式設計Java程式設計
- 使用 JavaScript 進行函數語言程式設計 (一)JavaScript函數程式設計
- 使用Visual Studio Code進行MicroPython程式設計Python程式設計
- javascript函數語言程式設計: 優雅的使用underscore進行函式程式設計JavaScript函數程式設計函式
- [轉載]使用BackgroundWorker元件進行非同步操作程式設計元件非同步程式設計
- 使用node.js 進行伺服器端JavaScript程式設計Node.js伺服器JavaScript程式設計
- 使用Java 7.0的 Fork/Join框架進行併發程式設計Java框架程式設計
- 使用Python玩轉WMI進行Win32api/com進行Windows程式設計開發PythonWin32APIWindows程式設計
- 在Javascript中進行面向切面程式設計JavaScript程式設計
- [java設計模式]單例設計模式,程式也要進行計劃生育。Java設計模式單例
- 使用blueZ進行藍芽程式設計時需要注意的問題藍芽程式設計
- 使用C#進行Outlook 2003程式設計的簡介C#程式設計
- 使用tornado的coroutine進行程式設計行程程式設計
- 在 Oracle JDeveloper 中進行 Ajax 程式設計(轉)OracleDeveloper程式設計
- Linux 串列埠程式設計 使用termios與API進行串列埠程式開發Linux串列埠程式設計iOSAPI
- 使用pthread庫進行多執行緒程式設計1 - UNIX環境高階程式設計第11章讀書筆記thread執行緒程式設計筆記
- 使用pthread庫進行多執行緒程式設計2 - UNIX高階環境程式設計第12章讀書筆記thread執行緒程式設計筆記
- python教程:使用 async 和 await 協程進行併發程式設計PythonAI程式設計
- 使用面向 Aspect 的程式設計改進模組性程式設計
- ZeroMQ 3.2.2 XP下無法執行MQ
- 使用VC++6.0 進行圖形介面設計部分控制程式碼的使用方法C++
- 利用awt與swing進行桌面程式設計(1)程式設計
- 程式設計師必須進行的10項投資程式設計師
- Java多執行緒程式設計——進階篇一Java執行緒程式設計
- Java多執行緒程式設計——進階篇二Java執行緒程式設計
- 用Delphi進行OpenGL程式設計學習心得 (轉)程式設計
- 《Node.js設計模式》使用流進行編碼Node.js設計模式
- 使用 RAM 富客戶端進行資產工程設計客戶端
- 使用 Angular Universal 進行伺服器端渲染的防禦性程式設計思路Angular伺服器程式設計
- 使用 Override 和 New 關鍵字進行版本控制(C# 程式設計指南)IDEC#程式設計
- shell程式設計進階程式設計
- 追求程式碼質量: 用 AOP 進行防禦性程式設計程式設計
- Python語法進階(1)- 程式與執行緒程式設計Python執行緒程式設計