首页 > 其他 > 详细

JMS-消息服务

时间:2021-02-28 00:22:26      阅读:28      评论:0      收藏:0      [点我收藏+]

1.什么是java消息服务

  java消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口

  包括创建、发送、读取消息等,用于支持JAVA应用程序开发。

  在JavaEE中,当两个应用程序使用JMS进行通信时,它们之间并不是直接相连的,而是通过一个共同的消息收发

  服务组件关联起来以达到解耦/异步削峰的效果。

  技术分享图片

 

 2.JMS的组成结构和特点

  JMS provider

    实现JMS接口和规范的消息中间件,其中就是MQ服务器

  JMS producer

    消息生产者,创建和发送JMS消息的客户端应用

  JMS consumer

    消息消费者,接收和处理JMS消息的客户端应用

  JMS message

    消息头

      JMSDestination

        消息发送的目的地,主要是指Queue和Topic

      JMSDeliveryMode

        持久模式和非持久模式

        一条持久性的消息:应该被传送”一次仅仅一次“,这就意味着如果JMS提供者出现故障,该消息并不会丢失,它会在服务器恢复之后再次传递

        一条非持久的消息:最多会传送一次,这意味服务器出现故障,该消息将永远丢失

      JMSExpiration

        可以设置消息在一定时间后过期,默认是永不过期

        消息过期时间,等于Destination的send方法中的timeToLive值加上发送时刻的GMT时间值

        如果timeToLive值等于零,则JMSExpiration被设为零,表示消息永不过期

        如果发送后,在消息过期时间之后,消息还没有被发送到目的地,则该消息被清除

      JMSPriority

        消息优先级,从0-9十个级别,0-4是普通消息,5-9是加急消息

        JMS不要求MQ严格按照这十个优先级发送消息,但必须保证加急消息要先于普通消息到达。默认是4级

      JMSMessageID

        唯一识别每个消息的标识由MQ产生

    消息体

      封装具体的消息数据

      5种消息体格式

        TextMessage

          普通字符串消息,包含一个string

        MapMessage

          一个Map类型的消息,key为string类型,而值为JAVA的基本类型

        BytesMessage

          二进制数组消息,包含一个byte[]

        StreamMessage

          java数据流消息,用标准流操作来顺序的填充和读取

        ObjectMessage

          对象消息,包含一个可序列化的java对象

      发送和接受的消息体类型必须一致对应

    消息属性

      如果需要除消息头字段以外的值,那么可以使用消息属性

      识别、去重、重点标注等操作非常有用的方法

3.JMS的可靠性

  1)PERSISTENT:持久性

    参数设置说明

      非持久:当服务器宕机,消息不存在

          messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

      持久:当服务器宕机,消息未消费,消息依然存在

          messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);

    持久的Queue

      队列的默认传送模式,此模式保证这些消息只被传送一次和成功使用一次,对于这些消息,可靠性是优先考虑的因素

      可靠性的另一个重要方面是确保持久性消息传达至目标后,消息服务在向消费者传送它们之前不会丢失这些消息

    持久的Topic

      1.一定要先运行一次消费者,等于向MQ注册,类似订阅了这主题

      2.然后再运行生产者发送信息,

      3.无论消费者是否在线,都会接收到,不在线的话,下次连接的时候,会把没有收过的消息都接收下来

  2)事务(偏生产者)

    producer提交时的事务

      false

        只要执行send,就进入队列中。

        关闭事务,那第二个签收参数的设置需要有效

      true

        先执行send,再执行commit,消息才被真正的提交到队列中

        消息需要批量发送,需要缓冲区处理

        技术分享图片

    

  3)Acknowledge:签收(偏消费者)   

    事务

      开启事务,手动签收,不调用acknowledge方法,也会自动签收,只有commit后,才能将全部消息变为已消费

      技术分享图片

    非事务

      自动签收(默认):Session.AUTO_ACKNOWLEDGE

      手动签收:Session.CLIENT_ACKNOWLEDGE,客户端调用acknowledge方法手动签收 

        技术分享图片

      签收和事务的关系 

        在事务性会话中,当一个事务被成功提交则消息被自动签收

        如果事务回滚,则消息会被再次传送

        非事务性会话中,消息何时被确认取决于创建会话时的应答模式(acknowledgement mode)

4.JMS点对点(队列)总结

  点对点模型是基于队列的,生产者发消息到队列,消费者从队列接收消息,队列的存在使得消息的异步传输成为可能

  1.如果在session关闭时,有部分消息已被收到但还没有签收,那当消费者下次连接到相同队列时,这些消息还会被再次接收

  2.队列可以长久地保存消息,直到消费者收到消息。消费者不需要因为担心消息会丢失而时刻和队列保持激活的连接状态,充分体现了异步传输模式的优势

5.JMS的发布订阅总结

  JMS Pub/Sub模型定义了如何向一个内容节点发布和订阅消息,这些节点被称作topic

  主题可以被认为是消息的传输中介,发布者发布消息到主题,订阅者从主题订阅消息

  主题使得消息订阅者和消息发布者保持互相独立,不需要接触即可保证消息的传送

  非持久订阅

    非持久订阅只有当客户端处于激活状态,也就是和MQ保持连接状态才能收到发送到某个主题的消息。

    如果消费者处于离线状态,生产者发送的主题消息将会丢失作废,消费者永远不会收到

    一句话:先要订阅注册才能接受到发布,只给订阅者发布消息

  持久订阅

    客户端需要先向MQ注册一个自己的身份ID识别号,当这个客户端处于离线时,生产者会为这个ID保存所有发送到主题的消息,

    当客户端再次连接到MQ时会根据消费者的ID得到所有当自己处于离线时发送到主题的消息

    非持久订阅状态下,不能恢复或重新派送一个未签收的消息,则持久化是可以的

 

JMS-消息服务

原文:https://www.cnblogs.com/realman9527/p/14456495.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!