2.1.2 Activemq

目录

2.1.2.1 amq入门

1、ActiveMQ的定义

2、JMS的定义

3、JMS的对象模型

4、JMS的消息模型

  4.1、点对点

  4.2、发布订阅

5、JMS的消息结构

   5.1 消息头

   5.2 消息属性

   5.3 消息体

6、ActiveMQ的特性

7、安装ActiveMQ

    7.1、下载最新版的activemq5

    7.2、在centos根下创建tmp目录

    7.3、用xftp将下载好的apache-activemq-5.15.11-bin.tar.gz传入tmp目录中

    7.4、提取存档

    7.5、进入activemq的安装目录:cd /var/activemq/

    7.6、修改ActiveMQ的目录名

    7.7、后台进程启动ActiveMQ

    7.8、停止ActiveMQ

8、创建ActiveMQ服务(这个方法还不能创建成功,先记录,等我以后要用时再完善)

    8.1、使用vim创建一个systemd服务文件

    8.2、在activemq.service文件中填入以下内容

    8.3、修改/var/activemq/bin/env配置JAVA_HOME,在配置文件最底部

    8.4、启动ActiveMQ服务

    8.5、查看服务状态

    8.6、设置开机自动启动

9、防火墙添加ActiveMQ的端口

    9.1、添加端口

    9.2、重启防火墙

10、使用ActiveMQ的Web管理平台

    10.1、访问地址

    10.2、Web管理配置

11、在Java中使用ActiveMQ

12、在Spring中使用ActiveMQ

2.1.2.2 amq支持的消息协议讲解

1、ActiveMQ支持哪些协议

2、ActiveMQ的协议连接配置

3、ActiveMQ常用的传输方式及配置

    3.1、TCP

    3.2、SSL

    3.3、NIO

    3.4、UDP

     3.5、HTTP(S)

    3.6、VM

4、 OpenWire协议(常用)

    4.1、OpenWire协议是什么

    4.2、OpenWire协议如何使用

     4.3、OpenWire的配置参数说明

5、 MQTT协议

    5.1、MQTT协议是什么

    5.2、为什么使用MQTT协议

    5.3、MQTT的发布订阅模型 

     5.4、MQTT服务质量

     5.5、Spring使用MQTT

6、 AUTO协议

    6.1、AUTO协议是什么

    6.2、AUTO协议的使用

2.1.2.3 Activemq高可用集群方案

1、 ActiveMQ延时、调度消息使用

    1.1、配置vi activemq.xml(在/var/activemq/conf/目录下)支持调度

2、 ActiveMQ有哪些集群部署方式

    2.1、Master-Slave部署方式

     2.2、Broker-Cluster部署方式

    2.3、Master-Slave与Broker-Cluster相结合部署方式

2.1.2.4 持久化原理及事务机制

1、ActiveMQ持久化方案介绍

2、JDBC方式

3、AMQ方式

4、KahaDB方式(默认)

5、LevelDB方式(已废弃)

6、事务机制


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&param2=val2
        3.5.2、HTTPS配置格式
                https://localhost:8080?param1=val&param2=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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值