jms

  如果您使用过JMS代码,您会发现它与JDBC或JCA很像。它所包含的样本代码创建或JMS资源对象回溯,使得每一次您需要写一个新类来发送和接收消息时,都具有更好的代码密集性和重复性。以下序列显示了传统JMS实现所包括的步骤:

  1. 创建JNDI初始上下文(context)。

  2. 从JNDI上下文获取一个队列连接工厂。

  3. 从队列连接工厂中获取一个Quene。

  4. 创建一个Session对象。

  5. 创建一个发送者(sender)或接收者(receiver)对象。

  6. 使用步骤5创建的发送者或接收者对象发送或接收消息。

  7. 处理完消息后,关闭所有JMS资源。

您可以看到,步骤6是处理消息的唯一地方。其他步骤都只是管理与实际业务要求无关的JMS资源,但是开发人员必须编写并维护这些额外步骤的代码。

Spring JMS

   Spring框架提供了一个模板机制来隐藏Java APIs的细节。JEE开发人员可以使用JDBCTemplate和JNDITemplate类来分别访问后台数据库和JEE资源(数据源,连接池)。JMS也不例外。Spring提供JMSTemplate类,因此开发人员不用为一个JMS实现去编写样本代码。接下来是在开发JMS应用程序时Spring所具有一些的优势。

  1. 提供JMS抽象API,简化了访问目标(队列或主题)和向指定目标发布消息时JMS的使用。

  2. JEE开发人员不需要关心JMS不同版本(例如JMS 1.0.2与JMS 1.1)之间的差异。

  3. 开发人员不必专门处理JMS异常,因为Spring为所有JMS异常提供了一个未经检查的异常,并在JMS代码中重新抛出。

示例程序

        说明:因为只是为了演示如何使用spring编写jms的应用,所以本例没有什么实际用途。

        程序功能:MessageProducer.java根据一用户信息产生一个消息发送到 JMS Provider;由MessageConsumer.java接收。

1.在Jboss里配置XML文件创建一个新的JMS provider。
打开位于%JBOSS_HOME%server/default/deploy/jms文件夹下的jbossmq-destinations-service.xml文件,加入以下代码片断:
 <!--  Register User Send/Receive Queue  -->
 <mbean code="org.jboss.mq.server.jmx.Queue"
   name="jboss.mq.destination:service=Queue,name=registerUserQueue">
   <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
 </mbean>
 <!--  Register User Send/Receive Topic  -->
 <mbean code="org.jboss.mq.server.jmx.Topic"
  name="jboss.mq.destination:service=Topic,name=registerUserTopic">
   <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
 </mbean>
2.在spring的配置文件中配置JMS组件的具体细节。
 (1)JNDI上下文是取得JMS资源的起始位置,因此首先我们要配置JNDI模板:
    <!-- JNDI上下文(它是取得JMS资源的起始位置) -->
   <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
    <property name="environment">
     <props>
      <prop key="java.naming.factory.initial">
       org.jnp.interfaces.NamingContextFactory
      </prop>
      <prop key="java.naming.provider.url">localhost</prop>
      <prop key="java.naming.factory.url.pkgs">
       org.jnp.interfaces:org.jboss.naming
      </prop>
     </props>
    </property>
   </bean>
   注意:此JNDI模板用到了org.jnp.interfaces.NamingContextFactory所以要把%JBOSS_HOME%/client下的jbossall-client.jar加到你的项目的classpath中。
(2)配置连接工厂:
   <!-- JMS连接工厂 -->
     <bean id="jmsConnectionFactory"class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiTemplate">
     <ref bean="jndiTemplate" />
    </property>
    <property name="jndiName">
     <value>XAConnectionFactory</value>
    </property>
   </bean>
   注意:XAConnectionFactory这个JNDI名字是在%JBOSS_HOME%server/default/deploy/jms文件夹下的jms-ds.xml中定义的(它是由JBoss指定的)。
 (3)配置JmsTemplate组件。在例程中我们使用JmsTemplate102。同时使用defaultDestination属性来指定JMS目标。


评论

© 死鬼码农 | Powered by LOFTER