【知识积累】(一)、消息中间件 - JMS
一、JMS定义
JMS(Java Message Server)即Java消息服务应用程序接口,是一个Java平台中关于面向消息中间件(MOM:Message Oriented Middleware)的API,用于两个应用程序之间,或分布式系统中发送消息,进行异步通信。JMS是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。我们可以简单的理解:两个应用程序之间的需要进行通信,我们使用JMS服务,进行中间的转发,通过JMS的使用,我们可以解除两个程序之间的耦合。
也是J2EE的13个规范之一,提供的是消息中间件的规范。
二、优点
1、异步
JMS是一个异步的消息服务,客户端获取消息的时候,不需要主动发送请求,消息会自动发送给可用的客户端。
2、可靠
JMS保证消息只会发送一次,解决重发创建消息问题。
三、通信模式(两种通信模式互相独立)
1、点对点模式(point - to - point)
由Queue、发送方、接收方组成,发送方将消息发送对Queue,接收方从Queue获取消息。队列保存消息,直到该消息被消费或超时。
特点:
每个消息只有一个消费者,只能消费一次;
发送者发送消息的过程中,不管消费者是否接收,都不影响发送者。
接收方接收到消息后,需要向Queue Reply。
2、发布/订阅模式(Publish/Subscribe)
由Topic、发布者、订阅者组成,发布者和订阅者互不影响,并且可以动态的发布和订阅Topic,Topic用于保存和传送消息。
特点:
每个消息可以有多个消费者,而且订阅一个Topic的消费者,只能消费它订阅之后发布的消息;
发布者和订阅者,具有时间约束。订阅Topic,需要先创建消费者,才能消费,并且消费者需要一直处于运行状态;
JMS允许创建一个可持久的订阅者,即使订阅者没有运行,也可接收到消息。
四、JMS接收消息
消息产生和消费是异步,消费有两种方式:
1、同步
订阅者或者接收方通过receive()方法来接收消息。在receive方法中,线程会阻塞直到消息到达或者到指定时间后消息未到达。
2、异步
消息订阅者需要注册一个消息监听器,类型于事件监听器,只要消息到达,JMS服务提供者会通过调用监听器的onMessage()传送消息。
五、JMS编程模型
1、ConnectionFactory
创建链接工厂,针对两种通信模式,分别有QueueConnectionFactory和TopicConnectionFactory两种。
创建了一个链接,连接Producer和Consumer,Producer或者Consumer会在JNDI名字空间中搜索并获取该链接,使用这个链接,完成消息的传送。
2、Connection
对TCP/IP Socket的包装。可以创建一个或多个Session,和ConnectionFactory一样,Connection分为QueueConnection和TopicConnection两种。
3、Session
对消息进行操作的API,可以创建Producer、Consumer、Message等。Session提供事务功能,使用Session发送或接收多个Message时,可以将这些操作放到一个事务中。
消息确认机制:
Session.AUTO_ACKNOWLEDGE:直接使用receive方法;
Session.CLIENT_ACKNOWLEDGE:通过消息的acknowledge方法确认消息;
Session.DUPS_ACKNOWLEDGE:会话迟钝确认消息的提交。如果JMS provider失败,出现重复消息,那么JMS必须把消息头的JMSRedeliverd字段设置为true。
4、Destination
消息被发送的目的地以及客户端接受消息的来源。目的地分为Queue和Topic两种。
5、Producer
由Session创建,用于往Destination发送消息。
6、Consumer
由Session创建,用于接收被发送到Destination的Message。