如非授权,禁止用于商业用途,转载请注明出处
作者: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

  1. @Service(maxSpeed=-1,baseTimeUnit=Constants.TIME_SECONDS)
  2. @Component
  3. public class SimplePubsubImpl implements ISimplePubsub {
  4.  
  5. private final static Logger logger = LoggerFactory.getLogger(SimplePubsubImpl.class);
  6.  
  7. @Subscribe(topic="/jmicro/test/topic01")
  8. public void helloTopic(PSData data) {
  9. System.out.println("helloTopic: "+data.getTopic()+", data: "+ data.getData().toString());
  10. }
  11.  
  12. @Subscribe(topic="/jmicro/test/topic01")
  13. public void testTopic(PSData data) {
  14. System.out.println("testTopic: "+data.getTopic()+", data: "+ data.getData().toString());
  15. }
  16.  
  17. @Subscribe(topic=MonitorConstant.TEST_SERVICE_METHOD_TOPIC)
  18. public void statis(PSData data) {
  19.  
  20. Map<Integer,Double> ps = (Map<Integer,Double>)data.getData();
  21.  
  22. logger.info("总请求:{}, 总响应:{}, TO:{}, TOF:{}, QPS:{}"
  23. ,ps.get(MonitorConstant.CLIENT_REQ_BEGIN)
  24. ,ps.get(MonitorConstant.STATIS_TOTAL_RESP)
  25. ,ps.get(MonitorConstant.CLIENT_REQ_TIMEOUT)
  26. ,ps.get(MonitorConstant.CLIENT_REQ_TIMEOUT_FAIL)
  27. ,ps.get(MonitorConstant.STATIS_QPS)
  28. );
  29.  
  30. //System.out.println("Topic: "+data.getTopic()+", data: "+ data.getData().toString());
  31. }
  32.  
  33. }

消息消费者也是一个RPC服务,由Component和Service注解实现类,不同点是方法不再由SMethod注解,而是由Subcribe注解,并增加topic属性,值是消息的主题。

方法唯一参数是org.jmicro.api.pubsub.PSData,代码如下

  1. public final class PSData implements Serializable{
  2.  
  3. private static final long serialVersionUID = 389875668374730999L;
  4.  
  5. private Map<String,Object> context = new HashMap<>();
  6.  
  7. private byte flag = 0;
  8.  
  9. private String topic;
  10.  
  11. private Object data;
  12.  
  13. public byte getFlag() {
  14. return flag;
  15. }
  16.  
  17. public void setFlag(byte flag) {
  18. this.flag = flag;
  19. }
  20.  
  21. public String getTopic() {
  22. return topic;
  23. }
  24.  
  25. public void setTopic(String topic) {
  26. this.topic = topic;
  27. }
  28.  
  29. public Map<String, Object> getContext() {
  30. return context;
  31. }
  32.  
  33. public void setContext(Map<String, Object> context) {
  34. this.context = context;
  35. }
  36.  
  37. public Object getData() {
  38. return data;
  39. }
  40.  
  41. public void setData(Object data) {
  42. this.data = data;
  43. }
  44.  
  45. public void put(String key,Object v) {
  46. this.context.put(key, v);
  47. }
  48.  
  49. @SuppressWarnings("unchecked")
  50. public <T> T get(String key) {
  51. return (T) this.context.get(key);
  52. }
  53. }

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. 消息生产者

  1. public class TestPubSubServer extends JMicroBaseTestCase{
  2.  
  3. @Test
  4. public void testPresurePublish() {
  5.  
  6. final Random ran = new Random();
  7.  
  8. PubSubManager psm = of.get(PubSubManager.class);
  9.  
  10. AtomicInteger id = new AtomicInteger(0);
  11.  
  12. Runnable r = ()->{
  13. while(true) {
  14. try {
  15. //Thread.sleep(2000);
  16. Thread.sleep(ran.nextInt(100));
  17. psm.publish(new HashMap<String,Object>(), TOPIC,
  18. "test pubsub server id: "+id.getAndIncrement());
  19. } catch (Throwable e) {
  20. System.out.println(e.getMessage());;
  21. }
  22. }
  23. };
  24.  
  25. new Thread(r).start();
  26. new Thread(r).start();
  27. /*new Thread(r).start();
  28. new Thread(r).start();
  29. new Thread(r).start();*/
  30.  
  31. JMicro.waitForShutdown();
  32. }
  33.  
  34. @Test
  35. public void testPublishStringMessage() {
  36. PubSubManager psm = of.get(PubSubManager.class);
  37. psm.publish(new HashMap<String,Object>(), TOPIC, "test pubsub server");
  38. JMicro.waitForShutdown();
  39. }
  40. }

这是一个基于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开启多个线程重复发送消息,用于消息服务系统做压力测试 ,消费端输出如下图:

  1.  

