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 ...
随机推荐
- thinkphp 子查询
从3.0版本开始新增了子查询支持,有两种使用方式: 大理石平台检验标准 1.使用select方法 当select方法的参数为false的时候,表示不进行查询只是返回构建SQL,例如: // 首先构造子 ...
- 「题解」:[BZOJ4358]permu
问题: permu 时间限制: 30 Sec 内存限制: 512 MB 题面 题目描述 给出一个长度为n的排列P(P1,P2,...Pn),以及m个询问.每次询问某个区间[l,r]中,最长的值域 连 ...
- JavaScrip中的循环语句
循环语句 循环语句,也是流程控制语句中不可或缺的一种结构.在 JavaScrip中实现循环的方式有好几个一个来看 1.为什么需要循环 在具体介绍 Javascript中的循环之前,首先我们来明确一个问 ...
- wifi共享大师,去除弹窗广告。
1.安装WiFi共享大师 2.不要打开 3.右键打开文件所在位置 4.在任意目录新建三个空的txt,重命名为MiniNews.exe.ProLive.exe.WifiUpdate.exe 5.将上面的 ...
- PHP实现图片的汉明码提取与降维
作者感言:数学不好,遇到算法问题分分钟狗带,毫无转寰的余地-_-||| 最近心血来潮,看了相似图片的搜索,最最最初级的方法即提取汉明码,之后匹配汉明距离.当然,在数以亿计的汉明码中,要筛出需要的图片, ...
- 洛谷P2471——[SCOI2007]降雨量
本机AC提交RE…… 传送门:QAQQAQ 题意:自己看 思路:据说这道题用RMQ做很快,但这道题线段树是可以的 线段树维护一段区间最左年,最右年,是否有间隙和区间最大值 这道题分类讨论是一大难点,主 ...
- xml中的<if>和截取字符串
<#if (envPollute=='1')>√</#if><#if (envPollute=='0')>√</#if>${as_title?subst ...
- 使用async读取异步数据
使用传统方式读取异步数据 const fs = require('fs') fs.readFile('readme.txt', function (err, data) { console.log(d ...
- Markdown 格式标记符号说明
Markdown 格式标记符号说明 1. 标题 在行首插入 1 到 6个#,分别表示标题 1 到标题 6 # 这是标题1 ## 这是标题1 ###### 这是标题6 点击保存后的效果: 标题1 标题2 ...
- NOI2018 Day1 归程(return)
第一次参加NOI,当然,我没去现场做,只是在网络同步赛做了而已. 那网站,特别特别卡啊-- 最后只交了第一题,原本认为能AC,但是因为某些原因只有50分. 我这可怜的第一次啊-- 题目 题目点此处下载 ...