zoukankan      html  css  js  c++  java
  • EJB3.0 EJB开发消息驱动bean

    (7)EJB3.0 EJB开发消息驱动bean JMS

      一: Java消息服务(Java Message Service)

      630x320

      二:jms中的消息

      消息传递系统的中心就是消息。一条 Message 由三个部分组成:
                头(header),属性(property)和主体(body)。

    消息有下面几种类型,他们都是派生自 Message 接口。
              StreamMessage:一种主体中包含 Java 基元值流的消息。其填充和读取均按顺序进行。
              MapMessage:一种主体中包含一组名-值对的消息。没有定义条目顺序。
              TextMessage:一种主体中包含 Java字符串的消息(例如,XML消息)。
              ObjectMessage:一种主体中包含序列化 Java 对象的消息。
              BytesMessage:一种主体中包含连续字节流的消息。


        消息的传递模型
                 JMS 支持两种消息传递模型:点对点(point-to-point,简称 PTP)和发布/订阅(publish/subscribe,简称 pub/sub)。这两种消息传递模型非常相似,但有以下区别:

                 PTP 消息传递模型规定了一条消息只能传递给一个接收方。 采用javax.jms.Queue 表示。
                 Pub/sub 消息传递模型允许一条消息传递给多个接收方。采用javax.jms.Topic表示

                这两种模型都通过扩展公用基类来实现。例如:javax.jms.Queue 和javax.jms.Topic 都扩展自javax.jms.Destination 类。

      点对点模型:

      523x197

      发布或订阅模式:

      578x281

      三:   配置目标地址

                开始JMS编程前,我们需要先配置消息到达的目标地址(Destination),因为只有目标地址存在了,我们才能发送消息到这个地址。由于每个应用服 务器关于目标地址的配置方式都有所不同,下面以jboss为例,配置一个queue类型的目标地址。

      663x331

      本文用的配置地址:将这个文件在 jboss中发布。


         目标地址itmQueue发布前,必须先发布目标地址的管理器DestinationManager,所以采用依赖元素depends申明这个依赖。

          它发布的过程,和数据源和EJB都是一样的。只需把它拷贝到JBoss的server/default/deploy目录下就行了。 拷贝完后就可以在JBoss控制台看到信息:
    [itcastQueue] Bound to JNDI name: queue/itmQueue

           说明目标地址itcastQueue绑定了queue/itcastQueue这个监单名称里面去。
        queue/itcastQueue这个监单名称前面并没有java:,也就是说这个名称是在全局命名空间里面的,它可以被外部应用进行访问。
         发布完后也可以进入JBoss管理后台,找到jboss.mq.destination这个栏目,找到刚才所发布的目标地址 name=itcastQueue.service=Queue,点击进去可以看到里面的一些信息。

        四:当目标地址建立好了之后,就可以进行消息的发送。

        在java类中发送消息,一般发送消息有以下步骤:

                (1) 得到一个JNDI初始化上下文(Context)
                  InitialContext ctx = new InitialContext();
              (2) 根据上下文查找一个连接工厂 QueueConnectionFactory 。该连接工厂是由JMS提供的,不需我们自己创建,每个厂商都为它绑定了一个全局JNDI,我们通过它的全局JNDI便可获取它;
               QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("QueueConnectionFactory");
              (3) 从连接工厂得到一个连接 QueueConnection
                             conn = factory.createQueueConnection();
               (4) 通过连接来建立一个会话(Session);
                         session = conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
                       这句代码意思是:建立不需要事务的并且能自动确认消息已接收的会话。
               (5) 查找目标地址:
                         例子对应代码:Destination destination = (Destination ) ctx.lookup("queue/foshanshop");
               (6) 根据会话以及目标地址来建立消息生产者MessageProducer (QueueSender和TopicPublisher都扩展自MessageProducer接口)

      
    例子对应代码:

      第一种方式:

      运行QueueSender,往目标地址发送一条消息。
        消息发送完后,就可以编写消息的接收者。

        采用消息驱动Bean (Message Driven Bean)接收消息。

           消息驱动Bean(MDB)是设计用来专门处理基于消息请求的组件。它和无状态Session Bean一样也使用了实例池技术,容器可以使用一定数量的bean实例并发处理成百上千个JMS消息。正因为MDB具有处理大量并发消息的能力,所以非常 适合应用在一些消息网关产品。如果一个业务执行的时间很长,而执行结果无需实时向用户反馈时,也很适合使用MDB。如订单成功后给用户发送一封电子邮件或 发送一条短信等。

        一个MDB通常要实现MessageListener接口,该接口定义了onMessage()方法。Bean通过它来处理收到的JMS消息。


            当容器检测到bean守候的目标地址有消息到达时,容器调用onMessage()方法,将消息作为参数传入MDB。MDB在onMessage()中决 定如何处理该消息。你可以使用注释指定MDB监听哪一个目标地址(Destination)。当MDB部署时,容器将读取其中的配置信息。

      消息驱动Bean (Message Driven Bean):




    jndi:

      java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
    java.naming.provider.url=localhost:1099

      消息驱动bean开发完后,就要对它进行打包,部署。

        编写build.xml,然后把消息驱动bean发布到JBoss中。当消息驱动bean成功发布完之后,正常情况下会在控制台中把刚才发送的消息打印到控制台中。

          消息驱动bean一旦布署到JBoss中的时候,容器就会根据bean所配置的信息到目标地址获取到消息,然后传入到onMessage方法里面去,执行方法里面的内容。

         通过这个例子也可以发现,JMS编程可以允许发送者和接收方可以不同时在线。也就是说发送消息的时候,消息接收方可以不在线。只要消息接收方登录到系统的 时候,它也可以获取到消息。而且消息接收方和消息发送方它们之间并没有代码的直接关联。两者之间实现很好的解耦。

       

      build.xml

                关于Queue类型的发送和接收就已经介绍完了,现在开始学习下关于topic类型的消息发送和接收。也就是发布/订阅传递模型的消息发送和接受。在这种模型里,消息是可以被多个接收方进行接受的。

      第二种方式:发布/订阅传递模型的消息发送和接受

      922x327



      操作步骤:

      首先启动jboss,接着把itm-service.xml 发布。

      接着:build.xml发布。

      
         这两个消息驱动 bean都开发完了,它们两个都会从目标地址里面获取到消息,现在对它进行发布。 但是在控制台并没有看到刚才发送的topic消息,那是因为对于topic类型的消息,如果当时接收方没有监听topic类型的消息的话,那么它就获取不 到消息。尽管我们把它布署到JBoss中,因为它当时并没有监听topic这个目标地址,所以它是无法得到消息的。
        现在执行下TopicSender.java,就会看见这两个消息驱动bean获取到消息了。控制台输出:

      INFO [STDOUT] class cssage.ReceiveOtherBean您好,这是我的第一个topic消息
    INFO [STDOUT] class cssage.ReceiveBean您好,这是我的第一个topic消息

        也就证明,对于发布/订阅传递模型,多个接收方都可以得到这条消息

        回头再测试下Queue类型的发送,运行QueueSender.java,对于queue类型的发送,它是一个消息只允许一个接收方进行接收。

      1021x426

    原文:http://www.educity.cn/wenda/357315.html

  • 相关阅读:
    react路由组件&&非路由组件
    react函数式组件(非路由组件)实现路由跳转
    react使用antd组件递归实现左侧菜单导航树
    【LeetCode】65. Valid Number
    【LeetCode】66. Plus One (2 solutions)
    【LeetCode】68. Text Justification
    【LeetCode】69. Sqrt(x) (2 solutions)
    【LeetCode】72. Edit Distance
    【LeetCode】73. Set Matrix Zeroes (2 solutions)
    【LeetCode】76. Minimum Window Substring
  • 原文地址:https://www.cnblogs.com/juepei/p/3855231.html
Copyright © 2011-2022 走看看