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>
相關文章
- 使用 VS Code 進行 Python 程式設計Python程式設計
- 快速使用 vscode 進行 Java 程式設計VSCodeJava程式設計
- 使用Cassandra進行.Net程式設計NY程式設計
- 使用Visual Studio Code進行MicroPython程式設計Python程式設計
- 使用Java 9 Flow進行響應式程式設計Java程式設計
- python教程:使用 async 和 await 協程進行併發程式設計PythonAI程式設計
- 在Javascript中進行面向切面程式設計JavaScript程式設計
- [java設計模式]單例設計模式,程式也要進行計劃生育。Java設計模式單例
- 利用awt與swing進行桌面程式設計(1)程式設計
- Python語法進階(1)- 程式與執行緒程式設計Python執行緒程式設計
- 使用VC++6.0 進行圖形介面設計部分控制程式碼的使用方法C++
- 【課程記錄】 使用vivado 2017.2的畫布進行 “視覺化” 程式設計視覺化程式設計
- 使用 Angular Universal 進行伺服器端渲染的防禦性程式設計思路Angular伺服器程式設計
- 《Node.js設計模式》使用流進行編碼Node.js設計模式
- shell程式設計進階程式設計
- 追求程式碼質量: 用 AOP 進行防禦性程式設計程式設計
- 使用面向 Aspect 的程式設計改進模組性程式設計
- 使用Java實現多執行緒程式設計Java執行緒程式設計
- 如何進行監控設計?
- 併發程式設計進階程式設計
- Java入門程式設計師必看:給陣列進行排序Java程式設計師陣列排序
- 在Kotlin中如何利用協程進行非同步程式設計Kotlin非同步程式設計
- java併發程式設計:執行緒池的使用Java程式設計執行緒
- 使用SAP CRM mock框架進行單元測試的設計Mock框架
- [譯] 四個理由讓你使用灰度色調進行設計
- 多執行緒程式設計基礎(一)-- 執行緒的使用執行緒程式設計
- OpenCV使用ParallelLoopBody進行平行計算OpenCVParallelOOP
- 程式設計師的進階之路程式設計師
- 乾貨 |如何優雅的在手機上進行Python程式設計Python程式設計
- C++ 用libcurl庫進行http通訊網路程式設計C++HTTP程式設計
- 多執行緒程式設計進階——Java類庫中的鎖執行緒程式設計Java
- Java程式設計師面試時,如何進行自我介紹呢?Java程式設計師面試
- Rust 程式設計影片教程(進階)——013 使用 Rc 引用計數智慧指標Rust程式設計指標
- (Python程式設計 | 系統程式設計 | 並行系統工具 | 程式退出)Python程式設計並行
- 【轉】1.1非同步程式設計:執行緒概述及使用非同步程式設計執行緒
- 二進位制 (小白進軍程式設計師)程式設計師
- 多執行緒程式設計基礎(二)-- 執行緒池的使用執行緒程式設計
- 使用TLA +進行分散式系統的建模與除錯設計分散式除錯
- python的tkinter程式設計(四)GUI介面裡面使用類進行開發,也就是自定義元件Python程式設計GUI元件