ActiveMQ消息中间件
最近学习到ActiveMQ,之前也没有用过相关或者类似的工具,因此特地写个文章进行相关的学习记录。
相关参考博文:https://www.cnblogs.com/cyfonly/p/6380860.html、https://blog.csdn.net/qq_26641781/article/details/80408987、https://blog.csdn.net/qinweili751/article/details/80620104
1.安装ActiveMQ
(1)进入官网http://activemq.apache.org/,选择最新的版本下载
(2)再选择对应的系统环境(我这里选择的是windows版本)
(3)下载完成后将其解压(我这里将它存放在D盘根目录下),目录结构如下
(4)进入bin/win64/目录,启动activemq.bat文件(注意:MQ与jdk版本必须要匹配。我这里下载的MQ是5.15版本,对应的jdk最低要求是1.8)。
(5)启动完成后,输入浏览器地址http://localhost:8161/admin,会弹出用户名/密码输入框
我们的账号密码是存放在ActiveMQ根目录的conf/jetty-realm.properties文件中。
打开可以看到最下面已经有两个创建好了的用户了。如果我们需要添加自己的用户,或是修改它们的角色,都可以按照上面所写的格式"用户名:密码 [,角色]"来进行配置(角色被定义在~/conf/jetty.xml中)。
这里我们使用默认帐号,admin/admin
(6)至此,我们的ActiveMQ已经安装完成。
2.使用ActiveMQ
- ActiveMQ的使用一般分为以下几个步骤:
- connectionFactory:创建连接工厂;
- connection:从连接工厂中得到连接;
- session:从连接中获得一个会话;
- destination:从会话中获取一个destination。可以是Queue(P2P)或Topic(Pub/Sub)
- Producer:根据session和destination创建服务生产者。
- Message:根据session创建消息。
- send:消息生产者将message发送给MQ
- Consumer:根据session和destination创建服务消费者。
- receive:接收MQ中的消息。可以是同步接收,也可以是创建监听器异步接收。
- 关闭资源。
由于我这里是Springboot的项目,因此有部分步骤已经在自动配置中处理好了。
(1)引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.15.</version>
</dependency>
(2)添加相关配置
#默认端口是61616,而不是我们访问网站的8161端口
spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=admin
spring.activemq.password=admin
spring.activemq.pool.enabled=false
(3)添加配置类(PS:如果不配置该类,默认只会使用P2P,即设置Queue为destination。如果要使用Topic,则必须要配置下面的类)。
@Configuration
public class JmsConfig { @Bean
public JmsListenerContainerFactory<?> jmsListenerContainerQueue(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setPubSubDomain(false); //Queue是P2P,因此Pub/Sub设置为false。默认是false。
factory.setConnectionFactory(connectionFactory);
return factory;
} @Bean
public JmsListenerContainerFactory<?> jmsListenerContainerTopic(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setPubSubDomain(true); //Topic是Pub/Sub,需要显示声明。
factory.setConnectionFactory(connectionFactory);
return factory;
} }
(4)编写服务消费者
这里为了能区别P2P和Pub/Sub,创建了两个服务消费者。
消费者1
@Service
public class ConsumerService { @JmsListener(destination = "springboot.queue.test", containerFactory = "jmsListenerContainerQueue")
public void receiveQueue(String msg) {
System.out.println(LocalDateTime.now().toString() + " consumer接收到Queue消息:" + msg);
} @JmsListener(destination = "springboot.topic.test", containerFactory = "jmsListenerContainerTopic")
public void receiveTopic(String msg) {
System.out.println(LocalDateTime.now().toString() + " consumer接收到Topic消息:" + msg);
} }
消费者2
@Service
public class Consumer2Service { @JmsListener(destination = "springboot.queue.test", containerFactory = "jmsListenerContainerQueue")
public void receiveQueue(String msg) {
System.out.println(LocalDateTime.now().toString() + " consumer2接收Queue消息:" + msg);
} @JmsListener(destination = "springboot.topic.test", containerFactory = "jmsListenerContainerTopic")
public void receiveTopic(String msg) {
System.out.println(LocalDateTime.now().toString() + " consumer2接收到Topic消息:" + msg);
}
}
(5)编写服务生产者
@Service
public class ProducerService { @Autowired
private JmsTemplate jmsTemplate; public void sendMessage(Destination destination, String msg) {
System.out.println(LocalDateTime.now().toString() + " productor发送消息:" + msg);
jmsTemplate.convertAndSend(destination, msg);
} }
(6)测试类
先测试P2P下的消息:
@Test
public void testMQQueue() {
Destination destination = new ActiveMQQueue("springboot.queue.test");
for (int i = ; i < ; i++) {
producerService.sendMessage(destination, "hellow world " + i);
}
}
输出结果
2019-05-22T17:29:39.324 productor发送消息:hellow world 0
2019-05-22T17:29:39.373 consumer2接收Queue消息:hellow world 0
2019-05-22T17:29:39.379 productor发送消息:hellow world 1
2019-05-22T17:29:39.385 productor发送消息:hellow world 2
2019-05-22T17:29:39.388 consumer接收到Queue消息:hellow world 1
2019-05-22T17:29:39.391 consumer2接收Queue消息:hellow world 2
可以看到生产者每发出一个消息,都只会有一个消费者对消息进行处理。并且这里采用的是轮询的方式,即这次是消费者1接收了消息,下次就是消费者2接收,再下次又是消费者1。以此类推。
然后我们再测试下Pub/Sub的消息:
@Test
public void testMQTopic() {
Destination destination = new ActiveMQTopic("springboot.topic.test");
for (int i = ; i < ; i++) {
producerService.sendMessage(destination, "hellow world " + i);
}
}
输出结果:
2019-05-22T17:35:58.535 productor发送消息:hellow world 0
2019-05-22T17:35:58.576 productor发送消息:hellow world 1
2019-05-22T17:35:58.581 consumer接收到Topic消息:hellow world 0
2019-05-22T17:35:58.582 consumer接收到Topic消息:hellow world 1
2019-05-22T17:35:58.582 consumer2接收到Topic消息:hellow world 0
2019-05-22T17:35:58.584 consumer2接收到Topic消息:hellow world 1
这里可以看到,每一个消息被发出来后,会被所有的服务消费者接收并处理。
ActiveMQ消息中间件的更多相关文章
- spring boot整合activemq消息中间件
spring boot整合activemq消息中间件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi ...
- ActiveMQ消息中间件的作用以及应用场景
ActiveMQ消息中间件的作用以及应用场景 一.ActiveMQ简介 ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ是一个完全支持JMS1.1和J2EE1.4 ...
- ActiveMQ消息中间件Producer和Consumer
ActiveMQ消息中间件Producer和Consumer 原创jethai2015-08-18 18:08:56评论(0)1480人阅读 生产者代码: 1 2 3 4 5 6 7 8 9 10 ...
- Apache ActiveMQ消息中间件的基本使用
Apache ActiveMQ是Apache软件基金会所研发的开放源码消息中间件:由于ActiveMQ是一个纯Java程式,因此只需要操作系统支援Java虚拟机,ActiveMQ便可执行. 支持Jav ...
- JMS学习篇《一》ActiveMQ消息中间件的简单介绍与用法-概念篇
原创说明:本篇博文为本人原创作品,转载请注明出处 1.何为消息中间件 消息中间件是一种在分布式应用中互相交换信息的一种技术,常见的成熟消息中间件有:RabbitMQ.SonicMQ,activeMQ. ...
- Kafka、RabbitMQ、RocketMQ、ActiveMQ消息中间件的对比--多年生产经验实践总结
引言 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,前段时间我们自家的产品 RocketMQ (MetaQ的内核) 也顺利开源,得到大家的关注. ...
- 分布式--ActiveMQ 消息中间件(一) https://www.jianshu.com/p/8b9bfe865e38
1. ActiveMQ 1). ActiveMQ ActiveMQ是Apache所提供的一个开源的消息系统,完全采用Java来实现,因此,它能很好地支持J2EE提出的JMS(Java Message ...
- 应用activeMQ消息中间件同步索引库
mq是一个消息服务器: 安装包内置了tomcat,直接登录访问,登录:http://ip:8161/admin/ (相当于dubbo的moniter监控中心) admin admin传统串行化, ...
- activemq消息中间件的依赖
<dependencies> <dependency> <groupId>org.apache.activemq</groupId> <artif ...
随机推荐
- C++中无数据成员的类的对象占用内存大小
结论: 对于没有数据成员的对象,其内存单元也不是0,c++用一个内存单元来表示这个实例对象的存在. 如果有了数据或虚函数(虚析构函数),则相应的内存替代1标记自己的存在. PS:以下代码均在win32 ...
- CentOS 编译golang
CentOS 安装Mercurial http://hi.baidu.com/lang2858/item/cda8f6026cd522e0f45ba67f 获取代码 $ hg clone -u rel ...
- 《DSP using MATLAB》Problem 8.15
代码: %% ------------------------------------------------------------------------ %% Output Info about ...
- HDU--2191 汶川地震购米(多重背包)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2191 分析:有资金n元,而市场有m种大米,每种大米价格不等,重量不等,数量不等, 并且只能整袋购买.如何用 ...
- OpenGL学习笔记2017/8/29
OpenGL学习日志: 感谢doing5552 的OpenGL入门学习:http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html 相 ...
- Odoo QWeb
1.web 模块 注意,OpenERP 模块中 web 部分用到的所有文件必须被放置在模块内的 static 文件夹里.这是强制性的,出于安全考虑. 事实上,我们创建的文件夹 CSS,JS 和 XML ...
- 最小费用最大流——EK+SPFA
终于把最小费用最大流学会了啊-- 各种奇奇怪怪的解释我已经看多了,但在某些大佬的指点下,我终于会了. 原来是个好水的东西. 最小费用最大流是什么? 不可能不知道网络流吧?如果不知道,自行百度去-- 费 ...
- HZOI2019熟练剖分(tree)
题目大意:https://www.cnblogs.com/Juve/articles/11186805.html 题解: 先给出官方题解: 其实这题跟期望没什么关系,因为E=$\sum_\limits ...
- HZOI2019序列
题目链接:https://www.cnblogs.com/Juve/articles/11186805.html(密码是我的一个oj用户名) 题解: 这题我考试打的暴力,只有5分. 一开始理解错题意了 ...
- 常用 docker 容器 使用
mongo: 单点 docker run -idt --name=mongo --restart=always -p : -v /home/hylas/opt/mongo/data:/data/db ...