【9】JMicro微服务-发布订阅消息服务
如非授权,禁止用于商业用途,转载请注明出处
作者:mynewworldyyl
1. JMicro消息服务目前实现特性
a. JMicro只支持发布订阅消息服务,不支持队列式消息服务;
b. 不支持消息持久化,所以不能保证消息一定能被消费者消费;
c. 发布消息时如果没有消费者,消息直接丢弃;
d. 如果消息按配置的重发时间间隔重复发送多次(可配置)失败,消息直接丢弃;
e. 如果消息失败重发队列超过预先配置的数量,最先失败的消息会被直接丢弃,而新失败消息直接入失败队列排队等待重发;
f. 基于以上几点,如果要求绝对可靠的消息系统,而不是高性能的消息系统,不建议使用JMicro消息服务;
JMicro追求的是简单并且高性能,如果消费者服务是正常等待消息状态,那么消息肯定能高效从消息发送者直达消费者服务,如果消费者不在线,或出了问题无法消费消息,直接失败告诉使用者系统出了问题才应该是最佳的避免问题的方法。
一味地为了解决或支持次要的需求而增加系统的复杂度本身也会增加系统出问题的隐患,特别是复杂度达到一定程度后,很可能意味着软件的失败。
Do one thing and do it well! 微服务口号。
2. 启动消息服务
新打开一个新的CMD窗口,CD进入/jmicro.pubsub,运行
mvn clean install -Pbuild-main (只需构建一次,以后可以重复运行)
运行pubsub服务
java -jar target/jmicro.pubsub-0.0.1-SNAPSHOT-jar-with-dependencies.jar
如果启动时最后出现如下信息,说明pubsub没有启动,需要将/PubSubManager/enableServer的值从false,改为true

通过ZKUI修改方式如下图:

