spring-jms_使用Spring JMS进行1-2-3消息传递

Spring系列的第四部分(也是最后一部分)中,我将向您介绍Spring JMS(Java消息服务)框架的功能。 JMS定义了Java应用程序通过面向消息的中间件(MOM)创建和交换消息的标准方法。

与本系列的前几篇文章一样,我使用一个简单的示例来演示Spring JMS的功能。 我将使用Spring JMS框架通过JMS接口与IBM的WebSphere MQ集成,以开发基于点对点(P2P)消息的系统。 完成练习后,您将能够通过系统发送和接收简单的文本消息。

开始之前,请下载文章源 。 请参阅相关主题访问Spring框架和IBM WebSphere MQ 5.3。 您还将需要Apache Ant来运行示例应用程序。

SpringJMS

Spring的JMS抽象框架简化了JMS API的使用,并与JMS提供程序(例如IBM的WebSphere MQ 5.3)顺利集成。 包org.springframework.jms.core提供了在Spring中使用JMS的核心功能。 它的模板类通过处理资源的创建和释放来简化JMS的使用。

像大多数其他Spring模板类一样,JMS模板类提供了执行常用操作的辅助方法。 如果需要更复杂的用法,则这些类将处理任务的本质委托给用户实现的回调接口。 JMS类提供了方便的方法来发送消息,同步使用消息以及向用户公开JMS会话和消息生成器。

以下JMS软件包与org.springframework.jms.core一起 ,包含Spring JMS功能:

org.springframework.jms.support
提供翻译JMSException的功能。 转换代码将已检查的JMSException层次结构转换为未检查的异常的镜像层次结构。
org.springframework.jms.support.converter
提供MessageConverter抽象以在Java对象和JMS消息之间进行转换。
org.springframework.jms.support.destination
提供用于管理JMS目的地的各种策略,例如用于JNDI中存储的目的地的服务定位器。
org.springframework.jms.connection
提供适用于独立应用程序的ConnectionFactory的实现。 该连接包还包含Spring的JMS PlatformTransactionManager实现。 这允许将JMS作为事务资源集成到Spring的事务管理机制中。

IBM WebSphere MQ

如前所述,示例应用程序将使用Spring JMS框架通过JMS接口与IBM的WebSphere MQ集成。 WebSphere MQ通过在应用程序和Web服务之间传递消息来提供可靠,有弹性的应用程序集成。 它使用排队和事务处理功能来帮助维护整个网络中消息的完整性。 WebSphere MQ降低了信息丢失的风险以及调和通信IT系统的需求。

WebSphere MQ在其所有受支持的平台上提供了一致的应用程序编程接口(MQI),这有助于使集成程序具有可移植性。 除了标准接口之外,WebSphere MQ还完全实现了JMS接口,包括对发布和订阅消息传递的支持。 WebSphere MQ Explorer工具使整个MQ网络都可以进行远程管理和配置。 该管理和配置工具基于开源Eclipse框架,并且是可扩展的。

Spring JMS模板

Spring框架提供了JmsTemplate两种实现。 JmsTemplate类使用JMS 1.1 API,而子类JmsTemplate102使用JMS 1.0.2 API。 我的示例应用程序使用JmsTemplate102

JMS模板用于发送和接收JMS消息。 Spring使用回调机制来协调JMS消息传递。 MessageCreator回调接口根据JmsTemplate的调用代码提供的Session创建消息。 为了允许更复杂地使用JMS API,回调SessionCallback向用户提供了JMS会话,而callback ProducerCallback公开了SessionMessageProducer对。

清单1显示了用于示例应用程序的JMS模板的配置。 清单是spring-mqseries-jms.xml文件的摘录 (请参阅下载 )。

