本文只是简单的介绍集成和使用,偏重于应用,springboot版本为2.1.0
参看:
https://blog.csdn.net/lemonTree_DXP/article/details/81334812
https://www.jianshu.com/p/d8d73c872665
https://blog.csdn.net/liuchuanhong1/article/details/54603546
- 安装activemq
- 引入pom和配置
- 即时消息,延时消息
安装
activemq的下载地址:http://activemq.apache.org
当前时间(2018-11-30)的mq版本是5.15.8。各位依据自己的系统下载的对应的版本,其实使用都一样。但是注意,最新版本的mq,需要java8支持。
我的是mac,所以可以直接使用brew安装。
下载完毕,直接跑起来(找到bin目录,./activemq start),然后访问:http://127.0.0.1:8161 默认管理员账号密码都是admin。可以访问就说明安装成功了。
输入账号密码
目前没有任何的消息。
正常操作肯定是要修改密码的了:
找到mq安装目录,找到conf文件夹,找到文件:jetty-realm.properties
# Defines users that can access the web (console, demo, etc.)
# username: password [,rolename ...]
admin: admin, admin
user: user, user
详细的配置说明不解释,直接修改下admin和user的账号密码,这里为了测试就不去修改了。
很重要的,要使用延迟消息【比如2小时后才送达消息,默认是即时】,必须修改的配置,找到activemq.xml文件,添加schedulerSupport=true这个属性
<broker xmlns="http://activemq.apache.org/schema/core" schedulerSupport="true" brokerName="localhost" dataDirectory="${activemq.data}">
activemq的配置就完成了。
项目pom和配置
详细的pom和配置查看下面的代码部分介绍。
怎么使用,消息的区分
首先明确一个问题,为什么要使用mq,才能有怎么使用,不能为了使用而使用。
一些介绍可以看看这篇文章:https://www.cnblogs.com/linjiqin/p/5720865.html
消息分为2种,queue
队列模式和topic
订阅模式(一般订阅,持久订阅)【主要区别就是是否能重复消费
】
关于2个的介绍这篇文章讲的很好:https://www.cnblogs.com/lemon-flm/p/7676047.html
我这里做一个简单的总结
queue
队列:一个消息只能被一个消费者消耗,如果有100个消息,有5个消费者,那么他们均分这100个消息,而不是每个人都获取100个消息,如果当前没有任何消费者,那么消息就会保存到磁盘,直到出现一个消费者。
topic
订阅模式:打个比方,报社印制报纸,有很多人订阅了这个报纸,那么报社在每一期报纸发行时,将同样内容
的报纸发放到订阅者手里。所以每个订阅者收到的消息是一样的
,没有订阅这个报纸的人肯定是收不到报纸的。如果我是今年下半年才订阅的报纸,报社也不可能将上半年的报纸发放给我,所以已经发送过的消息,不会再次发送给新的订阅者的
。
特殊的,如果这个报社没有任何人订阅
,他还坚持生产报纸怎么办?这就像是将报纸丢到水里了,没有任何人收的到,除非出现一个订阅者。报社社长很固执,已经发放的报纸也不会重新给订阅者,即便是丢弃掉。
好了,总结完,大概大家就知道这2个的应用场景了,保证消息必达的就用queue,类似聊天室的就用topic。
下面就用代码来实现以下这个2个消息模式,为了方便创建一个多模块的项目,包含customer和producter,多模块项目的创建我这里不详细的介绍。直接给出关键的pom。
依次实现:
queue,一对一,即时消息
queue,延时消息
queue,一对多,多个消费者
topic
项目结构:
总工程activemq,子模块是customer和producter 步骤:
- 创建一个maven项目,不勾选类别,名称为activemq。
- 创建完毕,删除项目src文件夹。
- 右击项目,创建modules,然后选择正常的springboot项目构建,创建2个。
- 创建完毕,删除.mvn文件夹,mvnw,mvnw.cmd文件。
- 配置pom。
- 然后在总项目进行一次编译,如果通过,基本上完成搭建。
activemq的pom
:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ly</groupId>
<artifactId>activemq</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 总项目必须添加为pom打包方式 -->
<packaging>pom</packaging>
<modules>
<!-- 项目的子模块都在这里添加,只有2个 -->
<module>producter</module>
<module>customer</module>
</modules>
<!-- 包的版本总控制,可以再子模块,也可以统一到父模块统一管理 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<!-- 整个项目依赖springboot,所以在父模块这里引入 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath />
</parent>
<!-- 子模块的公共依赖,因为子模块都需要这些包,所以可以提取出来,注意dependencyManagement 和 dependencies的区别,查看:https://blog.csdn.net/java_xxxx/article/details/81181674-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
</dependency>
<!-- pool: enabled :true 时要加入这个 -->
<dependency>
<groupId>org.messaginghub</groupId>
<artifactId>pooled-jms</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
producter模块的pom,customer的一样,就不重复了:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ly</groupId>
<artifactId>producter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>producter</name>
<description>Demo project for Spring Boot</description>
<!-- 设置父模块,其实新建springboot项目的时候,这里是springboot,原理一样 -->