将enableServer的值从false改为true,然后重启服务即可,因为这个值是启动时就检测,只使用一次,即时生效是指:修改值后,之后的使用会使用新的值。
3. 开发消费者
/jmicro.example.provider/src/main/java/org/jmicro/example/pubsub/impl/SimplePubsubImpl.java
@Service(maxSpeed=-1,baseTimeUnit=Constants.TIME_SECONDS)
@Component
public class SimplePubsubImpl implements ISimplePubsub {
private final static Logger logger = LoggerFactory.getLogger(SimplePubsubImpl.class);
@Subscribe(topic="/jmicro/test/topic01")
public void helloTopic(PSData data) {
System.out.println("helloTopic: "+data.getTopic()+", data: "+ data.getData().toString());
}
@Subscribe(topic="/jmicro/test/topic01")
public void testTopic(PSData data) {
System.out.println("testTopic: "+data.getTopic()+", data: "+ data.getData().toString());
}
@Subscribe(topic=MonitorConstant.TEST_SERVICE_METHOD_TOPIC)
public void statis(PSData data) {
Map<Integer,Double> ps = (Map<Integer,Double>)data.getData();
logger.info("总请求:{}, 总响应:{}, TO:{}, TOF:{}, QPS:{}"
,ps.get(MonitorConstant.CLIENT_REQ_BEGIN)
,ps.get(MonitorConstant.STATIS_TOTAL_RESP)
,ps.get(MonitorConstant.CLIENT_REQ_TIMEOUT)
,ps.get(MonitorConstant.CLIENT_REQ_TIMEOUT_FAIL)
,ps.get(MonitorConstant.STATIS_QPS)
);
//System.out.println("Topic: "+data.getTopic()+", data: "+ data.getData().toString());
}
}
消息消费者也是一个RPC服务,由Component和Service注解实现类,不同点是方法不再由SMethod注解,而是由Subcribe注解,并增加topic属性,值是消息的主题。
方法唯一参数是org.jmicro.api.pubsub.PSData,代码如下
public final class PSData implements Serializable{
private static final long serialVersionUID = 389875668374730999L;
private Map<String,Object> context = new HashMap<>();
private byte flag = 0;
private String topic;
private Object data;
public byte getFlag() {
return flag;
}
public void setFlag(byte flag) {
this.flag = flag;
}
public String getTopic() {
return topic;
}
public void setTopic(String topic) {
this.topic = topic;
}
public Map<String, Object> getContext() {
return context;
}
public void setContext(Map<String, Object> context) {
this.context = context;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public void put(String key,Object v) {
this.context.put(key, v);
}
@SuppressWarnings("unchecked")
public <T> T get(String key) {
return (T) this.context.get(key);
}
}
data即是消息主体内容,可以是任意JMicro支持的参数类型,支持的参数类型后面会有专题小节详细说明,目前只需要知道:
a. Java 8种基本字据类型,字符串,java.util.Date,java.nio.ByteBuffer;
b. 由a组成的任意POJO类型;
c. 由a,b,c,d组成的任意数组类型,集合类型(LIST,SET);
d. Key为String类型,值为a,b,c,d组成的任意Map类型;
运行消费者
java -jar target/jmicro.example.provider-0.0.1-SNAPSHOT-jar-with-dependencies.jar
4. 消息生产者
public class TestPubSubServer extends JMicroBaseTestCase{
@Test
public void testPresurePublish() {
final Random ran = new Random();
PubSubManager psm = of.get(PubSubManager.class);
AtomicInteger id = new AtomicInteger(0);
Runnable r = ()->{
while(true) {
try {
//Thread.sleep(2000);
Thread.sleep(ran.nextInt(100));
psm.publish(new HashMap<String,Object>(), TOPIC,
"test pubsub server id: "+id.getAndIncrement());
} catch (Throwable e) {
System.out.println(e.getMessage());;
}
}
};
new Thread(r).start();
new Thread(r).start();
/*new Thread(r).start();
new Thread(r).start();
new Thread(r).start();*/
JMicro.waitForShutdown();
}
@Test
public void testPublishStringMessage() {
PubSubManager psm = of.get(PubSubManager.class);
psm.publish(new HashMap<String,Object>(), TOPIC, "test pubsub server");
JMicro.waitForShutdown();
}
}
这是一个基于JUnit4的单元测试类,继承自org.jmicro.test.JMicroBaseTestCase,消息发布通过org.jmicro.api.pubsub.PubSubManager的三个publish重载方法实现
PubSubManager psm = of.get(PubSubManager.class); psm.publish(new HashMap<String,Object>(), TOPIC, "test pubsub server");
of是JMicroBaseTestCase成员变量,IObjectFactory类型,系统启动就可使用,类似Spring容器,目前知道点就行。
PubSubManager也是系统预实例化的消息发送接口,从of拿来即用。
Eclipse或IDEA分别运行上面3个单元测试方法,查看消费者终端输出,消费端输出代码如下图:

testPublishStringMessage:发送一个简单字符串消息,消费端输出如下图:

testPresurePublish开启多个线程重复发送消息,用于消息服务系统做压力测试 ,消费端输出如下图:

【9】JMicro微服务-发布订阅消息服务的更多相关文章
- Kafka是分布式发布-订阅消息系统
Kafka是分布式发布-订阅消息系统 https://www.biaodianfu.com/kafka.html Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apa ...
- 分布式发布订阅消息系统 Kafka 架构设计[转]
分布式发布订阅消息系统 Kafka 架构设计 转自:http://www.oschina.net/translate/kafka-design 我们为什么要搭建该系统 Kafka是一个消息系统,原本开 ...
- Kafka(分布式发布-订阅消息系统)工作流程说明
Kafka系统架构Apache Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一种快速.可扩展的.设计内在就是分布式的,分区的和 ...
- kafka 基础知识梳理-kafka是一种高吞吐量的分布式发布订阅消息系统
一.kafka 简介 今社会各种应用系统诸如商业.社交.搜索.浏览等像信息工厂一样不断的生产出各种信息,在大数据时代,我们面临如下几个挑战: 如何收集这些巨大的信息 如何分析它 如何及时做到如上两点 ...
- (三)ActiveMQ之发布- 订阅消息模式实现
一.概念 发布者/订阅者模型支持向一个特定的消息主题发布消息.0或多个订阅者可能对接收来自特定消息主题的消息感兴趣.在这种模型下,发布者和订阅者彼此不知道对方.这种模式好比是匿名公告板.这种模式被概括 ...
- JMS发布/订阅消息传送例子
前言 基于上篇文章"基于Tomcat + JNDI + ActiveMQ实现JMS的点对点消息传送"很容易就可以编写一个发布/订阅消息传送例子,相关环境准备与该篇文章基本类似,主要 ...
- 高吞吐量的分布式发布订阅消息系统Kafka--安装及测试
一.Kafka概述 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因 ...
- 分布式发布订阅消息系统Kafka
高吞吐量的分布式发布订阅消息系统Kafka--安装及测试 一.Kafka概述 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览, ...
- Kafka logo分布式发布订阅消息系统 Kafka
分布式发布订阅消息系统 Kafka kafka是一种高吞吐量的分布式发布订阅消息系统,她有如下特性: 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳 ...
随机推荐
- 专2-第二课 Eclipse开发环境搭建
2.1下载Eclipse 2.2 安装C/C++版本的Eclipse 2.3 安装JDT插件开发Java程序 2.4 使用Eclipse开发驱动程序 既然安装了eclipse来进行驱动学习,那么我们就 ...
- JavaScript修改注册表
JavaScript修改注册表 2009-04-14 11:22:13| 分类: JS相关 | 标签: |字号大中小 订阅 注册表有关安全设置项的说明: 注册表路径: HKEY_CURRE ...
- 纯css手写圆角气泡对话框 微信小程序和web都适用
嗯……我们设计师强烈要求一定要圆角!圆角的气泡对话框,不要那种尖角的.这其中还遇上了个尴尬的问题,z-index不生效 无非就是两种方法,一种是使用图片再定位拼接起来使用,太简单了具体就不详细的说了. ...
- ST3 插件和技巧
Emmet插件: 快速生成HTML文档结构, 快速编写跨浏览器的CSS并自动帮助你同时编辑, 强大! 语法技巧 简单实用, 值得掌握! SideBar Enhancements插件: 改进了侧边栏, ...
- org.hibernate.HibernateException: /hibernate.cfg.xml not found等三个问题
初次配置hibernate在myeclipse上: 出现三个问题,怎么都不好使,比对代码,没有问题,查看路径还是没有问题: 1.org.hibernate.HibernateException: /h ...
- HDU 1716 排列2 (格式问题+排列)
题意:. 析:我们完全可以STL里面的函数next_permutation(),然后方便,又简单,这个题坑就是在格式上. 行末不能有空格,结尾不能有空行,不大好控制,必须控制好第一次数. 这个题本应该 ...
- python正则表达式转义注意事项
无论哪种语言,在使用正则表达式的时候都避免不了一个问题,就是在匹配元字符的时候,需要对元字符进行转义,让 正则表达式引擎将其当做普通字符来匹配.本文主要以python为例,说明一下转义中需要注意的问题 ...
- (小数化分数)小数化分数2 -- HDU --1717
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1717 举例: 0.24333333…………=(243-24)/900=73/3000.9545454…… ...
- c++ 内联函数 (讲解的TM真好)
1. 内联函数 在C++中我们通常定义以下函数来求两个整数的最大值: 复制代码 代码如下: int max(int a, int b) { return a > b ? a : b; } 为 ...
- ECG心电图数据2
1.如何下载获取MIT-BIH的数据从下面这个官方链接页面可以下载到所有48组MIT-BIH心电数据: http://www.physionet.org/physiobank/database/mit ...