清单1. JMS模板配置
<!-- JMS Queue Template -->
  <bean id="jmsQueueTemplate" 
          class="org.springframework.jms.core.JmsTemplate102">
    <property name="connectionFactory">
      <ref bean="jmsQueueConnectionFactory"/>
    </property>
    <property name="destinationResolver">
      <ref bean="jmsDestinationResolver"/>
    </property>
    <property name="pubSubDomain">
      <value>false</value>
    </property>
    <property name="receiveTimeout">
      <value>20000</value>
    </property>
  </bean>

jmsQueueTemplate bean与JMS连接工厂和JMS目标解析器连接在一起,用于解析JMS客户端通过JNDI提供的目标队列名称。 connectionFactory属性指定如何获取与JMS提供程序的连接。 在该示例的情况下,清单2显示了如何从JNDI检索连接工厂。

清单2.通过JNDI配置JMS连接工厂
<!-- JMS Queue Connection Factory -->
  <bean id="internalJmsQueueConnectionFactory"
          class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiTemplate">
      <ref bean="jndiTemplate"/>
    </property>
    <property name="jndiName">
      <value>MQ_JMS_MANAGER</value>
    </property>
  </bean>

如您所见, JndiObjectFactoryBean连接到一个internalJmsQueueConnectionFactoryJndiObjectFactoryBean使用JndiTemplate属性进行JNDI查找。 Spring将使用JndiTemplate中指定的环境属性和初始上下文在JNDI中查找连接工厂。 清单3显示了JndiTemplate配置bean的配置。

清单3.用于JNDI查找的JNDI模板配置
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
    <property name="environment">
      <props>
        <prop key="java.naming.factory.initial">
            com.sun.jndi.fscontext.RefFSContextFactory
        </prop>
        <prop key="java.naming.provider.url">
            file:/C:/JNDI-Directory
        </prop>
      </props>
    </property>
  </bean>

上面的配置将初始上下文工厂指定为com.sun.jndi.fscontext.RefFSContextFactory ,并将提供程序URL指定为基于文件的文件:/ C:/ JNDI-Directory以进行JNDI查找。 示例应用程序的目的,JNDI访问将使用基于文件FSContext版本(请参阅相关信息 ),配置为MQ队列绑定到JNDI。

定义了JMS模板后,下一步是将其连接到示例应用程序中,然后可以使用它发送和接收消息。

Spring JMS实施

可以将JMS模板连接到应用程序中,以发送和接收JMS消息。 在清单4中,您可以看到如何将清单1中的JMS模板连接到示例应用程序中。

清单4.将JmsTemplate连接到应用程序
<bean id="jmsSender" 
          class="springexample.client.JMSSender">
    <property name="jmsTemplate102">
      <ref bean="jmsQueueTemplate"/>
    </property>

    </bean>

    <bean id="jmsReceiver" 
          class="springexample.client.JMSReceiver">
    <property name="jmsTemplate102">
        <ref bean="jmsQueueTemplate"/>
      </property>

    </bean>

正如你所看到的,我有线jmsQueueTemplate到两个JmsSender应用bean和JmsReceiver用于发送和接收消息豆。 清单5显示了JMSSender类的相关代码。

清单5.使用JmsTemplate发送JMS消息的JMSSender
public class JMSSender {

   private JmsTemplate102 jmsTemplate102;

   public JmsTemplate102 getJmsTemplate102() {
     return jmsTemplate102;
   }

   public void setJmsTemplate102(JmsTemplate102 jmsTemplate102) {
     this.jmsTemplate102 = jmsTemplate102;
   }

   public void sendMesage(){
     jmsTemplate102.send("JMS_RequestResponseQueue", 
                  new MessageCreator() {
        public Message createMessage(Session session) 
                  throws JMSException {
          return session.createTextMessage("This is a sample message");
        }
      });


   }

JMSSender类使用jmsTemplate102.send()方法发送JMS消息。 send()方法的第一个参数是JNDI队列名称,它指定应该将消息发送到的位置。 (稍后,您将看到WebSphere MQ的队列名称如何绑定到JNDI。) send()方法的第二个参数是MessageCreator类。 给定JmsTemplate的调用代码提供的Session ,此类提供了一个回调接口来创建JMS消息。

下一步是使用JMS Session类创建一条简单的文本消息。 该消息将在执行代码时传递到WebSphere MQ服务器的队列中。 清单6显示了使用JmsTemplate接收JMS消息的JMSReceiver应用程序bean代码。

清单6.使用JmsTemplate接收JMS消息的JMSReceiver
public class JMSReceiver {

