快捷搜索:

Spring 系列:Spring JMS 消息处理

Spring 系列 的第 4 期也是着末一期中,我将先容 Spring JMS(Java 消息办事)框架的特点。JMS PG 定义了 Java 利用法度榜样经由过程面向消息的中心件(MOM)创建和互换消息的标准道路。

就像在这个系列前面的文章中一样,我将应用一个简单的示例来演示 Spring JMS 的特点。您将随我一道开拓一个点对点的(P2P)基于消息的系统,应用 Spring JMS 框架经由过程 JMS 接口与 IBM 的 WebSphere MQ 集成。完成演习后,将可以经由过程这个系统发送和接管简单的文本消息。

在开始之前,请 下载文章的源代码。请参阅 参考资料 造访 Spring 框架和 IBM WebSphere MQ 5.3。还必要 Apache Ant 来运行示例利用法度榜样。

Spring JMS

Spring 的 JMS 抽象框架简化了 JMS API 的应用,并与 JMS 供给者(比如 IBM 的 WebSphere MQ 5.3)平滑地集成。org.springframework.jms.core 包供给了在 Spring 中应用 JMS 的核心功能。它的模板类处置惩罚资本的创建和开释,简化了 JMS 的应用。

像其他大年夜多半 Spring 模板类一样,JMS 模板类供给了履行公共操作的 helper 措施。在必要更繁杂利用的环境下,类把处置惩罚义务的核心委托给用户实现的回调接口。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 实现。connection 还包孕针对 JMS 的 Spring PlatformTransactionManager 实现。它容许把 JMS 作为事务性资本集成到 Spring 的事务治理机制中。

IBM WebSphere MQ

就像前面提到的,示例利用法度榜样会用 Spring 的 JMS 框架经由过程 JMS 接口与 IBM 的 WebSphere MQ 集成。经由过程在利用法度榜样和 Web 办事之间通报消息,WebSphere MQ 供给了靠得住的、有规复能力的利用法度榜样集成。它应用行列步队和事务性对象赞助维持消息跨收集的完备性。WebSphere MQ 低落了信息损掉的风险和调和通信 IT 系统的必要。

WebSphere MQ 在它所支持的所有平台上供给了同等的利用法度榜样编程接口,这有助于让集成的法度榜样可移植。除了标准接口外,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 则公开了 Session 和 MessageProducer 组合。

清单 1 显示了示例利用法度榜样应用的 JMS 模板的设置设置设备摆设摆设。清单摘自 spring-mqseries-jms.xml 文件(请参阅 下载)。

清单 1. JMS 模板设置设置设备摆设摆设

false

20000

jmsQueueTemplate bean 与 JMS 连接工厂和 JMS 目标解析器绑定在一路,用于解析 JMS 客户机经由过程 JNDI 供给的目标行列步队名。connectionFactory 属性指定了若何获获得 JMS 供给者的连接。在本例中,清单 2 显示了若何从 JNDI 检索连接工厂。

清单 2. 经由过程 JNDI 设置设置设备摆设摆设 JMS 连接工厂

MQ_JMS_MANAGER

可以看到,JndiObjectFactoryBean 被绑定到 internalJmsQueueConnectionFactory。JndiObjectFactoryBean 用 JndiTemplate 属性进行 JNDI 查询。Spring 将用 JndiTemplate 中指定的情况属性和初始高低文在 JNDI 中查询连接工厂。清单 3 显示了 JndiTemplate 设置设置设备摆设摆设 bean 的设置设置设备摆设摆设。

清单 3. JNDI 查询的 JNDI 模板设置设置设备摆设摆设

com.sun.jndi.fscontext.RefFSContextFactory

file:/C:/JNDI-Directory

以上设置设置设备摆设摆设进行 JNDI 查询时用 com.sun.jndi.fscontext.RefFSContextFactory 指定初始高低文工厂,用基于文件的 file:/C:/JNDI-Directory 作为供给者 URL。根据示例利用法度榜样的意图,JNDI 造访会采纳基于文件的 FSContext 版本(请参阅 参考资料)的设置设置设备摆设摆设把 MQ 行列步队绑定到 JNDI。

