【发布时间】:2016-02-17 10:18:46
【问题描述】:
场景:
我们正在评估 ZeroMQ(特别是 jeroMq)的事件驱动机制。
应用程序是分布式的,其中多个服务(发布者和订阅者都是服务)可以存在于同一个 jvm 或不同节点中,这取决于部署架构。
观察
为了玩耍,我创建了一个 pub/sub 模式,使用 inproc: 作为传输方式,使用 jero mq(版本:0.3.5)
- 线程发布能够发布(貌似发布了,至少没有错误)
- 另一个线程中的订阅者没有收到任何东西。
问题
使用 inproc: 和 pub/sub 可行吗?
尝试了谷歌搜索,但找不到任何具体的信息或见解?
pub/sub 和 inproc: 的代码示例
使用 jero mq(版本:0.3.5)的 inproc pub sub 的工作代码示例对以后访问这篇文章的人很有用。一位发布者发布主题 A 和 B,两位订阅者分别接收 A 和 B
/**
* @param args
*/
public static void main(String[] args) {
// The single ZMQ instance
final Context context = ZMQ.context(1);
ExecutorService executorService = Executors.newFixedThreadPool(3);
//Publisher
executorService.execute(new Runnable() {
@Override
public void run() {
startPublishing(context);
}
});
//Subscriber for topic "A"
executorService.execute(new Runnable() {
@Override
public void run() {
startFirstSubscriber(context);
}
});
// Subscriber for topic "B"
executorService.execute(new Runnable() {
@Override
public void run() {
startSecondSubscriber(context);
}
});
}
/**
* Prepare the publisher and publish
*
* @param context
*/
private static void startPublishing(Context context) {
Socket publisher = context.socket(ZMQ.PUB);
publisher.bind("inproc://test");
while (!Thread.currentThread().isInterrupted()) {
// Write two messages, each with an envelope and content
try {
publisher.sendMore("A");
publisher.send("We don't want to see this");
LockSupport.parkNanos(1000);
publisher.sendMore("B");
publisher.send("We would like to see this");
} catch (Throwable e) {
e.printStackTrace();
}
}
publisher.close();
context.term();
}
/**
* Prepare and receive through the subscriber
*
* @param context
*/
private static void startFirstSubscriber(Context context) {
Socket subscriber = context.socket(ZMQ.SUB);
subscriber.connect("inproc://test");
subscriber.subscribe("B".getBytes());
while (!Thread.currentThread().isInterrupted()) {
// Read envelope with address
String address = subscriber.recvStr();
// Read message contents
String contents = subscriber.recvStr();
System.out.println("Subscriber1 " + address + " : " + contents);
}
subscriber.close();
context.term();
}
/**
* Prepare and receive though the subscriber
*
* @param context
*/
private static void startSecondSubscriber(Context context) {
// Prepare our context and subscriber
Socket subscriber = context.socket(ZMQ.SUB);
subscriber.connect("inproc://test");
subscriber.subscribe("A".getBytes());
while (!Thread.currentThread().isInterrupted()) {
// Read envelope with address
String address = subscriber.recvStr();
// Read message contents
String contents = subscriber.recvStr();
System.out.println("Subscriber2 " + address + " : " + contents);
}
subscriber.close();
context.term();
}
【问题讨论】:
-
添加场景示例代码以备参考
标签: java zeromq publish-subscribe event-driven-design jeromq