消息中间件产生的背景
1、在客户端与服务器进行通讯时,客户端调用后,必须等待服务对象完成处理返回结果才能继续执行,这个过程是基于请求与响应的同步过程。
2、客户与服务器对象的生命周期紧密耦合,客户进程和服务对象进程都都必须正常运行;如果由于服务对象崩溃或者网络故障导致用户的请求不可达,客户会受到异常。
3、点对点通信: 客户的一次调用只发送给某个单独的目标对象。
JMS是什么?
JMS是J2EE的13个规范之一,提供的是消息中间件的规范。
JMS只是消息服务的一组规范和接口,并没有具体的实现,而ActiveMQ就是JMS规范的具体实现
activeMQ是什么?
是Apache公司旗下的一个消息总线
ActiveMQ是一个开源兼容Java Message Service (JMS) 1.1面向消息的中件间. 来自Apache Software Foundation. ActiveMQ提供松耦合的应用程序架构.
activeMQ能干什么?
用来在服务与服务之间进行异步通信的
activeMQ优势
1.流量肖锋
2.任务异步处理
特点:可以解耦合
消息通信机制:
所有MQ基本都分为两种,
1.点对点模式,(PTP模式),他的目的地对象是queue队列;
》一个消息只能被一个服务接收
》消息一旦被消费,就会消失
》如果没有被消费,就会一直等待,直到被消费
》多个服务监听同一个消费空间,先到先得
2.发布/订阅模式(Pub/Sub模式),每个消息可以有多个消费者,而且订阅一个主题的消费者,只能消费自它订阅之后发布的消息。
》一个消息可以被多个消费者接收
》订阅一个主题的消费者,只能消费自它订阅之后发布的消息。
》消费端如果在生产端发送消息之后启动,是接收不到消息的,除非生产端 对消息进行了持久化(例如广播,只有当时听到的人能听到信息)
详细代码参考:https://www.jianshu.com/p/3a29b032827a
Transport是什么?
从broker的角度来看,transportConnector是用于接受和监听来自客户端的连接请求的一种机制
从客户端的角度来看,transportConnector的URI是用于和broker建立连接,以通过该连接来发送和接受消息
ActiveMQ支持的client-broker通讯协议如下:
1:TCP:这个也是缺省使用的协议
2:NIO
3:UDP
4:SSL
5:Http (s)
6:VM:如果客户端和broker在一个虚拟机内的话,通过VM协议通讯在VM内通讯,从而减少网络传输的开销
producer发送消息有同步和异步两种模式,可以通过代码配置:
((ActiveMQConnection)connection).setUseAsyncSend(true);
producer默认是异步发送消息。在没有开启事务的情况下,producer发送持久化消息是同步的,调用send会阻塞直到broker把消息保存到磁盘并返回确认。
消息设置为持久:
MessageProducer producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
消息设置为非持久:
MessageProducer producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
AMQ Message Store 是什么?
消息存储机制默认的activemq消息存储是通过一个所谓的AMQ Message Store来完成。
AMQ Message Store是一个高效的可嵌入支持事务的消息存储解决方案。
在此方案下消息(Message)本身以日志的形式实现持久化,存放在Data Log里。并且还对日志里的消息做了引用索引,方便快速取回Message。
一般情况下消息索引存放于内存(Cache)中,MQ Server定期将索引内容持久化,存放到Reference Store。
Message Data Log文件是有容量限制的,默认是32MB,可自行配置容量。当该Data Log文件里所有消息都被消费完的时候,Data Log文件就会被加上一个标记,通知下一次消息清理时可以被处理掉(处理方式可以是delete或是转移到Achieve目录)。
确认机制共有四种:
(1)、Session.AUTO_ACKNOWLEDGE;客户(消费者)成功从receive方法返回时,或者从MessageListener.onMessage方法成功返回时,会话自动确认消息,然后自动删除消息.
(2)、Session.CLIENT_ACKNOWLEDGE;客户通过显式调用消息的acknowledge方法确认消息,。 即在接收端调用message.acknowledge();方法,否则,消息是不会被删除的.
(3)、Session. DUPS_OK_ACKNOWLEDGE ;不是必须确认,是一种“懒散的”消息确认,消息可能会重复发送,在第二次重新传送消息时,消息头的JMSRedelivered会被置为true标识当前消息已经传送过一次,客户端需要进行消息的重复处理控制。
(4)、 Session.SESSION_TRANSACTED;事务提交并确认。