有了定义好的 JMS 模板,下一步便是把它绑定到示例利用法度榜样中,然后就可以用它发送和接管消息了。

Spring JMS 实现

JMS 模板可以绑定到利用法度榜样中,以发送和接管 JMS 消息。在清单 4 中可以看出我若何把 清单 1 中的 JMS 模板绑定到示例利用法度榜样中。

清单 4. 把 JmsTemplate 绑定到利用法度榜样中

可以看到,我把 jmsQueueTemplate 绑定到用来发送和接管消息的 JmsSender 利用法度榜样 bean 和 JmsReceiver bean。清单 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 消息。receive() 措施指定 JNDI 行列步队名,并从中检索消息。JMSTemplate 类的 processMessage() 措施由接管 JMS 客户机调用。JSMTemplate bean 的属性 receiveTimeout(列在 JMSTemplate 设置设置设备摆设摆设中)指定接管客户机同步地从行列步队中接管消息时要期待的光阴。

现在利用法度榜样的代码已完成!下一步便是设置设置设备摆设摆设 WebSphere MQ 行列步队并把它们绑定到 JNDI 工具。

行列步队治理器的设置

在运行利用法度榜样之前,必要设置 WebSphere MQ 的行列步队治理器和行列步队,并把它们绑定到 JNDI。假如爱好的话,可以按照这部分的示例做:只需 下载 设置 WebSphere MQ 行列步队的批文件和利用法度榜样的源代码和支配描述符即可。把 zip 文件解压到驱动器 C:。

设置行列步队

运行 C:\SpringSeriesPart4JMS\batch 文件夹中的 mqsetup.bat 文件。这个批文件要求在 path 情况变量中设置好 MQ 安装的 bin 文件夹(例如 C:\mqseries\bin)。运行了批文件之后,该当看到消息 “All valid MQSC commands were processed”。要打开 MQ Explorer 并反省已经创建的行列步队治理器和行列步队,请选择 Start -> Programs -> IBM MQSeries -> MQSeriesExplorer。图 1 显示出示例利用法度榜样 QueueManagerMQJMS.QManager 已经创建并正在运行。

图 1. WebSphere MQ 的 QueueManager 设置设置设备摆设摆设

请在利用法度榜样屏幕左侧面板上点击 MQJMS.QManager 下的 Queues 文件夹。该当看到已经创建了一个行列步队 RequestResponseQueue,如图 2 所示。

图 2. 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 文件,它会设置需要的 path 和 CLASSPATH 变量。要做到这点,只必要改动 classpath.cmd 文件中的 MQ_JAVA_INSTALL_PATH,把它指到 WebSphere MQ JMS 的安装目录。

接下来,改动 \MQSeriesInstallableDirectory\Java\bin 中的 JMSAdmin.config 设置设置设备摆设摆设文件,MQSeries JMS 治理法度榜样用它指明利用法度榜样要应用的高低文工厂和 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)

按回车

def q(JMS_RequestResponseQueue) qmgr(MQJMS.QManager)

queue(RequestResponseQueue)

按回车

现在已经把 WebSphere MQ 行列步队绑定到 JNDI 工具,作为利用法度榜样客户可以经由过程 JNDI 查询工具。现在剩下的便是看代码的实际感化了!

运行示例

要运行示例,请从 spring sourceforge download 下载 Spring 框架和它的所有依附文件并解压,例如解压到 c:\。会创建文件夹 C:\spring-framework-1.2-rc2(或最新版本)。

要运行 Spring 利用法度榜样,请把本文的源代码解压到随意率性文件夹,例如 c:\。会创建文件夹 SpringSeriesPart4JMS。就像前面提到过的,还必要安装 Apache Ant 和它的 Spring 依附 jar 文件。请把 Spring 库 —— 即 spring.jar(在 C:\spring-framework-1.2-rc2\dist 中)和 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 的内容。

您可能还会对下面的文章感兴趣: