前几天组长面试别人的时候问了些关于JMS的问题,后来顺便问了我一下。hmmm没接触过这技术当然是一脸懵逼,所以索性花了点时间上网搜了一下相关的内容然后自己总结一下。
什么是JMS?
JMS是Java消息中间件服务的应用程序接口,用于Java平台中应用程序之间的异步通信。到这里想提一下MQ,MQ是应用程序对应用程序之间的通信方法,是遵循AMQP协议的具体实现和产物。
如何消费JMS产生的消息?
JMS中消息的产生和消费是异步的。但是消息被消费的方式有2种。
1.同步的消息消费方式。
消息接收者调用receive方法接收信息,在接到消息之前(或者超时前)一直阻塞。
2.异步的消息消费方式。
消息接收者注册消息监听器,消息到达后调用监听器的onMessage方法。
消息消费模型
1.点对点模型
每个消息只有一个接收者,发送者和接收者没有依赖关系。接收者接收成功有反馈信息。
如果希望每个消息都被成功处理应该使用该模型。
2.发布/订阅模型
每个消息可以有多个接收者,有时间依赖,必须订阅之后才能消费消息。
因此订阅者必须要一直处于在线状态。
允许创建持久化订阅,使没有激活的订阅者也能收到消息。
JMS对象模型
一般一个JMS对象模型包括以下几个元素。
1.ConnectionFactory
用于创建发送端和接收端之间连接的工厂类。针对不同的消息模型有 QueueConnectionFactory和TopicConnectionFactory,也可以在Tomcat的context.xml中配置然后通过JNDI来查找。
PS:JNDI是一个标准规范,类似JDBC,JMS等规范,为开发人员提供了查找和访问各种命名和目录服务的通用、统一接口。
2.Connection
发送端和接收端之间建立的连接,根据消息模型不同可以使用QueueConnection或者TopicConnection。用于创建Session。
3.Session
操作消息的接口。可以通过session创建生产者、消费者、消息等等。提供事务功能用于发送/接收多个消息。也分QueueSession和TopicSession。
4.Sender
由Sessoin创建,将消息发送到destination。根据消息模型不同可以使用QueueSender或者TopicPublisher。
5.Receiver
由Session创建,接收Destination发来的信息。根据消息模型不同可以使用QueueReceiver或者TopicSubscriber。可以通session的createDurableSubscriber方法来创建持久化的订阅者。
6.Destinatoin
消息生产者的发送目标或者消息接受者的消息来源。 实际上就是Queue、Topic的对象。
7.MessageListener
消息监听器。如果注册监听器,一旦消息达到就自动调用onMessage方法。
JMS提供五种不同的消息正文格式用于消息的发送以及接收。
1.StreamMessage -> 数据流消息
2.MapMessage -> 键值对消息
3.TextMessage -> 字符串消息
4.ObjectMessage -> 序列化对象消息
5.BytesMessage ->未解释字节数据流消息