最近学习到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消息中间件的更多相关文章

  1. spring boot整合activemq消息中间件

    spring boot整合activemq消息中间件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi ...

  2. ActiveMQ消息中间件的作用以及应用场景

    ActiveMQ消息中间件的作用以及应用场景 一.ActiveMQ简介 ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ是一个完全支持JMS1.1和J2EE1.4 ...

  3. ActiveMQ消息中间件Producer和Consumer

    ActiveMQ消息中间件Producer和Consumer 原创jethai2015-08-18 18:08:56评论(0)1480人阅读   生产者代码: 1 2 3 4 5 6 7 8 9 10 ...

  4. Apache ActiveMQ消息中间件的基本使用

    Apache ActiveMQ是Apache软件基金会所研发的开放源码消息中间件:由于ActiveMQ是一个纯Java程式,因此只需要操作系统支援Java虚拟机,ActiveMQ便可执行. 支持Jav ...

  5. JMS学习篇《一》ActiveMQ消息中间件的简单介绍与用法-概念篇

    原创说明:本篇博文为本人原创作品,转载请注明出处 1.何为消息中间件 消息中间件是一种在分布式应用中互相交换信息的一种技术,常见的成熟消息中间件有:RabbitMQ.SonicMQ,activeMQ. ...

  6. Kafka、RabbitMQ、RocketMQ、ActiveMQ消息中间件的对比--多年生产经验实践总结

    引言 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,前段时间我们自家的产品 RocketMQ (MetaQ的内核) 也顺利开源,得到大家的关注. ...

  7. 分布式--ActiveMQ 消息中间件(一) https://www.jianshu.com/p/8b9bfe865e38

    1. ActiveMQ 1). ActiveMQ ActiveMQ是Apache所提供的一个开源的消息系统,完全采用Java来实现,因此,它能很好地支持J2EE提出的JMS(Java Message ...

  8. 应用activeMQ消息中间件同步索引库

    mq是一个消息服务器: 安装包内置了tomcat,直接登录访问,登录:http://ip:8161/admin/    (相当于dubbo的moniter监控中心) admin admin传统串行化, ...

  9. activemq消息中间件的依赖

    <dependencies> <dependency> <groupId>org.apache.activemq</groupId> <artif ...

随机推荐

  1. 移动端自定义键盘的vue组件 ----keyboard

    <style scoped lang="less"> .keyboard { /* height: 250px; */ width: 100%; position: f ...

  2. IOS学习笔记56-IOS7状态栏适配方法一

    近期由于IOS7的发布,所以应用的适配潮可谓是都搞的锣鼓喧天,甚是热闹,因此呢,因适配IOS7而产生的问题也是铺天盖地的卷来,所以了,我也从简单的状态栏适配开始,先研究了下关于状态栏的适配,特总结如下 ...

  3. light oj 1422 区间dp

    #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> ...

  4. iOS之CGcontext.h方法和属性简介

    /* CoreGraphics - CGContext.h Copyright (c) 2000-2012 Apple Inc. All rights reserved. */ #ifndef CGC ...

  5. PHP面向对象魔术方法基本了解

    简单介绍 (1) 魔术方法都是系统提供,程序员使用即可. (2) 所有的魔术方法,前面都是以  __ 开头的 _是两个下划线. (3) 我们在自定义函数时,就不要使用 __开头了. (4) 魔术方法是 ...

  6. ssm项目 maven 项目pon.xml 配置

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  7. VC:不支持尝试执行的操作

    问题描述: 基于CDialogEx的对话框工程.VS2010开发环境. 调试运行到OnInitDialog()的CDialogEx::OnInitDialog()方法的时候弹出提示窗口"不支 ...

  8. Markdown 格式标记符号说明

    Markdown 格式标记符号说明 1. 标题 在行首插入 1 到 6个#,分别表示标题 1 到标题 6 # 这是标题1 ## 这是标题1 ###### 这是标题6 点击保存后的效果: 标题1 标题2 ...

  9. 解决mysql因内存不足导致启动报错

    报错如下所示: 解决方案: nano /etc/my.cnf 添加如下设置: key_buffer=16K table_open_cache=4 query_cache_limit=256K quer ...

  10. MapReduce 图解流程超详细解答(2)-【map阶段】

    接上一篇讲解:http://blog.csdn.net/mrcharles/article/details/50465626 map任务:溢写阶段 正如我们在执行阶段看到的一样,map会使用Mappe ...