目录
7.3、用xftp将下载好的apache-activemq-5.15.11-bin.tar.gz传入tmp目录中
7.5、进入activemq的安装目录:cd /var/activemq/
8、创建ActiveMQ服务(这个方法还不能创建成功,先记录,等我以后要用时再完善)
8.2、在activemq.service文件中填入以下内容
8.3、修改/var/activemq/bin/env配置JAVA_HOME,在配置文件最底部
1.1、配置vi activemq.xml(在/var/activemq/conf/目录下)支持调度
2.3、Master-Slave与Broker-Cluster相结合部署方式
2.1.2.1 amq入门
1、ActiveMQ的定义
ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线
现在不是很火了,完全支持JMS1.1和J2EE1.4规范的JMS Provider实现
2、JMS的定义
JMS:java消息服务(Java Message Service)
应用程序接口是一个java平台中关于面向消息中间件(MOM)的API,
用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
Java消息服务是一个与具体平台无关的API
3、JMS的对象模型
4、JMS的消息模型
4.1、点对点
点对点:Point-to-Point(P2P)
JMS的消息模型-点对点
4.2、发布订阅
发布订阅:Publish/Subscribe (Pub/Sub) /主题
JMS的消息模型-发布订阅
5、JMS的消息结构
5.1 消息头
JMS-消息头:关于消息的描述信息
5.2 消息属性
消息的附加消息头,属性名可以自定义
属性值类型:boolean、byte、int、long、float、double、String
5.3 消息体
JMS消息体-类型
6、ActiveMQ的特性
支持多种编程语言、支持多种传输协议、有多种持久化方式
7、安装ActiveMQ
基于CentOS7、JDK1.8安装ActiveMQ
7.1、下载最新版的activemq5
activemq.apache.org/download.html
7.2、在centos根下创建tmp目录
mkdir tmp
7.3、用xftp将下载好的apache-activemq-5.15.11-bin.tar.gz传入tmp目录中
7.4、提取存档
tar -zxvf apache-activemq-5.15.11-bin.tar.gz -C /var
7.5、进入activemq的安装目录:cd /var/activemq/
7.6、修改ActiveMQ的目录名
mv /var/apache-activemq-5.15.11/ /var/activemq/
7.7、后台进程启动ActiveMQ
查看activemq的进程id:ps -ef | grep activemq(先查看activemq是否已经启动了,如果已经启动,先停止再启动)
启动activemq: ./bin/activemq start
7.8、停止ActiveMQ
./bin/activemq stop
启动activemq
后台进程启动ActiveMQ后的输出
8、创建ActiveMQ服务(这个方法还不能创建成功,先记录,等我以后要用时再完善)
前面使用命令运行ActiveMQ,但最好的方式是将ActiveMQ作为服务启动,
使用system服务将可以确保ActiveMQ能在系统启动时自动启动
8.1、使用vim创建一个systemd服务文件
vi /usr/lib/systemd/system/activemq.service
8.2、在activemq.service文件中填入以下内容
[unit]
Description=ActiveMQ service
After=network.target
[service]
Type=forking
ExecStart=/var/activemq/bin/activemq start
ExecStop=/var/activemq/bin/activemq stop
User=root
Group=root
Restart=always
RestartSec=9
##syslog:系统日志目录
##系统日志目录一般在:/var/log/message
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=activemq
[Install]
WantedBy=multi-user.target
8.3、修改/var/activemq/bin/env配置JAVA_HOME,在配置文件最底部
JAVA_HOME="/usr/bin/java/jdk1.8.0_242"
8.4、启动ActiveMQ服务
systemctl start activemq
8.5、查看服务状态
systemctl status activemq
8.6、设置开机自动启动
创建软件连接:ln -s /usr/lib/systemd/system/activemq.service /etc/systemd/system/multi-user.target.wants/activemq.service
开机自启:systemctl enable activemq
检测是否开启成功(enable):systemctl list-unit-files |grep activemq
9、防火墙添加ActiveMQ的端口
ActiveMQ启动后,外部还无法访问,还需要在防火墙配置中增加ActiveMQ的Web管理端口和通讯端口
如果是内网,建议直接将防火墙关闭就可以了
9.1、添加端口
#Web管理端口默认为8161,通讯端口默认为61616
firewall-cmd --zone=public --add-port=8161/tcp --permanent
firewall-cmd --zone=public --add-port=61616/tcp --permanent
9.2、重启防火墙
systemctl restart firewalld.service
10、使用ActiveMQ的Web管理平台
10.1、访问地址
ActiveMQ自带有管理平台,在浏览器访问http://服务IP:8161/admin
默认账号:admin,密码:admin
10.2、Web管理配置
ActiveMQ的Web管理平台是基于jetty运行,因此在/var/activemq/conf目录可以看到jetty的配置文件
修改web管理平台的默认端口,在/var/activemq/conf/jetty.xml中
/var/activemq/conf/jetty-realm.properties可以在这个文件中维护账号密码
格式:用户名:密码,角色
eg:admin:888888,admin
11、在Java中使用ActiveMQ
Maven依赖
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.8</version>
</dependency>
参考代码:E:\meWork\study\project\subject-2\subject-2-mq\activemq-demo1\src\main\java\com\study\mq\b7_transaction\Producer.java
12、在Spring中使用ActiveMQ
参考Spring官方教程:http://spring.io/guides/gs/messaging-jms/
E:\meWork\study\project\subject-2\subject-2-mq\activemq-spring\src\main\java\hello\Producer.java
2.1.2.2 amq支持的消息协议讲解
1、ActiveMQ支持哪些协议
ActiveMQ支持多种协议传输和传输方式,允许客户端使用多种协议连接
ActiveMQ支持的协议:AUTO、OpenWire、AMQP、Stomp、MQTT等
ActiveMQ支持的基础传输方式:VM、TCP、SSL、UDP、Peer、Multicast、HTTP(s)等,
以及更高级的Failover、Fanout、Discovery、ZeroConf方式。
2、ActiveMQ的协议连接配置
在activemq的安装目录中/conf/activemq.xml中,通过配置<transportConnectors>就可以使用多种传输方式
3、ActiveMQ常用的传输方式及配置
3.1、TCP
由于TCP具有可靠传输的特性,它在ActiveMQ中也是最常使用的一种协议。
在默认的配置中,TCP连接的端口为61616
3.1.1、TCP配置格式
tcp://hostname:port?key=value
3.1.2、TCP配置参数说明
在服务器端配置时,参数要以“transport.”开头
在客户端连接时,参数省略“transport.”前缀
3.1.3、服务器端配置示例
tcp://localhost:61616?transport.threadName&transport.trace=false&transport.soTimeout=0000
3.1.4、客户端配置示例
tcp://localhost:61616?threadName&trace=false&soTimeout=60000
3.1.5、TCP配置参数说明
3.2、SSL
需要一个安全连接的时候可以考虑使用SSL,适用于client和broker在公网的情况,
如使用aws云平台等
http://activemq.apache.org/ssl-transport-reference.html
3.2.1、SSL配置格式,可配置参数和TCP相同
ssl://localhost:61616
3.2.2、SSL客户端配置
JMS客户端需要使用ActiveMQSslConnectionFactory类创建连接,
brokerUrl以ssl://开头,以下是Spring配置示例
SSL客户端配置-Spring配置示例
3.2.3、SSL主机名验证
从ActiveMQ5.15.6开始,ActiveMQ开始支持TLS主机名验证,默认情况下客户端启用了该验证而服务器端没有启用
3.2.4、服务器端配置
ssl://localhost:61616?transport.verifyHostName=true
3.2.3、客户端配置
ssl://localhost:61616?socket.verifyHostName=false
或者
ssl://localhost:61616?verifyHostName=false
3.3、NIO
使用Java的NIO方式对连接进行改进,因为NIO使用线程池,可以复用线程,所以可以用更少的线程维持更多的连接。
如果有大量的客户端,或者性能瓶颈在网络传输上,可以考虑使用NIO的连接方式
3.3.1、NIO配置格式,可配置参数和TCP相同
nio://hostname:port?key=value
NIO是OpenWire协议的传输方式,其它协议,像AMQP、MQTT、Stomp,也有NIO的实现,
通常在协议前缀中加“+nio”来区分
示例:mqtt+nio://localhost:1883
3.3.2、NIO传输线程使用情况配置
3.3.3、NIO SSL
从ActiveMQ5.6版本开始,NIO可以支持和SSL搭配使用的传输连接
3.3.4、NIO+SSL配置格式,可配置参数和TCP相同
nio+ssl://0.0.0.0:61616
3.4、UDP
与面向连接,可靠的字节流服务的TCP不同,UDP是一个面向数据的简单传输连接,没有TCP的三次握手,
所以性能大大强于TCP,但是是以牺牲可靠性为前提。适用于丢失也无所谓的消息
3.4.1、UDP配置格式
udp://localhost:8123
3.4.2、UDP配置参数说明
3.5、HTTP(S)
需要穿越防火墙,可以考虑使用HTTP(S),
但由于HTTP(S)是短连接,每次创建连接的成本较高,所以性能最差。通过XML传输数据
3.5.1、HTTP配置格式
http://localhost:8080?param1=val¶m2=val2
3.5.2、HTTPS配置格式
https://localhost:8080?param1=val¶m2=val2
3.6、VM
虚拟机协议(方法直调),使用场景是client和broker在同一个java虚拟机内嵌的情况,无需网络通信的开销。
3.6.1、VM配置格式
vm://brokerName?marshal=false&broker.persistent=false
3.6.2、VM配置参数说明
4、 OpenWire协议(常用)
4.1、OpenWire协议是什么
OpenWire是Apache的一种跨语言的协议,允许从不同的语言和平台访问ActiveMQ,
是ActiveMQ 4.x以后的版本默认的传输协议
http://activemq.apache.org/openwire-version-2-specification.html
http://activemq.apache.org/wire-protocol.html
4.2、OpenWire协议如何使用
OpenWire支持TCP、SSL、NIO、UDP、VM等传输方式,
直接配置这些连接,就是使用的OpenWire协议,OpenWire有自己的配置参数,
客户端和服务器端配置的参数名都通过前缀"wireFormat."表示。
http://activemq.apache.org/configuring-wire-formats.html
示例:
tcp://localhost:61616?wireFormat.cacheEnabled=false&wireFormat.tightEncodingEnabled=false
4.3、OpenWire的配置参数说明
5、 MQTT协议
5.1、MQTT协议是什么
MQTT(Message Queuing Telemetry Transport)
消息队列遥测传输是IBM开发的一个即时通讯协议,已成为物联网通信的标准
5.2、为什么使用MQTT协议
MQTT的结构简单,相对于其它消息协议,它更加轻量级。
适合在计算能力有限、低带宽、不可靠的网络环境使用。
5.3、MQTT的发布订阅模型
5.4、MQTT服务质量
服务质量(Qos)级别是一种关于发送者和接受者之间信息投递的保证协议。
MQTT中有三种Qos级别:
至多一次(0)
至少一次(1)
只有一次(2)
Qos是MQTT的一个主要功能,它使得在不可靠的网络下进行通信变得更为简单,
因为即便是在非常不可靠的网络下,协议也可以掌控是否需要重发消息并保证消息到达。
它也能帮助客户端根据网络环境和程序逻辑来自由选择Qos。
ActiveMQ使用MQTT协议的配置
5.5、Spring使用MQTT
Spring integration提供了MQTT协议的支持,通过Maven添加依赖即可使用。
官网教程:https://docs.spring.io/spring-integration/reference/html/mqtt.html
发布订阅模式的代码地址:E:\meWork\study\project\subject-2\subject-2-mq\activemq-demo1\src\main\java\com\study\mq\a2_mqtt\MqttProducer.java
Spring使用MQTT
spring中使用MQTT的代码参考:E:\meWork\study\project\subject-2\subject-2-mq\activemq-spring\src\main\java\mqtt\MqttApplication.java
websocket协议连接ActiveMQ代码参考:E:\meWork\study\project\subject-2\subject-2-mq\activemq-demo1\src\main\java\com\study\mq\a3_websocket_stomp\ConsumerAndProducerStomp.java
websocket只是一个连接的协议,发送消息需要用到stomp协议
使用方法官网都有
6、 AUTO协议
6.1、AUTO协议是什么
AUTO自动检测协议
从ActiveMQ 5.13.0开始,ActiveMQ开始支持协议个数检测,
可以自动检测OpenWire、STOMP、AMQP和MQTT。
允许这4种类型的客户端共享一个传输
6.2、AUTO协议的使用
2.1.2.3 Activemq高可用集群方案
1、 ActiveMQ延时、调度消息使用
1.1、配置vi activemq.xml(在/var/activemq/conf/目录下)支持调度
在broker标签上加属性schedulerSupport="true"
延时、调度消息描述文档:http://activemq.apache.org/delay-and-schedule-message-delivery.html
参考代码:E:\meWork\study\project\subject-2\subject-2-mq\activemq-demo1\src\main\java\com\study\mq\b1_message\DelayScheduleMessageDemo.java
2、 ActiveMQ有哪些集群部署方式
2.1、Master-Slave部署方式
2.1.1、共享文件系统Master-Slave部署方式
2.1.2、共享数据库Master-Slave方式
E:\meWork\study\project\subject-2\subject-2-docs\1-消息中间件\activemq主从共享数据库集群方案.md
persistent="true"开启持久化
<persistenceAdapter>
<!-- 这里是关键:指定数据源 -->
<jdbcPersistenceAdapter dataSource="#mysql-ds" useDatabaseLock="false" transactionIsolation="4"/>
</persistenceAdapter>
在broker标签的外面加
<!-- MySql DataSource Sample Setup -->
<bean id="mysql-ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://database.tony.com:3306/test_activemq?relaxAutoCommit=true"/>
<property name="username" value="tony"/>
<property name="password" value="tony"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
java代码使用Demo:E:\meWork\study\project\subject-2\subject-2-mq\activemq-demo1\src\main\java\com\study\mq\b2_clustering\Producer.java
Master挂掉了,收到的警告
官方文档参考地址:http://activemq.apache.org/failover-transport-reference.html
始终只有一个activemq对外提供服务
2.1.3、Replicated LevelDB Store方式(弃用)
2.2、Broker-Cluster部署方式
配置参考官网(masterslave discovery): http://activemq.apache.org/networks-of-brokers.html
2.3、Master-Slave与Broker-Cluster相结合部署方式
网络连接器配置说明
2.1.2.4 持久化原理及事务机制
1、ActiveMQ持久化方案介绍
ActiveMQ的消息持久化机制有JDBC、AMQ、KahaDB方式和LevelDB,无论使用哪种持久化方式,消息的存储逻辑都是一致的。
Queue类型的持久化机制
topic类型的持久化机制
2、JDBC方式
将消息存储到数据库中,例如:mysql、sql Server、Oracle、DB2等
优点:方便管理、可以支持强一致性
缺点:性能低
3、AMQ方式
基于文件的存储方式,它具有写入速度快和容易恢复的特点,但是由于其重建索引时间过长,而且索引文件占用磁盘空间过大,所以已经不推荐使用。
优点:性能高于JDBC
缺点:索引占用磁盘空间量大、重建索引速度非常慢
4、KahaDB方式(默认)
从ActiveMQ 5.4开始默认的持久化方式,KahaDb恢复时间远远小于其前身AMQ并且使用更少的数据文件,所以可以完全代替AMQ。
官网参考文档:http://activemq.apache.org/kahadb
5、LevelDB方式(已废弃)
内嵌型数据库
LevelDB是Google开发的一套用于持久化数据的高性能类库。
LevelDB并不是一种服务,用户需要自行实现Server。是单进程的服务,能够处理十亿级别规模Key-Value型数据,占用内存小。
LevelDB的特点:
基于KV存储(比如吃内存)、Key值有序存储、操作接口简单、支持数据快照、支持数据压缩
LevelDB的结构
ActiveMQ配置LevelDB
6、事务机制
ActiveMQ事务实现机制
ActiveMQ开启事务
参考代码地址:E:\meWork\study\project\subject-2\subject-2-mq\activemq-demo1\src\main\java\com\study\mq\b7_transaction\Consumer.java
事务机制:
http://activemq.apache.org/should-i-use-transactions.html http://activemq.apache.org/how-do-transactions-work.html http://activemq.apache.org/should-i-use-xa.html
消费者功能:
demo地址:E:\meWork\study\project\subject-2\subject-2-mq\activemq-demo1\src\main\java\com\study\mq\b3_consumer
异步分发 http://activemq.apache.org/consumer-dispatch-async.html 独占消费 http://activemq.apache.org/exclusive-consumer.html 优先级消费 http://activemq.apache.org/consumer-priority.html 持久订阅者 http://activemq.apache.org/manage-durable-subscribers.html 消费分组 http://activemq.apache.org/message-groups.html 消息重发 http://activemq.apache.org/redelivery-policy.html 消息追溯 http://activemq.apache.org/retroactive-consumer.html 消息过滤 http://activemq.apache.org/selectors.html 慢消费者处理 http://activemq.apache.org/slow-consumer-handling.html 订阅恢复策略 http://activemq.apache.org/subscription-recovery-policy.html