JMS的基本概念

啥是JMS:
   A Java API that allows applications to create, send, receive, and read messages using reliable, asynchronous, loosely coupled communication

   Defines a common set of interfaces and associated semantics that allow programs written in the Java programming language to communicate with other messaging implementations

JMS不作什么
    JMS自己不实现消息服务机制.消息服务是由 MOM(messaging-oriented middleware) 提供的

    不过,现在很多MOM都采纳了JMS机制并提供了JMS实现,so a JMS product can now provide a complete messaging capability for an enterprise.

消息发送的两种机制:
    a.point to point. 两者之间的消息通过 queue 来传送

     b.publisher/subscriber . publisher发布一个主题(topic),登记了该主题的subscriber都可以收到该topic相关的消息

   可顾名思义,不多讲

JMS体系结构
     a.jms provider: 即MOM

    b.jms clients: 如producers,consumers

    c.message: text,byte,object等

    d.administered objects:即“资源”,都是通过JNDI来声明的

        A.Connection工厂. 这里的connection指client 与 provider通讯时的连接

        B.发送消息的目的地(Destionation).如p2p模式下的queue,和 pub/sub模式下的topic

可靠性
    a.最可靠

        The most reliable way to produce a message is to send a PERSISTENT message within a transaction

        The most reliable way to consume a message is to do so within a transaction, either from a queue or from a durable subscription to a topic.

    b.自定义可靠性级别

        i. Controlling message acknowledgment

           在事务session中,acknowledgment是在事务提交时自动产生的;

             而在非事务session中,需要自定义acknowledgment模式,有以下以几种

                a.AUTO_ACKNOWLEDGE  

              b.CLIENT_ACKNOWLEDGE 

              c.DUPS_OK_ACKNOWLEDGE

        ii.Specifying message persistence

              a.PERSISTENT(默认选项)  要求provider将消息持久化,一旦provider当机,消息仍可恢复

              b.NON_PERSISTENT  不对provider提出以上要求

        iii.Setting message priority levels

             provider会尽力按优先级来发送消息,但是不保证精确

        iv. Allowing messages to expire

       v. Creating temporary destinations

              一般destination都是在provider中手工配置的,但我们也可以通过编码生成临时的destination.具体有啥用还不知道

事务
     消息操作可以不在事务中执行,也可以在事务中执行。JMS事务可以分为两种

        i.JMS API 本地事务. 它类似于JDBC API的事务,通过JMS API自己的commit(), rollback()方法来提交或回滚

       ii.分布式事务。要MDB的事务管理机制来搞

MDB
      A message-driven bean is a message listener that can reliably consume messages from a queue or a durable subscription

      它和普通的listener的区别就是:它是一种EJB。 它有ejbCreate(),ejbRemove()等方法,而且,它所对应的connection factory和destionantion都是在容器中配置好的,而不是通过写代码确定的

运行在J2EE app server中的MDB 如何与jms provider 连接?有两种方法

          a.deploy the MDB to use the JMS provider via the proprietary interface provided by your J2EE container

         b.use a JCA resource adapter

一些零碎
    a.一个消息如果没被acknowledge,那系统就认为它没有被消费掉,就会继续把消息放在队列里

    b.acknowledge 以事务为边界

       i.事务提交时,acknowledgement就会自动产生

      ii.事务回滚后,所有已消费的消息都会重发一遍

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.