一.JMS组成的四大元素
1.JMS provider 实现JMS接口和规范的消息中间件,也就是我们MQ的服务器。
2.JMS producer 消息生产者,创建和发送JMS消息的客户端应用
3.消息消费者,接收和处理JMS消息的客户端应用
4.JMS message 它又包含3部分,消息头,消息属性 ,消息体
消息头5大常用
1.JMSDestination 消息发送的目的地,主要是指Queue和Topic
2.JMSDeliveryMode 持久模式和非持久模式,一条持久性的消息:应该被传送“一次仅仅一次”,这就意味着如果JMS提供者出现故障,该消息并不会丢失,它会在服务器恢复之后再次传递
一条非持久化的消息,最多会传送一次,这意味着如果服务器出现故障,该消息将永远丢失
3.JMSExpiration 可以设置消息在一定时间后过期,默认是永不过期,消息过期时间,等于Destination 的send 方法中的timeToLive值加上发送时刻的GMT时间值,如果timeToLive值等于零,则JMSExpiration被设为零,表示该消息永不过期。如果发送后,在消息过期时间后消息还没有被发送到目的地,则该消息被清除
4.JMSPriority 消息优先级,从0-9十个级别,0到4是普通消息,5到9是加急消息。JMS不要求MQ严格按照这十个优先级发送消息,但必须保证加急消息要先于普通消息到达,默认是4级。
5.JMSMessageID 唯一识别每个消息的标识由MQ产生
5种消息体格式
1.TextMessage 普通字符串消息,包含一个String
2.MapMessage 一个Map类型的消息,key为String,而值为java对象
3.BytesMessage 二进制数组消息,包含一个byte[]
4.StreamMessage Java数据流消息,用标准流操作来顺序的填充
5.ObjectMessage 对象消息,包含一个可序列化的操作对象
消息属性
1.如果需要除消息头字段以外的值,那么可以使用消息属性。识别/去重/重点标注等操作非常有用的方法
他们是以属性明和属性值对的形式制定的,可以将属性是为消息头的扩展,属性指定一些消息头没有包括的附加信息,比如可以在属性李指定消息选择器。消息的属性就像可以分配给一条消息的附加消息头一样,它们允许开发者添加有关消息的不透明附加信息,它们还用于暴露消息选择器在消息过滤时使用的数据
TextMessage message = session.createTextMessage();
message.setText(text);
message.setStringProperty("username","z3"); 自定义属性
队列的持久性
1.非持久 messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
非持久化:当服务器宕机,消息不存在
2.持久 messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
持久化:当服务器宕机,消息仍然存在
默认是持久化的
持久化的topic
1.一定要先运行一次消费者,等于向MQ注册,类似我订阅了这个主题
2.然后再运行生产者发送信息,此时,无论消费者是否在线,都会接收到,不在线的话,下次连接的时候,会把没有收过的消息都接收下来。
事务偏生产者,签收偏消费者
producer提交时的事务
1.如果事务是false,只要执行send,消息就会进入到队列中。
2.如果事务为true,先执行send 再执行commit,即session.commit()方法,消息才会被真正的提交到队列中。
consumer提交时的事务
1.如果事务时false,只会消费1次,是安全的。
2.如果事务是true,必须执行session.commit()方法,否则会重复消费,很危险。
消费者签收模式
消费者事务为false:
1.自动签收(默认) Session.AUTO_ACKNOWLEDGE
2.手动签收 Session.CLIENT_ACKNOWLEDGE,那就需要执行acknowlede方法手动签收,例如textMessage.acknowledge();否则会重复消费,很危险
消费者事务为true,那就必须commit,否则还是会重复消费。
就会认为你自动签收了,Session.CLIENT_ACKNOWLEDGE可以不需要执行acknowde方法
总结:签收和事务关系,在事务性会话中,当一个事务被成功提交则消息被自动签收,如果事务回滚,则消息会被再次传送。非事务性会话中,消息何时被确定取决于创建会话时的应答模式。
JMS的点对点总结
点对点模型时基于队列的,生产者发消息到队列,消费者从队列接收消息,队列的存在使得消息的异步传输成为可能,和我们平时给朋友发送短信类型。
1:如果在Session关闭时部分消息已被手收到但还没有被签收(acknowledged),那当消费者下次连接到相同的队列时,这些消息还会被再次接收
2:队列可以长久地保存消息直到消费者收到消息,消费者不需要因为担心消息会丢失而时刻和队列保持激活的连接状态,充分体现了异步传输模式的优势。
JMS的发布订阅总结:
1.非持久订阅:只有当客户端处于激活状态,也就是和MQ保持连接状态才能收到发送到某个主题的消息,如果消费者处于离线状态,生产者发送的主题消息将会丢失作废,消费者永远不会收到。一句话:先要订阅注册才能接受到发布,只给订阅者发布消息。
2.持久订阅: 客户端首先向MQ注册一个自己的身份ID识别号,当这个客户端处于离线时,生产者会为这个ID保存所有发送到主题的消息,当客户再次连接到MQ会根据消费者的ID得到所有当自己处于离线时发送到主题的消息。非持久订阅状态下,不能恢复或重新派送一个未签收的消息。持久订阅才能恢复或重新派送一个未签收的消息。