【9】JMicro微服务-发布订阅消息服务的更多相关文章

  1. Kafka是分布式发布-订阅消息系统

    Kafka是分布式发布-订阅消息系统 https://www.biaodianfu.com/kafka.html Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apa ...

  2. 分布式发布订阅消息系统 Kafka 架构设计[转]

    分布式发布订阅消息系统 Kafka 架构设计 转自:http://www.oschina.net/translate/kafka-design 我们为什么要搭建该系统 Kafka是一个消息系统,原本开 ...

  3. Kafka(分布式发布-订阅消息系统)工作流程说明

    Kafka系统架构Apache Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一种快速.可扩展的.设计内在就是分布式的,分区的和 ...

  4. kafka 基础知识梳理-kafka是一种高吞吐量的分布式发布订阅消息系统

    一.kafka 简介 今社会各种应用系统诸如商业.社交.搜索.浏览等像信息工厂一样不断的生产出各种信息,在大数据时代,我们面临如下几个挑战: 如何收集这些巨大的信息 如何分析它 如何及时做到如上两点 ...

  5. (三)ActiveMQ之发布- 订阅消息模式实现

    一.概念 发布者/订阅者模型支持向一个特定的消息主题发布消息.0或多个订阅者可能对接收来自特定消息主题的消息感兴趣.在这种模型下,发布者和订阅者彼此不知道对方.这种模式好比是匿名公告板.这种模式被概括 ...

  6. JMS发布/订阅消息传送例子

    前言 基于上篇文章"基于Tomcat + JNDI + ActiveMQ实现JMS的点对点消息传送"很容易就可以编写一个发布/订阅消息传送例子,相关环境准备与该篇文章基本类似,主要 ...

  7. 高吞吐量的分布式发布订阅消息系统Kafka--安装及测试

    一.Kafka概述 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因 ...

  8. 分布式发布订阅消息系统Kafka

    高吞吐量的分布式发布订阅消息系统Kafka--安装及测试   一.Kafka概述 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览, ...

  9. Kafka logo分布式发布订阅消息系统 Kafka

    分布式发布订阅消息系统 Kafka kafka是一种高吞吐量的分布式发布订阅消息系统,她有如下特性: 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳 ...

随机推荐

  1. 2018.10.12 NOIP模拟 棋盘问题(切比雪夫距离)

    传送门 貌似是防ak题? 考试的时候想到了做四次cdqcdqcdq于是给自己多套了一个lognlognlogn结果还MLEMLEMLE 0分.(记得最后5分钟调出来的时候是那么的欣喜 下来发现并不需要 ...

  2. 2018.09.19 atcoder AtCoDeer and Election Report(贪心)

    传送门 很有意思的一道贪心. 就是每次翻最小的倍数来满足条件. 代码: #include<bits/stdc++.h> #define ll long long using namespa ...

  3. spark 写 hbase 数据库,遇到Will not attempt to authenticate using SASL (unknown error)

    今日在windows上用spark写hbase的函数 saveAsHadoopDataset 写hbase数据库的时候,遇到Will not attempt to authenticate using ...

  4. UML学习归纳整理

    转载自:https://www.jianshu.com/p/83afa19c5096 写在前面 之前在学校比较系统的学习过统一建模语言UML,但长时间没使用遗忘了许多,最近因工作需要,所以对UML重新 ...

  5. cxf-rs 和 swagger 的点

    1. 从web.xml 说起 <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class ...

  6. 动态链接库编程:非MFC DLL

    设计一个DLL,内含一个函数计算a+b: DLL的组成 .h(头文件) 定义了DLL能够导出的函数.数据结构或类的声明,该文件的声明内容在.CPP文件中实现,而.CPP的源程序被封装到DLL文件中 . ...

  7. SSH整合 第五篇 struts2的到来

    struts2的好处,web层的显示,同时Action类相当于MVC模式的C.整合进来的话,是通过与Spring整合,减少重复代码,利用IoC和AOP. 1.struts-2.5.2.jar 以上是s ...

  8. C/C++中如何获取数组的长度?

    C/C++中如何获取数组的长度? 收藏 C.C++中没有提供 直接获取数组长度的函数,对于存放字符串的字符数组提供了一个strlen函数获取长度,那么对于其他类型的数组如何获取他们的长度呢?其中一种方 ...

  9. 第一章 JVM内存结构

    注意:本系列博客,主要参考自以下四本书 <分布式Java应用:基础与实践><深入理解Java虚拟机(第二版)><深入分析Java web技术内幕><实战jav ...

  10. FreeBSD查看即时网络流量

    1.数据包 “netstat 1″一秒钟累计一次,”netstat 2″两秒钟累计一次.依此类推 2.查看网卡流量:”systat -if 1″每秒钟刷新一次,”systat -if 2″两秒钟刷新一 ...