在Spring系列的第四部分(也是最后一部分)中,我将向您介绍Spring JMS(Java消息服务)框架的功能。 JMS定义了Java应用程序通过面向消息的中间件(MOM)创建和交换消息的标准方法。
与本系列的前几篇文章一样,我使用一个简单的示例来演示Spring JMS的功能。 我将使用Spring JMS框架通过JMS接口与IBM的WebSphere MQ集成,以开发基于点对点(P2P)消息的系统。 完成练习后,您将能够通过系统发送和接收简单的文本消息。
开始之前,请下载文章源 。 请参阅相关主题访问Spring框架和IBM WebSphere MQ 5.3。 您还将需要Apache Ant来运行示例应用程序。
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的事务管理机制中。如前所述,示例应用程序将使用Spring JMS框架通过JMS接口与IBM的WebSphere MQ集成。 WebSphere MQ通过在应用程序和Web服务之间传递消息来提供可靠,有弹性的应用程序集成。 它使用排队和事务处理功能来帮助维护整个网络中消息的完整性。 WebSphere MQ降低了信息丢失的风险以及调和通信IT系统的需求。
WebSphere MQ在其所有受支持的平台上提供了一致的应用程序编程接口(MQI),这有助于使集成程序具有可移植性。 除了标准接口之外,WebSphere MQ还完全实现了JMS接口,包括对发布和订阅消息传递的支持。 WebSphere MQ Explorer工具使整个MQ网络都可以进行远程管理和配置。 该管理和配置工具基于开源Eclipse框架,并且是可扩展的。
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公开了Session和MessageProducer对。
清单1显示了用于示例应用程序的JMS模板的配置。 清单是spring-mqseries-jms.xml文件的摘录 (请参阅下载 )。
jmsQueueTemplate bean与JMS连接工厂和JMS目标解析器连接在一起,用于解析JMS客户端通过JNDI提供的目标队列名称。 connectionFactory属性指定如何获取与JMS提供程序的连接。 在该示例的情况下,清单2显示了如何从JNDI检索连接工厂。
如您所见, JndiObjectFactoryBean连接到一个internalJmsQueueConnectionFactory 。 JndiObjectFactoryBean使用JndiTemplate属性进行JNDI查找。 Spring将使用JndiTemplate中指定的环境属性和初始上下文在JNDI中查找连接工厂。 清单3显示了JndiTemplate配置bean的配置。
上面的配置将初始上下文工厂指定为com.sun.jndi.fscontext.RefFSContextFactory ,并将提供程序URL指定为基于文件的文件:/ C:/ JNDI-Directory以进行JNDI查找。 示例应用程序的目的,JNDI访问将使用基于文件FSContext版本(请参阅相关信息 ),配置为MQ队列绑定到JNDI。
定义了JMS模板后,下一步是将其连接到示例应用程序中,然后可以使用它发送和接收消息。
可以将JMS模板连接到应用程序中,以发送和接收JMS消息。 在清单4中,您可以看到如何将清单1中的JMS模板连接到示例应用程序中。
正如你所看到的,我有线jmsQueueTemplate到两个JmsSender应用bean和JmsReceiver用于发送和接收消息豆。 清单5显示了JMSSender类的相关代码。
JMSSender类使用jmsTemplate102.send()方法发送JMS消息。 send()方法的第一个参数是JNDI队列名称,它指定应该将消息发送到的位置。 (稍后,您将看到WebSphere MQ的队列名称如何绑定到JNDI。) send()方法的第二个参数是MessageCreator类。 给定JmsTemplate的调用代码提供的Session ,此类提供了一个回调接口来创建JMS消息。
下一步是使用JMS Session类创建一条简单的文本消息。 该消息将在执行代码时传递到WebSphere MQ服务器的队列中。 清单6显示了使用JmsTemplate接收JMS消息的JMSReceiver应用程序bean代码。
所述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已创建并正在运行。
单击应用程序屏幕左窗格上MQJMS.QManager的Queues文件夹。 您应该看到还创建了一个队列RequestResponseQueue ,如图2所示。
这样就完成了队列的设置。
设置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)。
将消息传递到队列中后,请运行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
相关资源:spring-jms.jar