ActivityMQ

  • JMS

JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。

  • JMS的优势

异步:JMS天生就是异步的,客户端获取消息的时候,不需要主动发送请求,消息会自动发送给可用的客户端。

可靠:JMS保证消息只会递送一次。大家都遇到过重复创建消息问题,而JMS能帮你避免该问题,只是避免而不是杜绝,所以在一些糟糕的环境下还是有可能会出现重复

  • JSM的两种交互方式

点对点消息模型

(1)、每个消息只有一个接受者(自己测试了一下,可以有多个接受者,但是当有多个接收者时,每个接收者只能获取随机的几条信息)

(2)、消息发送者和消息接受者并没有时间依赖性。

(3)、当消息发送者发送消息的时候,无论接收者程序在不在运行,都能获取到消息;

(4)、当接收者收到消息的时候,会发送确认收到通知(acknowledgement)。

(5)点对点消息模型图:

发布/订阅消息模型

(1)、一个消息可以传递给多个订阅者

(2)、发布者和订阅者有时间依赖性,只有当客户端创建订阅后才能接受消息,且订阅者需一直保持活动状态以接收消息。

(3)、为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。

(4)、发布/订阅消息模型图:

  • ActiveMQ的下载

  • ActiveMQ的点对点使用

Session.AUTO_ACKNOWLEDGE。当客户成功的从receive 方法返回的时候,或者从MessageListener.onMessage方法成功返回的时候,会话自动确认客户收到的消息。

Session.CLIENT_ACKNOWLEDGE。 客户通过消息的 acknowledge 方法确认消息。需要注意的是,在这种模式中,确认是在会话层上进行:确认一个被消费的消息将自动确认所有已被会话消 费的消息。例如,如果一个消息消费者消费了 10 个消息,然后确认第 5 个消息,那么所有 10 个消息都被确认。

Session.DUPS_ACKNOWLEDGE。 该选择只是会话迟钝的确认消息的提交。如果 JMS provider 失败,那么可能会导致一些重复的消息。如果是重复的消息,那么 JMS provider 必须把消息头的 JMSRedelivered 字段设置为 true。

  • maven需要依赖的包

<!-- activemq --><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-core</artifactId><version>5.7.0</version></dependency><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-pool</artifactId><version>5.12.1</version></dependency>
  • 消息生产者

public class Producer {private static final String USERNAME= ActiveMQConnection.DEFAULT_USER; // 默认的连接用户名private static final String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD; // 默认的连接密码private static final String BROKEURL=ActiveMQConnection.DEFAULT_BROKER_URL; // 默认的连接地址public static void main(String[] args) {ConnectionFactory connectionFactory;//连接工厂Connection connection = null;//连接Session session = null;//会话Destination destination  = null;//消息目的地,就是一个消息队列MessageProducer messageProducer  = null;//消息生产者try {//1.连接MQSystem.out.println("username:"+USERNAME);System.out.println("password:"+PASSWORD);System.out.println("url:"+BROKEURL);connectionFactory = new ActiveMQConnectionFactory(USERNAME,PASSWORD,BROKEURL);connection = connectionFactory.createConnection();connection.start();session = connection.createSession(true,Session.AUTO_ACKNOWLEDGE);destination = session.createTopic("ActiveMQTopic");messageProducer = session.createProducer(destination);Destination destination2 = session.createQueue("spring-activemq");MessageProducer messageProducer2 = session.createProducer(destination2);//2.发送消息for (int i=0;i<10;i++){String txt = "电话:1380000111"+i;TextMessage txtMsg = session.createTextMessage(txt);messageProducer.send(destination,txtMsg);System.out.println("发送到MQ:topic" + i);TextMessage txtMsg2 = session.createTextMessage(txt);messageProducer2.send(destination2,txtMsg2);System.out.println("发送到MQ:queue:" + i);}session.commit();}catch (Exception e){e.printStackTrace();}}
}
  • 消息消费者

public class Consumer {private static final String USERNAME= ActiveMQConnection.DEFAULT_USER; // 默认的连接用户名private static final String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD; // 默认的连接密码private static final String BROKEURL=ActiveMQConnection.DEFAULT_BROKER_URL; // 默认的连接地址public static void main(String[] args) {ConnectionFactory connectionFactory;//连接工厂Connection connection = null;//连接Session session = null;//会话Destination destination  = null;//消息目的地,就是一个消息队列MessageConsumer messageConsumer  = null;//消息生产者try {//1.连接MQSystem.out.println("username:"+USERNAME);System.out.println("password:"+PASSWORD);System.out.println("url:"+BROKEURL);connectionFactory = new ActiveMQConnectionFactory(USERNAME,PASSWORD,BROKEURL);connection = connectionFactory.createConnection();connection.start();session = connection.createSession(true,Session.AUTO_ACKNOWLEDGE);destination = session.createQueue("短信发送");messageConsumer = session.createConsumer(destination);//2.从MQ服务器取消息/*for (int i=0;i<5;i++){TextMessage textMessage = (TextMessage) messageConsumer.receive();System.out.println(textMessage.getText());}*///3.写MQ的监听器System.out.println("aaaaaaaaaaaaaaa");messageConsumer.setMessageListener(new MyMessageListener());System.out.println("bbbbbbbbbbb");session.commit();System.out.println("ccccccccccc");}catch (Exception e){e.printStackTrace();}finally {/*System.out.println("关闭");//3.断开try{messageConsumer.close();session.close();connection.close();}catch (Exception e){}*/}}
}
  • 在管理中心

在浏览器中输入:http://127.0.0.1:8161/admin/

  • 相关的连接

ssm整合

activitymq使用:https://blog.csdn.net/yinbucheng/article/details/71189324

其他

中间件——activityMQ相关推荐

  1. 中间件-------activityMQ整合springboot

    springboot整合activityMQ 启动activityMQ 创建项目 添加maven的依赖,导入相应的jar包 <?xml version="1.0" encod ...

  2. thinkphp5.1 中间件是什么有什么用

    中间件是什么?有什么作用? 中间件主要用于拦截或过滤应用的HTTP请求,并进行必要的业务处理.---tp5.1手册 也就是说,降低了系统的耦合:[在http请求阶段,执行中间件的入口执行方法(hand ...

  3. Django高级管理静态文件和中间件5.1

    管理静态文件 项目中的CSS.图片.js都是静态文件 配置静态文件 在settings 文件中定义静态内容 STATIC_URL = '/static/' STATICFILES_DIRS = [os ...

  4. 开源分布式数据库中间件

    转自:https://www.csdn.net/article/2015-07-16/2825228 MyCat:开源分布式数据库中间件 为什么需要MyCat? 虽然云计算时代,传统数据库存在着先天性 ...

  5. Gin源码解析和例子——中间件(middleware)

    在<Gin源码解析和例子--路由>一文中,我们已经初识中间件.本文将继续探讨这个技术.(转载请指明出于breaksoftware的csdn博客) Gin的中间件,本质是一个匿名回调函数.这 ...

  6. nodejs 中间件 反向代理 接口转发

    背景 随着后端业务系统的增加,纵向需求不断扩展,一个业务系统已经无法满足需求了,衍生出多个业务系统,对外暴露的ip.端口就可能有多个,此时不方便外部接口调用,有些特殊行业客户出于安全性考虑不发提供多个 ...

  7. 金蝶中间件部署报栈溢出_京东618压测时自研中间件暴露出的问题,压测级别数十万/秒...

    618大促演练进行了全链路压测,在此之前刚好我的热key探测框架也已经上线灰度一周了,小范围上线了几千台服务器,每秒大概接收几千个key探测,每天大概几亿左右,因为量很小,所以框架表现稳定. 借着这次 ...

  8. Redux 入门教程(二):中间件与异步操作

    上一篇文章,我介绍了 Redux 的基本做法:用户发出 Action,Reducer 函数算出新的 State,View 重新渲染. 但是,一个关键问题没有解决:异步操作怎么办?Action 发出以后 ...

  9. 自己动手——实现 Dustjs 中间件

    Dustjs是我个人比较喜欢的一个JS模版引擎,原因有两个,一是,同时支持客户端和服务端渲染,模版编译成JS后使用,性能好:二是,有大公司的支持,Linkedin有专门的Dustjs版本(本文所说的都 ...

  10. 分布式事务中间件 Fescar—RM 模块源码解读

    2019独角兽企业重金招聘Python工程师标准>>> 前言 在SOA.微服务架构流行的年代,许多复杂业务上需要支持多资源占用场景,而在分布式系统中因为某个资源不足而导致其它资源占用 ...

最新文章

  1. 如何用c语言将度分秒变为弧度_弧度与角度从哪里来
  2. 实测DB_BLOCK_CHECKSUM=FULL的作用
  3. 一个通过引用返回局部变量的列子
  4. python tkinter计算器实例_python小实例——tkinter实战(计算器)
  5. Webstorm中提示Cannot find module 'webpack.dev.conf.js'
  6. C++中int id[sizeof(unsigned long)]的语句,正确吗?
  7. 个人pkm软件 pim软件_个人申请软件著作权需要走哪些流程
  8. 信息学奥赛一本通(1241:二分法求函数的零点)
  9. 两个线程能在cpu中同时运行吗_多核和多线程那些事
  10. 【Flink】did not rea ct to cancelling signal for 30 seconds, but is stuck No implementation was bound
  11. vSAN Health Service-物理磁盘运行状况-物理磁盘运行状况检索问题(2149291)
  12. Android---06---2中动画效果
  13. 萤石云摄像头Http接口云台控制开发
  14. No DataSource specified
  15. 【Pandas】常用姿势积累
  16. (转)windows 7兼容软件列表搜集加转帖
  17. 一次由图片引起的致命崩溃问题
  18. 《MySQL高级篇》三、存储引擎
  19. 新技能get√​10个PS加速小技巧让你的PS不再卡
  20. 没有可用的软件包 mongodb,但是它被其它的软件包引用了。这可能意味着这个缺失的软件包可能已被废弃,或者只能在其他发布源中找到E: 软件包 mongodb 没有可安装候选

热门文章

  1. SHA1算法实现及详解
  2. 驰为HI8刷Win10系统出现红屏错误如何解决
  3. VMware visio制图形状大全
  4. psp开发------汉化插件
  5. 埃夫特机器人离线编程软件_工业机器人离线编程与虚拟仿真软件
  6. 最新布尔教育Blog项目实战 php博客项目实战教程 php实战教程(完整)
  7. device-monitoring-studio(串口监控软件)的使用方法
  8. 人机工程学座椅设计_人体工程学_座椅设计说明
  9. 微信投票作弊神器的制作代码
  10. 使用jave1.0.2.jar进行音视频转码