原文链接:https://www.jianshu.com/p/ecdc6eab554c
这是关于中间件ActiveMQ的一个系列专题文章,将涵盖JMS、ActiveMQ的初步入门及API详细利用、两种经典的模式(PTP and Pub/Sub)、与Spring整合、ActiveMQ集群、监控与配置优化等。话不多说,我们来一起瞧一瞧!
首先来说较早以前,也便是没有JMS的那个时候,很多运用系统存在一些毛病:

1.通信的同步性
client端发起调用后,必须等待server处理完成并返回结果后才能连续实行
2.client 和 server 的生命周期耦合太高
client进程和server做事进程都必须可用,如果server涌现问题或者网络故障,那么client端会收到非常
3.点对点通信
client真个一次调用只能发送给某一个单独的做事工具,无法一对多
JMS,即Java Message Service,通过面向中间件(MOM:Message Oriented Middleware)的办法很好的办理了上面的问题。大致的过程是这样的:发送者把发送给做事器,做事器将存放在多少行列步队/主题中,在得当的时候,做事器会将转发给接管者。在这个过程中,发送和接管是异步的,也便是发送无需等待,而且发送者和接管者的生命周期也没有一定关系;在pub/sub模式下,也可以完成一对多的通信,即让一个有多个接管者。
JMS
须要把稳的是,JMS只是定义了Java访问中间件的接口,实在便是在包javax.jms中,你会创造这个包下除了非常定义,其他都是interface。我们可以扫一眼,比如Message:
Message接口
我想你该当创造了,JMS只给出接口,然后由详细的中间件去实现,比如ActiveMQ便是实现了JMS的一种Provider,还有阿里巴巴的RocketMQ(后续专题中在为大家先容)。这些中间件都符合JMS规范。提及规范,自然要定义一些术语:
Provider/MessageProvider:生产者
Consumer/MessageConsumer:消费者
PTP:Point To Point,点对点通信模型
Pub/Sub:Publish/Subscribe,发布订阅模型
Queue:行列步队,目标类型之一,和PTP结合
Topic:主题,目标类型之一,和Pub/Sub结合
ConnectionFactory:连接工厂,JMS用它创建连接
Connnection:JMS Client到JMS Provider的连接
Destination:目的地,由Session创建
Session:会话,由Connection创建,本色上便是发送、接管的一个线程,因此生产者、消费者都是Session创建的
初步来看,Session非常核心,由于很多东西都是它创建的,在后文中可以通过代码来进一步认识这些术语。
ActiveMQ QuickStartActiveMQ是Apache出品的,非常盛行的中间件,可以说要节制中间件,须要从ActiveMQ开始,要节制更加强大的RocketMQ,也须要ActiveMQ的根本,因此我们来搞定它吧。官网地址:http://activemq.apache.org/,目前最新的版本是5.14.4,我这边将以最新版来讲解。这篇文章紧张是ActiveMQ的初步,因此我这边暂时用windows版本,后期采取Linux。
ActiveMQ目录构造
bin下面存放的是ActiveMQ的启动脚本activemq.bat,把稳分32、64位
conf里面是配置文件,重点关注的是activemq.xml、jetty.xml、jetty-realm.properties。在登录ActiveMQ Web掌握台须要用户名、密码信息;在JMS CLIENT和ActiveMQ进行何种协议的连接、端口是什么等这些信息都在上面的配置文件中可以表示。
data目录下是ActiveMQ进行持久化存放的地方,默认采取的是kahadb,当然我们可以采取leveldb,或者采取JDBC存储到MySQL,或者干脆不该用持久化机制。
webapps,把稳ActiveMQ自带Jetty供应Web管控台
lib中ActiveMQ为我们供应了分功能的JAR包,当然也供应了activemq-all-5.14.4.jar
在JDK安装没有问题的情形下,直接activemq.bat启动它,并访问Web掌握台!
ActiveMQ Start
到这里,ActiveMQ就已经启动了,So easy~
访问ActiveMQ web掌握台的用户名、密码在哪里配置的?URL当中的端口是在哪里配置的?
username/pwd 4 access web
port 4 web console
Write Code 4 ActiveMQ来一个HelloWorld级别的例子,来感想熏染下ActiveMQ。详细来说,我这边会写一个生产者用于发送,一个消费者用于吸收。实际上,JMS是有“套路”的,下面我将以生产者为例详细解释。
第一步:创建ConnectionFactory连接工厂
ConnectionFactory
实际上,这里是存在安全隐患的,也便是任何人一旦知道MQ的地址,就可以连接访问了,我们可以在activemq.xml中配置指定的用户、密码才能访问ActiveMQ。
关于broker_bind_url,默认便是tcp://localhost:61616,解释是采取TCP协议,61616端口。实在对付ActiveMQ不仅仅支持TCP协议,还有其他协议,开启了多个端口。
第二步:创建Connection
Connection
Connection就代表了运用程序和做事器之间的通信链路。得到了连接工厂后,就可以创建Connection。
事实上,ConnectionFactory存在重载方法:
Connection createConnection(String username,String password)
也便是说我们也可以在这里指定用户名、密码进行验证
第三步:创建Session
Session
Session,用于发送和接管,而且是单线程的,支持事务的。如果Session开缘由务支持,那么Session将保存一组信息,要么commit到MQ,要么回滚这些。Session可以创建MessageProducer/MessageConsumer。
第四步:创建Destination
Destination
所谓目标,便是发送和接管的地点,要么queue,要么topic。
第五步:创建MessageProducer
MessageProducer
第六步:设置持久化办法
持久化办法设置
第七步:定义工具,并发送
Message
生产者和消费者之间通报的工具,由3个紧张部分构成:
头(路由)+属性(选择器,往后先容)+体(JMS规范的5种类型)
类型
第八步:开释连接
release resource
必须close connection,只有这样ActiveMQ才会开释资源!
消费者的代码和上面非常类似,只不过便是创建MessageConsumer进行receive而已,把稳receive()/receive(long)/receiveNoWait(),这些解释消费者可以采取壅塞模式、非壅塞模式接管。
程序运行后,我们来看一下管控台:
ActiveMQ Web Info
Messages Enqueued:表示生产了多少条,记做P
Messages Dequeued:表示消费了多少条,记做C
Number Of Consumers:表示在该行列步队上还有多少消费者在等待接管
Number Of Pending Messages:表示还有多少条没有被消费,实际上是表示的积压程度,便是P-C
在说说Session在通过Connection创建Session的时候,须要设置2个参数,一个是否支持事务,另一个是签收的模式。我们重点说一下签收模式:
签收模式
什么是签收?普通点说,便是消费者接管到后,须要见告做事器,我收到了。当做事器收到回执后,本条将失落效。因此签收将对PTP模式产生很大影响。如果消费者收到后,并不签收,那么本条连续有效,很可能会被其他消费者消费掉!
AUTO_ACKNOWLEDGE:表示在消费者receive的时候自动的签收
CLIENT_ACKNOWLEDGE:表示消费者receive后必须手动的调用acknowledge()方法进行签收
DUPS_OK_ACKNOWLEDGE:签不签收无所谓了,只要消费者能够容忍重复的接管,当然这样会降落Session的开销
在实际中,我们该当采取哪种签收模式呢?CLIENT_ACKNOWLEDGE,采取手动的办法较自动的办法可能更好些,由于吸收到了,并不虞味着成功的处理了,假设我们采取手动签收的办法,只有在成功处理的条件下才进行签收,那么只要处理失落败,那么还有效,仍旧会连续消费,直至成功处理!
有优先级及存活韶光,在MessageProducer进行send的时候,存在多个重载方法,我们来看一下:
send
在上面的code当中,我们创建生产者的时候,指定了Destination,设置了持久化办法,实际上这些都可以不必指定的,而是到send的时候指定。而且在实际业务开拓中,每每根据各种判断,来决定将这条发往哪个Queue,因此每每不会在MessageProducer创建的时候指定Destination。
TTL,的存活韶光,一句话:生产者生产了,如果消费者不来消费,那么这条保持多久的有效期
priority,优先级,0-9。0-4是普通,5-9是加急,默认级别是4。把稳,优先级只是一个理论上的观点,并不能绝对担保优先级高的一定被消费者优先消费!
也便是说ActiveMQ并不能担保消费的顺序性!
deliveryMode,如果不指定,默认是持久化的。如果可以容忍的丢失,那么采取非持久化的办法,将会改进性能、减少存储的开销。
OK,Do you get it? Good Night~See u next time~