vlambda博客
学习文章列表

初识消息队列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.支持Ajax6.支持Axis的整合,WebServices7.可以很容易的调用内嵌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.当消费者不存在时,消息会一直保存,直到有消费消费。

初识消息队列ActiveMQ

Publish/Subscribe处理模式

1.消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该信息。2.和点对点方式不同,发布到topic的消息会被所有订阅者消费。3.当生产者发布消息,不管是否有消费者。都不会报错信息 4.一定要先有消息的消费者,后有消息的生产者

初识消息队列ActiveMQ

PTP和PUB/SUB简单对比

初识消息队列ActiveMQ

下载资源

ActiveMQ下载页面:http://activemq.apache.org/download.htmlJDK下载页面: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/profileexport PATH=/usr/local/java/bin:$PATH[root@CentOS src]# source /etc/profile[root@CentOS src]# java -versionjava 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.jarJava开发客户端的jarwebappsactivemq提供了一个网页管理的控制台,http://127.0.0.1:8161/admin可以访问到,可以放置web的程序目录webapps-demoactivemq提供了一些基础案lib:是activemq依赖的jar包文件examplesapache提供了一个案例代码docs:帮助文档dataactivemq默认用来存储数据的位置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 detailsINFO: pidfile created : '/usr/local/activemq//data/activemq.pid' (pid '3637')
注意:ActiveMQ启动需要拉起jetty中间件,该中间件启动较慢,请耐心等待......启动好了之后,会出现以下端口,里面的8161web页面所提供默认的web访问端口,如需修改请修改jetty.xml文件[root@CentOS /]# ss -anplt | grep javaLISTEN 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控制台

初识消息队列ActiveMQ
初识消息队列ActiveMQ

测试Web页面Send功能

初识消息队列ActiveMQ

发送过之后会自动跳到Queue或者Topic,取决于你发送的消息类型,更多功能请自行测试

初识消息队列ActiveMQ