    private JmsTemplate102 jmsTemplate102;

    public JmsTemplate102 getJmsTemplate102() {
      return jmsTemplate102;
    }

    public void setJmsTemplate102(JmsTemplate102 jmsTemplate102) {
     this.jmsTemplate102 = jmsTemplate102;
    }

    public void processMessage(){
      Message msg = jmsTemplate102.receive("JMS_RequestResponseQueue");
      try{
        TextMessage textMessage = (TextMessage) msg;
        if( msg!=null){
        System.out.println(" Message Received -->" + 
                    textMessage.getText());
        }


      }catch(Exception e){
            e.printStackTrace();
      }


    }
}

所述JMSReceiver类使用jmsTemplate102.receive()方法来接收JMS消息synchronously.The receive()方法指定JNDI队列名称从中检索消息。 接收JMS客户端将调用JMSTemplate类的processMessage()方法。 JSMTemplate Bean属性receiveTimeout (在JMSTemplate配置中列出)指定接收客户端将等待从队列同步接收消息的时间。

并完成了应用程序代码! 我的下一步是配置WebSphere MQ队列并将其绑定到JNDI对象。

队列管理器设置

在运行该应用程序之前,需要设置WebSphere MQ队列管理器和队列并将它们绑定到JNDI。 如果愿意,您可以遵循该示例的这一部分:只需下载批处理文件以设置WebSphere MQ队列以及该应用程序的源代码和部署描述符。 将压缩文件解压缩到C:驱动器。

设置队列
运行在C提供的mqsetup.bat文件:\ SpringSeriesPart4JMS \ batch文件夹。 此批处理文件要求您在环境路径变量中设置MQ安装的bin文件夹(例如C:\ mqseries \ bin )。 运行批处理文件之后,您应该看到消息“ All valid MQSC commands were processed 。 要打开MQ Explorer并检查是否创建了队列管理器,请选择Start-> Programs-> IBM MQSeries-> MQSeriesExplorer 。 图1显示示例应用程序QueueManager MQJMS.QManager已创建并正在运行。

图1. WebSphere MQ的QueueManager配置
WebSphere MQ的QueueManager配置

单击应用程序屏幕左窗格上MQJMS.QManagerQueues文件夹。 您应该看到还创建了一个队列RequestResponseQueue ,如图2所示。

图2. WebSphere MQ的请求/响应队列配置
WebSphere MQ的请求/响应队列配置

这样就完成了队列的设置。

设置JMS和JNDI管理

在示例应用程序中,JNDI访问使用了JNDI主页上提供的基于文件的FSContext版本(请参阅参考资料 )。 FSContext.jar文件也包含在WebSphere MQ的JMS支持中。 将文件夹\ MQSeriesInstallable \ MQSeries \ Java \ lib和\ MQSeriesInstallable \ MQSeries \ Java \ bin添加到系统的PATH环境变量中。 另外,将\ MQSeriesInstallable \ MQSeries \ Java \ lib文件夹中的所有jar文件添加到系统的CLASSPATH环境变量中。 您还可以运行C:\ SpringSeriesPart4JMS \ batch文件夹中提供的classpath.cmd批处理文件,该文件设置必要的路径和CLASSPATH变量。 为此,只需修改classpath.cmd文件中的MQ_JAVA_INSTALL_PATH变量以指向您的WebSphere MQ JMS安装目录。

接下来,修改MQSeries JMS管理使用的\ MQSeriesInstallableDirectory \ Java \ bin中的JMSAdmin.config配置文件,以指示应用程序将使用的上下文工厂和JNDI实现的地址。 取消注释以下行:

INITIAL_CONTEXT_FACTORY=com.sun.jndi.fscontext.RefFSContextFactory

并注释掉其余两个INITIAL_CONTEXT_FACTORY变量。 还要取消注释以下行:

PROVIDER_URL=file:/C:/JNDI-Directory

并注释掉其余两个PROVIDER_URL变量。

您可以在C:\ SpringSeriesPart4JMS \ batch文件夹中找到一个示例配置文件,以供参考。

要存储JNDI对象,请在C:驱动器上创建一个名为JNDI-Directory的目录 。 切换到\ MQSeriesInstallableDirectory \ Java \ bin目录并运行JMSAdmin批处理文件,您应该看到InitCtx变量。

依次键入以下内容:

def qcf(MQ_JMS_MANAGER) qmgr(MQJMS.QManager)
press Enter
def q(JMS_RequestResponseQueue) qmgr(MQJMS.QManager) queue(RequestResponseQueue)
press Enter

现在,您已将WebSphere MQ队列绑定到JNDI对象,可以通过JNDI将其作为应用程序客户机进行查找。 剩下要做的就是查看运行中的代码!

运行示例

要运行该示例,请从spring sourceforge下载 Spring框架及其所有依赖项文件,并将其解压缩到例如c:\。 将创建文件夹C:\ spring-framework-1.2-rc2 (或最新版本)。

要运行Spring应用程序,请将文章源代码提取到任何文件夹,例如c:\ 。 将创建文件夹SpringSeriesPart4JMS 。 如前所述,您还需要安装Apache Ant及其Spring依赖项jar文件。 将Spring库(即C:\ spring-framework-1.2-rc2 \ dist中的 spring.jar和commons-logging.jar-从C:\ spring-framework-1.2-rc2 \ lib \ jakarta-commons复制到SpringSeriesPart4JMS \ lib文件夹。 还将所有jar库从\ MQSeriesInstallableDirectory \ Java \ lib目录复制到SpringSeriesPart4JMS \ lib文件夹。 它包含与MQseries和JMS相关的库。 现在,您已经设置了构建依赖项。

接下来,打开命令提示符,并将目录更改为SpringProject4,然后在命令提示符处键入以下内容:

> ant -f build-jmssender.xml.

这将构建并运行SendMQSpringJMS类,该类调用JMSSender类以将文本消息发送到WebSphere MQ RequestResponse队列。 SendMQSpringJMS还通过其ClassPathXmlApplicationContext加载spring配置文件。 装入Bean之后,可以通过Spring ApplicationContext getBean()方法访问JMSSender(请参见清单7)。

清单7.加载示例应用程序的Spring配置
ClassPathXmlApplicationContext appContext = 
                   new ClassPathXmlApplicationContext(new String[] {
     "spring-mqseries-jms.xml"
    });

JMSSender jmsSender = (JMSSender)
        appContext.getBean("jmsSender");

将消息传递到队列中后,请运行JMS接收器客户端以检索它。 打开命令提示符,将目录更改为SpringProject4 ,然后键入:

> ant -f build-jmsreceiver.xml

这将构建并运行ReceiveMQSpringJMS类,该类将调用JMSReceiver类以从WebSphere MQ RequestResponse队列接收文本消息。 在控制台上将显示以下消息:

Message Received --> This is a sample message.

结论

在Spring系列的最后一篇文章中,您了解了Spring JMS框架的基础。 我首先介绍了示例应用程序的基本组件(Spring JMS框架和IBM的WebSphere MQ 5.3),然后向您展示了如何使用Spring JMS模板从WebSphere MQ队列发送和接收消息。 尽管该示例非常简单,但是您可以将概述的步骤应用于复杂性更高的应用程序。

我希望本系列介绍Spring框架的基本模块对您有所帮助。 请参阅相关主题 ,以了解更多关于Spring框架和Spring JMS。


翻译自: https://www.ibm.com/developerworks/web/library/wa-spring4/index.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值