JSR-343学习笔记(JMS)

JSR-343学习笔记(JMS)JMS 两种模式 p2p pub sub Cosuming message from Topic Nondurable unshared Subscription JMSContext createConsum Durable Subscription Shared Subscription 可以实现负载均衡的目的 Controlling Message

大家好,我是讯享网,很高兴认识大家。
  1. JMS两种模式, p2p, pub/sub
  2. Cosuming message from Topic
    1. Nondurable, unshared Subscription[JMSContext.createConsumer()]
    2. Durable Subscriptions
    3. Shared Subscriptions,可以实现负载均衡的目的
  3. Controlling Message Acknowledgment
    1. 成功消费了一条message体现在3点<1>client接收到消息<2>client处理了消息<3>消息被acknowledged
    2. 对于locally transacted session,当session提交时消息会被acknowledged,如果调用context.rollback(),消息会被重发(redeliver)
    3. 对于JTA transaction(JaveEE web 或者EJB),当事务提交时,消息会被acknowledged
    4. 对于 non-transacted session, 消息如何被acknowledged取决于调用createContext时传入的参数
      1. JMSContext.AUTO_ACKNOWLEDGE,在client调用receive方法返回(对于a中的3点,这个是个例外)或者MessageListener返回成功是,消息会被自动acknowledged
      2. JMSContext.CLIENT_ACKNOWLEDGE,手动调用Message的acknowledge方法,会对所有已消费的messages进行acknowledge,只能用在application client,不能用在web组件和EJB中
      3. JMSContext.DUPS_OK_ACKNOWLEDGE,出否可以接收重复的消息
  4. 对于未能及时进行acknowledge的处理情况
    1. 如果是从queue读
      1. provider会保留消息,等下次消费者访问queue会重发(redeliver)
    2. 如果是从topic读
      1. 如果是从建立的持续(durable)订阅关掉了JMSContext, Provider会保留消息
      2. 如果是从建立的非持续(non-durable)订阅关掉了JMSContext,Provider会丢弃掉这些消息


        讯享网

    3. 对于non-transacted session
      1. 如果是durable订阅,使用JMSContext.recover会重新接收自上次acknowledge之后的消息,但是顺序有可能不同
      2. 如果是non-durable订阅,调用recover()方法会丢弃所有unacknowledge的消息
  5. 发送消息时的一些选项
    1. 设定消息的持久性(默认是PERSISTENT,也可以是NON_PERSISTENT),non的话对于provider就不进行消息持久化存储了,该特性可以通过Provider的setDeliveryMode方法进行设定
    2. 设定消息的优先级,从0(最低级)到9(最高级),默认是4,Provider会尽量有优先发送高优先级的消息,通过setPriority()进行设定
    3. 设定消息过期,如股票实时报价,在一定时间后就没有意义了,类似场景可以设定消息有效期间,通过Producer的setTimeToLive方法可以设定,单位毫秒,默认为0(永久有效)
    4. 设定延时发送,可以通过Producer的setDeliveryDelay方法进行设定,单位毫秒
  6. 临时发送地(Temporary Destinations)【天啊,看英文文档实在是不知道怎么翻译成中文,还是个复数】
    1. 可以通过JMSContext创建临时的发送目的地
  7. 使用JMS本地事务
    1. 在application client 或者 Java SE client,可以在创建上下文的时候以SESSION_TRANSACTED参数创建local transaction(connectionFactory.createContext(JMSContext.SESSION_TRANSACTED)),之后通过context.submit()和context.rollback()进行事务操作
    2. 在Java EE和EJB中,不能使用本地事务,需要使用JTA事务
  8. 异步发送消息
    1. 目前异步发送消息只能用在application client和 J2SE client,通过在Producer上设定异步回调来实现(setAsync)
  9. 在JaveEE中使用JMS
    1. JaveEE中,每个connection只能创建1个JMSContext
    2. 可以通过annotation和DD(deployment descriptor)的方式创建资源(Destination和ConnectionFactory)
    3. 在javaEE web component, session bean, message driven bean中注入connectionFactory和Topic/Queue时,不能声明为static的,注入factory之后要取得jmsContext需要再进行创建
    4. 1
小讯
上一篇 2025-04-04 15:53
下一篇 2025-02-27 10:00

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/45141.html