消息队列ActiveMQ介绍
JMS全称:Java Message Service中文:Java消息服务。JMS是java的一套API标准,最初的目的是为了是应用程序能够访问现有的MOM系统(MOM是Message Oriented Middleware英文的缩写,指的是利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。) 后来被许多现有的MOM供应商采用,并实现为MOM系统。【常见的MOM系统包括Apache的ActiveMQ、阿里巴巴的RocketMQ、IBM的MQSeries、Microsoft的MSMQ、BEA的RabbitMQ等。(并非全部的MOM系统都遵循JMS规范)】注意:JMS是一个标准名称,MOM是一套系统名称,这套系统指的就是上面所说的利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成;而随后各大企业研发了属于自己的MOM系统,并重新命名,例如Apache研发的ActiveMQ,阿里巴巴的RoketMQ等。
“消息”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,包含嵌入对象。消息被发送到队列中。“消息队列”是在消息的传输过程中保存消息的容器,消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接受者不可用,消息队列会保留消息,直到成功地传递给消息处理者(接收人)。
消息队列的主要特点是异步处理,主要目的是减少请求响应的时间和解耦。所以主要的使用场景就是将比较耗时而且不需要即时“同步”返回结果的操作作为消息然后将该消息放入“消息队列”。同时由于使用了消息队列,只要保证消息格式不变,消息的发送方和接收方并不需要彼此联系,也不需要受对方的影响,即解耦合。如:跨系统的异步通信,所有需要异步交互的地方都可以使用消息队列。就像我们除了打电话(同步)以外,还需要发短信,发电子邮件(异步)的通讯方式。多个应用之间的耦合,由于消息是平台无关和语言无关的,而且语义上也不再是函数调用,因此更适合作为多个应用之间的松耦合的接口,基于消息队列的耦合,不需要发送方和接收方同时在线。
在企业应用集成(EAI)中,文件传输,共享数据库,消息队列,远程过程调用都可以作为集成的方法。应用内的同步变异步,比如订单处理,就可以由前端应用将订单信息放到队列,后端应用从队列里依次获得消息处理,高峰期时的大量订单可以积压在队列中慢慢被处理掉。由于同步通常以为着阻塞,而大量线程的阻塞会降低计算机的处理能力。
消息驱动和架构(EDA),系统分解为消息队列,和消息制造者以及消息消费者,一个处理流程可以根据需要拆成多个阶段(Stage),阶段之间用队列连接起来,前一个阶段处理的结果放入队列,后一个阶段从队列中获取消息继续处理。应用需要更灵活的耦合方式,如发布订阅,比如可以指定路由规划。跨局域网,甚至跨城市的通讯,比如北京机房与广州机房的应用程序通信。
ActiveMQ的特性
1.多种语言和协议编写的客户端。语言:Java,C,C++,C#,Ruby,Perl,Python,PHP。应用协议:Openwire,Stomp REST,WS Notification,XMPP,AMQP。
2.对Spring的支持。ActiveMQ可以很容易内嵌到使用Spring的系统里面去通过了常见J2EE服务器(如 Geronimo,JBoss 4,GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上
3.支持多种传输协议。in-VM,TCP,SSl,NIO,UDP,JGroups,JXTA,支持通过JDBC和journal提供高速的消息持久化
4.从设计上保证了高性能的集群。客户端-服务器,点对点
5.支持Ajax
6.支持Axis的整合,WebServices
7.可以很容易的调用内嵌JMS provider,进行测试
ActiveMQ的应用场景
1.多个项目之间集成 (1)跨平台 (2)多语言 (3)多项目
2.降低系统间模块的耦合度,解耦 (1)软件扩展性
3.系统前后端隔离 (1)前后端隔离,屏蔽高安全区
ActiveMQ名词简介
Destination 目的地,JMS Provider(消息中间件)负责维护,用于对Message进行管理的对象。MessageProducer需要指定Destnation才能发送消息,MessageConsumer需要指定Destination才能接收消息。
Producer 消息生成者(客户端、负责生成消息),负责发送Message到目的地。应用接口为MessageProducer。在JMS规范中,所有的标准定义都在javax.jms包中。*
Consumer【Receiver】 消息消费者(负责处理消息),负载从目的地中消费【处理|监听|订阅】Message。应用接口为MessageConsumer。
Message 消息(Message),消息封装一次通信的内容。常见类型有:StreamMessage(流信息)、BytesMessage(字节信息)、TextMessage(文本信息)、ObjectMessage(对象信息)、MapMessage(图信息)。
ConnectionFactory 连接工厂,用于创建链接的工厂类型。注意,不能和JDBC中的ConnectionFactory混淆。
Connection 链接,用于建立访问ActiveMQ连接的类型,由链接工厂创建,注意,不能和JDBC中的Connection混淆。
Session 会话,一次持久有效有状态的访问,由链接创建,是具体操作信息的基础支撑。
Queue & Topic Queue是队列目的地,Topic是主题目的地。都是Destnation的子接口。(1)Queue特点:队列中的消息,默认只能由唯一的一个消费者处理。一旦被消息消费者消费,存储在消息队列中的信息立刻被删除。(2)Topic特点:主题中的消息,会发送给所有的消费者同时处理。只有在消息可以重复处理的业务中场景中可使用。
PTP Point to Point。点对点消息模型。就是基于Queue实现的消息处理方式。
PUB & SUB Publish & Subscribe。消息的发布/订阅模型。是基于Topic实现的消息处理方式。
PTP处理模式(Queue)
1.消息生产者生产消息发送到queue中,然后消息消费者从Queue中取出并且消费信息。
2.消息被消费以后,Queue中不在有存储,所有消息消费者不可能消费到已经被消费的信息。
3.Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消息,其它的则不能消费此信息了。
4.当消费者不存在时,消息会一直保存,直到有消费消费。
Publish/Subscribe处理模式
1.消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该信息。2.和点对点方式不同,发布到topic的消息会被所有订阅者消费。3.当生产者发布消息,不管是否有消费者。都不会报错信息 4.一定要先有消息的消费者,后有消息的生产者
PTP和PUB/SUB简单对比
下载资源
ActiveMQ下载页面:http://activemq.apache.org/download.html
JDK下载页面:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
注意:版本说明
ActiveMQ5.10.x以上版本必须使用JDK1.8才能正常使用。
ActiveMQ5.9.x及以下版本使用JDK1.7即可正常使用。
上传服务器
在此我们使用JDK版本:jdk-8u191-linux-x64.tar.gz
在此我们使用的ActiveMQ版本:apache-activemq-5.15.6-bin.tar.gz
解压安装
[root@CentOS src]# tar xf jdk-8u191-linux-x64.tar.gz
[root@CentOS src]# tar xf apache-activemq-5.15.6-bin.tar.gz
[root@CentOS src]# mv jdk1.8.0_191 /usr/local/java
[root@CentOS src]# mv apache-activemq-5.15.6 /usr/local/activemq
[root@CentOS src]# tail -1 /etc/profile
export PATH=/usr/local/java/bin:$PATH
[root@CentOS src]# source /etc/profile
[root@CentOS src]# java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
activemq文件简介
[root@CentOS /]# ls /usr/local/activemq/
activemq-all-5.15.6.jar conf docs lib NOTICE tmp webapps-demo
bin data examples LICENSE README.txt webapps
activemq-all-5.15.6.jar:Java开发客户端的jar包
webapps:activemq提供了一个网页管理的控制台,http://127.0.0.1:8161/admin可以访问到,可以放置web的程序目录
webapps-demo:activemq提供了一些基础案
lib:是activemq依赖的jar包文件
examples:apache提供了一个案例代码
docs:帮助文档
data:activemq默认用来存储数据的位置
conf:配置文件
bin:二进制文件,用来启动、关闭、重启activemq的控制文件
配置文件简介
[root@CentOS /]# ls /usr/local/activemq/conf/
activemq.xml client.ks groups.properties jmx.access login.config
broker.ks client.ts java.security jmx.password users.properties
broker-localhost.cert credentials-enc.properties jetty-realm.properties log4j.properties
broker.ts credentials.properties jetty.xml logging.properties
activemq.xml: activemq的主配置文件,就是spring配置文件. 其中配置的是ActiveMQ应用使用的默认对象组件.transportConnectors标签,配置链接端口信息的。其中的端口号61616是ActiveMQ对外发布的tcp协议访问端口. 就是java代码访问ActiveMQ时使用的端口
jetty.xml: spring配置文件, 用于配置jetty服务器的默认对象组,件jetty是类似tomcat的一个中间件容器。ActiveMQ默认支持一个网页版的服务查看站点. 可以实现ActiveMQ中消息相关数据的页面查看.8161端口, 是ActiveMQ网页版管理站点的默认端口。在ActiveMQ网页版管理站点中,需要登录, 默认的用户名和密码都是admin。
users.properties: 是用于配置客户端通过协议访问ActiveMQ时,使用的用户名和密码。格式为:用户名=密码
groups.properties: 是用于配置客户端通过协议访问ActiveMQ时,使用的组名和用户名。格式为:组名=用户名
jetty-realm.properties: 为jetty.xml网页控制台所用到配置文件 该文件内关联了登录web网页控制台的用户名密码
启动ActiveMQ
[root@CentOS /]# /usr/local/activemq/bin/activemq start
INFO: Loading '/usr/local/activemq//bin/env'
INFO: Using java '/usr/local/java/bin/java'
INFO: Starting - inspect logfiles specified in logging.properties and log4j.properties to get details
INFO: pidfile created : '/usr/local/activemq//data/activemq.pid' (pid '3637')
注意:ActiveMQ启动需要拉起jetty中间件,该中间件启动较慢,请耐心等待......
启动好了之后,会出现以下端口,里面的8161为web页面所提供默认的web访问端口,如需修改请修改jetty.xml文件
[root@CentOS /]# ss -anplt | grep java
LISTEN 0 50 :::8161 :::* users:(("java",pid=3637,fd=141))
LISTEN 0 50 :::37253 :::* users:(("java",pid=3637,fd=13))
LISTEN 0 128 :::5672 :::* users:(("java",pid=3637,fd=131))
LISTEN 0 128 :::61613 :::* users:(("java",pid=3637,fd=132))
LISTEN 0 50 :::61614 :::* users:(("java",pid=3637,fd=134))
LISTEN 0 128 :::61616 :::* users:(("java",pid=3637,fd=126))
LISTEN 0 128 :::1883 :::* users:(("java",pid=3637,fd=133))
测试访问jetty所提供的web控制台
•控制台地址:http://IP:8161/admin
•默认用户名和密码都为admin
1.ActiveMQ网页状态栏内容介绍
2.Home:主页面,有欢迎界面,broker标签介绍,一些基础信息
3.Queues:队列的详细信息,包含了待处理消息数量、消费者数量、消息队列、已消费信息等
4.Topics:主题的详细信息,包含了消费者数量、消息队列和Queues差不多
5.Subscribers:订阅者,专门用于检查发布/订阅的端口
6.connections:连接,查看ActiveMQ所有支持的协议的连接数量等信息
7.Network:网络,有关于远程网络的标签,远程网络地址等信息
8.Scheduled:调动程序,可以理解为定时任务
9.Send:发送,测试发送消息的功能,里面包含了模拟发送消息的目的地、相关ID、回复、类型、消息组、延迟时间(毫秒)、重复次数、要发送的消息数量等等
测试Web页面Send功能
发送过之后会自动跳到Queue或者Topic,取决于你发送的消息类型,更多功能请自行测试