??xml version="1.0" encoding="utf-8" standalone="yes"?>97亚洲熟妇自偷自拍另类图片,国产成人精品日本亚洲专区,国产亚洲美女精品久久http://m.tkk7.com/dudubird/category/20464.htmlzh-cnThu, 08 Mar 2007 19:57:02 GMTThu, 08 Mar 2007 19:57:02 GMT60Spring JMS 消息处理 1-2-3Q{Q?/title><link>http://m.tkk7.com/dudubird/articles/102663.html</link><dc:creator>毛里求斯的化?/dc:creator><author>毛里求斯的化?/author><pubDate>Thu, 08 Mar 2007 11:08:00 GMT</pubDate><guid>http://m.tkk7.com/dudubird/articles/102663.html</guid><wfw:comment>http://m.tkk7.com/dudubird/comments/102663.html</wfw:comment><comments>http://m.tkk7.com/dudubird/articles/102663.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/dudubird/comments/commentRss/102663.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/dudubird/services/trackbacks/102663.html</trackback:ping><description><![CDATA[ <blockquote>快速了解?Spring JMS 框架?IBM WebSphere MQ 5.3 q行 JMS 消息处理的基知识?/blockquote> <!--START RESERVED FOR FUTURE USE INCLUDE FILES--> <!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --> <!--END RESERVED FOR FUTURE USE INCLUDE FILES--> <p>?<i><a target="_new"><font color="#5c81a7">Spring pd</font></a></i> 的第 4 期也是最后一期中Q我介l?Spring JMSQJava 消息服务Q框架的Ҏ。JMS PG 定义?Java 应用E序通过面向消息的中间gQMOMQ创建和交换消息的标准途径?/p> <p>像在这个系列前面的文章中一P我将使用一个简单的CZ来演C?Spring JMS 的特性。您随我一道开发一个点对点的(P2PQ基于消息的pȝQ?Spring JMS 框架通过 JMS 接口?IBM ?WebSphere MQ 集成。完成练习后Q将可以通过q个pȝ发送和接收单的文本消息?/p> <p>在开始之前,?<a ><font color="#996699">下蝲文章的源代码</font></a>。请参阅 <a ><font color="#996699">参考资?/font></a> 讉K Spring 框架?IBM WebSphere MQ 5.3。还需?Apache Ant 来运行示例应用程序?/p> <p> <a name="N1007A"> <span id="hfpfdbx" class="atitle">Spring JMS</span> </a> </p> <p>Spring ?JMS 抽象框架化了 JMS API 的用,q与 JMS 提供者(比如 IBM ?WebSphere MQ 5.3Q^滑地集成?i>org.springframework.jms.core</i> 包提供了?Spring 中?JMS 的核心功能。它的模板类处理资源的创建和释放Q简化了 JMS 的用?/p> <p>像其他大多数 Spring 模板cMPJMS 模板cL供了执行公共操作?helper Ҏ。在需要更复杂应用的情况下Q类把处理Q务的核心委托l用户实现的回调接口。JMS cL供了方便的方法,用来发送消息、同步地使用消息以及向用户公开 JMS 会话和消息的制作者?/p> <p>以下 JMS 包和 <i>org.springframework.jms.core</i> 一h成了 Spring JMS 的功能:</p> <dl> <dt> <b>org.springframework.jms.support</b> </dt> <dd>提供转换 <code>JMSException</code> 的功能。{换代码把到?<code>JMSException</code> 层次l构转换成未到异常的镜像层ơ结构? </dd> <dt> <b>org.springframework.jms.support.converter</b> </dt> <dd>提供 <code>MessageConverter</code> 抽象Q以?Java 对象?JMS 消息之间q行转换? </dd> <dt> <b>org.springframework.jms.support.destination</b> </dt> <dd>提供理 JMS 目标的不同策略,比如针对 JNDI 中保存的目标的服务定位器? </dd> <dt> <b>org.springframework.jms.connection</b> </dt> <dd>提供适合在独立应用程序中使用?<code>ConnectionFactory</code> 实现。connection q包含针?JMS ?Spring <code>PlatformTransactionManager</code> 实现。它允许?JMS 作ؓ事务性资源集成到 Spring 的事务管理机制中?</dd> </dl> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td> <img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /> <br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /> </td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td> <img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /> <br /> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="center"> <img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /> <br /> </td> <td valign="top" align="right"> <a class="fbox" > <b> <font color="#996699">回页?/font> </b> </a> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p> <a name="N100BF"> <span id="dp9t3f5" class="atitle">IBM WebSphere MQ</span> </a> </p> <p>像前面提到的,CZ应用E序会用 Spring ?JMS 框架通过 JMS 接口?IBM ?WebSphere MQ 集成。通过在应用程序和 Web 服务之间传递消息,WebSphere MQ 提供了可靠的、有恢复能力的应用程序集成。它使用队列和事务性工具帮助保持消息跨|络的完整性。WebSphere MQ 降低了信息丢q风险和调和通信 IT pȝ的需要?/p> <p>WebSphere MQ 在它所支持的所有^C提供了一致的应用E序~程接口Q这有助于让集成的程序可UL。除了标准接口外QWebSphere MQ q完整实CJMS 接口Q包括对发布-订阅消息传递的支持。WebSphere MQ Explorer 工具可以q程地管理和配置整个 MQ |络。管理和配置工具Z开放源码的 Eclipse 框架Q而且是可扩展的?/p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td> <img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /> <br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /> </td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td> <img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /> <br /> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="center"> <img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /> <br /> </td> <td valign="top" align="right"> <a class="fbox" > <b> <font color="#996699">回页?/font> </b> </a> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p> <a name="N100CC"> <span id="jfnd1pr" class="atitle">Spring JMS 模板</span> </a> </p> <p>Spring 框架提供?<code>JmsTemplate</code> 的两个实现?code>JmsTemplate</code> cM?JMS 1.1 APIQ子c?<code>JmsTemplate102</code> 则?JMS 1.0.2 API。我的示例应用程序用的?<code>JmsTemplate102</code>?/p> <p>JMS 模板被用来发送和接收 JMS 消息。Spring 采用回调机制?JMS 信息传递进行协调?code>MessageCreator</code> 回调接口?<code>JmsTemplate</code> 中的调用代码提供?<code>Session</code> 创徏消息。ؓ了支?JMS API 更复杂的应用Q回?<code>SessionCallback</code> 向用h供了 JMS 会话Q?<code>callback ProducerCallback</code> 则公开?<code>Session</code> ?<code>MessageProducer</code> l合?</p> <p>清单 1 昄了示例应用程序用的 JMS 模板的配|。清单摘?<i>spring-mqseries-jms.xml</i> 文gQ请参阅 <a ><font color="#996699">下蝲</font></a>Q?</p> <br /> <br /> <a name="code1"> <b>清单 1. JMS 模板配置</b> </a> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode"> <!-- 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> </pre> </td> </tr> </tbody> </table> <br /> <p> <code>jmsQueueTemplate</code> bean ?JMS q接工厂?JMS 目标解析器绑定在一P用于解析 JMS 客户机通过 JNDI 提供的目标队列名?code>connectionFactory</code> 属性指定了如何获得?JMS 提供者的q接。在本例中,清单 2 昄了如何从 JNDI 索连接工厂?/p> <br /> <br /> <a name="N10127"> <b>清单 2. 通过 JNDI 配置 JMS q接工厂</b> </a> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode"> <!-- 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> </pre> </td> </tr> </tbody> </table> <br /> <p>可以看到Q?code>JndiObjectFactoryBean</code> 被绑定到 <code>internalJmsQueueConnectionFactory</code>?code>JndiObjectFactoryBean</code> ?<code>JndiTemplate</code> 属性进?JNDI 查询。Spring 用 <code>JndiTemplate</code> 中指定的环境属性和初始上下文在 JNDI 中查询连接工厂。清?3 昄?<code>JndiTemplate</code> 配置 bean 的配|?/p> <br /> <br /> <a name="N1014D"> <b>清单 3. JNDI 查询?JNDI 模板配置</b> </a> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode"> <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> </pre> </td> </tr> </tbody> </table> <br /> <p>以上配置q行 JNDI 查询时用 <code>com.sun.jndi.fscontext.RefFSContextFactory</code> 指定初始上下文工厂,用基于文件的 <i>file:/C:/JNDI-Directory</i> 作ؓ提供?URL。根据示例应用程序的意图QJNDI 讉K会采用基于文件的 <code>FSContext</code> 版本Q请参阅 <a ><font color="#996699">参考资?/font></a>Q的配置?MQ 队列l定?JNDI?/p> <p>有了定义好的 JMS 模板Q下一步就是把它绑定到CZ应用E序中,然后可以用它发送和接收消息了?/p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td> <img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /> <br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /> </td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td> <img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /> <br /> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="center"> <img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /> <br /> </td> <td valign="top" align="right"> <a class="fbox" > <b> <font color="#996699">回页?/font> </b> </a> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p> <a name="N10169"> <span id="ll9z7rd" class="atitle">Spring JMS 实现</span> </a> </p> <p>JMS 模板可以l定到应用程序中Q以发送和接收 JMS 消息。在清单 4 中可以看出我如何?<a ><font color="#996699">清单 1</font></a> 中的 JMS 模板l定到示例应用程序中?/p> <br /> <br /> <a name="N1017B"> <b>清单 4. ?JmsTemplate l定到应用程序中</b> </a> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode"> <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> </pre> </td> </tr> </tbody> </table> <br /> <p>可以看到Q我?<code>jmsQueueTemplate</code> l定到用来发送和接收消息?<code>JmsSender</code> 应用E序 bean ?<code>JmsReceiver</code> bean。清?5 昄了与 <code>JMSSender</code> cL关的代码?/p> <br /> <br /> <a name="N10199"> <b>清单 5. ?JmsTemplate 发?JMS 消息?JMSSender </b> </a> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode"> 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"); } }); } </pre> </td> </tr> </tbody> </table> <br /> <p> <code>JMSSender</code> cȝ <code>jmsTemplate102.send()</code> Ҏ发?JMS 消息?code>send()</code> Ҏ的第一个参数是 JNDI 队列名,队列名指定了消息应当发送到哪里。(很快׃看到如何?WebSphere MQ 的队列名l定?JNDI。)<code>send()</code> Ҏ的第二个参数?<code>MessageCreator</code> cR?code>JmsTemplate</code> 中的调用代码提供?<code>Session</code> c,q个cL供了一个创?JMS 消息的回调接口?/p> <p>下一步是?JMS ?<code>Session</code> cdZ个简单的文本消息。在代码执行Ӟ消息会传递给 WebSphere MQ 服务器的队列。清?6 昄了?<code>JmsTemplate</code> ?JMS 消息?<code>JMSReceiver</code> 应用E序 bean 的代码?/p> <br /> <br /> <a name="N101D1"> <b>清单 6. ?JmsTemplate ?JMS 消息?JMSReceiver</b> </a> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode"> 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(); } } } </pre> </td> </tr> </tbody> </table> <br /> <p> <code>JMSReceiver</code> cȝ <code>jmsTemplate102.receive()</code> Ҏ同步地接?JMS 消息?code>receive()</code> Ҏ指定 JNDI 队列名,q从中检索消息?code>JMSTemplate</code> cȝ <code>processMessage()</code> Ҏ由接?JMS 客户用?code>JSMTemplate</code> bean 的属?<i>receiveTimeout</i>Q列?<code>JMSTemplate</code> 配置中)指定接收客户机同步地从队列中接收消息时要{候的旉?/p> <p>现在应用E序的代码已完成Q下一步就是配|?WebSphere MQ 队列q把它们l定?JNDI 对象?/p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td> <img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /> <br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /> </td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td> <img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /> <br /> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="center"> <img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /> <br /> </td> <td valign="top" align="right"> <a class="fbox" > <b> <font color="#996699">回页?/font> </b> </a> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p> <a name="N101FC"> <span id="9fzzht3" class="atitle">队列理器的讄</span> </a> </p> <p>在运行应用程序之前,需要设|?WebSphere MQ 的队列管理器和队列,q把它们l定?JNDI。如果喜Ƣ的话,可以按照q部分的CZ做:只需 <a ><font color="#996699">下蝲</font></a> 讄 WebSphere MQ 队列的批文g和应用程序的源代码和部v描述W即可。把 zip 文g解压到驱动器 C:?/p> <p> <b>讄队列</b> <br />q行 <i>C:\SpringSeriesPart4JMS\batch</i> 文g夹中?<i>mqsetup.bat</i> 文g。这个批文g要求?path 环境变量中设|好 MQ 安装?bin 文g夹(例如 <i>C:\mqseries\bin</i>Q。运行了Ҏ件之后,应当看到消息 ?code>All valid MQSC commands were processed</code>”。要打开 MQ Explorer q检查已l创建的队列理器和队列Q请选择 <b>Start -> Programs -> IBM MQSeries -> MQSeriesExplorer</b>。图 1 昄出示例应用程?<code>QueueManager</code><code>MQJMS.QManager</code> 已经创徏q正在运行?/p> <br /> <br /> <a name="spring framework"> <b>?1. WebSphere MQ ?QueueManager 配置</b> </a> <br /> <img height="527" alt="WebSphere MQ ?QueueManager 配置" src="http://www.ibm.com/developerworks/cn/java/wa-spring4/mq_quesetup.jpg" width="542" /> <br /> <p>请在应用E序屏幕左侧面板上点?<code>MQJMS.QManager</code> 下的 <b>Queues</b> 文g夏V应当看到已l创Z一个队?<code>RequestResponseQueue</code>Q如?2 所C?/p> <br /> <br /> <a name="spring framework"> <b>?2. WebSphere MQ 的请?响应队列配置</b> </a> <br /> <img height="401" alt="WebSphere MQ 的请?响应队列配置" src="http://www.ibm.com/developerworks/cn/java/wa-spring4/mq_series.gif" width="572" /> <br /> <p>q就完成了队列的讄?/p> <p> <b>讄 JMS ?JNDI 理</b> <br /> <br />在示例应用程序中QJNDI 的访问利用了可以?JNDI 主页得到的基于文件的 <code>FSContext</code> 版本Q请参阅 <a href=""><font color="#5c81a7">参考资?/font></a>Q?i>FSContext.jar</i> 文g也包含在 WebSphere MQ ?JMS 支持当中。请d文g?<i>\MQSeriesInstallable\MQSeries\Java\lib</i> ?<i>\MQSeriesInstallable\MQSeries\Java\bin</i> 到系l的 PATH 环境变量中。而且Q请?<i>\MQSeriesInstallable\MQSeries\Java\lib</i> 文g夹中的所?jar 文gd到系l的 CLASSPATH 环境变量中。还可以q行 <i>C:\SpringSeriesPart4JMS\batch</i> 文g夹中?<i>classpath.cmd</i> 文gQ它会设|必要的 path ?CLASSPATH 变量。要做到q点Q只需要修?<i>classpath.cmd</i> 文g中的 <code>MQ_JAVA_INSTALL_PATH</code>Q把它指?WebSphere MQ JMS 的安装目录?/p> <p>接下来,修改 <i>\MQSeriesInstallableDirectory\Java\bin</i> 中的 <i>JMSAdmin.config</i> 配置文gQMQSeries JMS 理E序用它指明应用E序要用的上下文工厂和 JNDI 实现的地址。请取消以下行的注释Q?/p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">INITIAL_CONTEXT_FACTORY=com.sun.jndi.fscontext.RefFSContextFactory </pre> </td> </tr> </tbody> </table> <br /> <p>q注释掉其余两个 <code>INITIAL_CONTEXT_FACTORY</code> 变量。还要取消以下行的注释:</p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">PROVIDER_URL=file:/C:/JNDI-Directory </pre> </td> </tr> </tbody> </table> <br /> <p>q注释掉其余两个 <code>PROVIDER_URL</code> 变量?/p> <p>可以?<i>C:\SpringSeriesPart4JMS\batch</i> 文g夹中发现参考的CZ配置文g?/p> <p>Z保存 JNDI 对象Q请在驱动器 C: 上创建名?<i>JNDI-Directory</i> 的目录。切换到 <i>\MQSeriesInstallableDirectory\Java\bin</i> 目录q运?<i>JMSAdmin</i> ҎӞ应当看到 <i>InitCtx</i> 变量?/p> <p>逐个输入以下内容Q?/p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">def qcf(MQ_JMS_MANAGER) qmgr(MQJMS.QManager)<br /> 按回?br /> def q(JMS_RequestResponseQueue) qmgr(MQJMS.QManager) queue(RequestResponseQueue)<br /> 按回?br /></pre> </td> </tr> </tbody> </table> <br /> <p>现在已经?WebSphere MQ 队列l定?JNDI 对象Q作为应用程序客户可以通过 JNDI 查询对象。现在剩下的是看代码的实际作用了!</p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td> <img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /> <br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /> </td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td> <img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /> <br /> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="center"> <img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /> <br /> </td> <td valign="top" align="right"> <a class="fbox" > <b> <font color="#996699">回页?/font> </b> </a> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p> <a name="N102CE"> <span id="nbfd1f3" class="atitle">q行CZ</span> </a> </p> <p>要运行示例,请从 <a target="_new"><font color="#5c81a7">spring sourceforge download</font></a> 下蝲 Spring 框架和它的所有依赖文件ƈ解压Q例如解压到 c:\。会创徏文g?<i>C:\spring-framework-1.2-rc2</i>Q或最新版本)?/p> <p>要运?Spring 应用E序Q请把本文的源代码解压到L文g夹,例如 <i>c:\</i>。会创徏文g?<i>SpringSeriesPart4JMS</i>。就像前面提到过的,q需要安?Apache Ant 和它?Spring 依赖 jar 文g。请?Spring ?—??<i>spring.jar</i>Q在 <i>C:\spring-framework-1.2-rc2\dist</i> 中)?<i>commons-logging.jar</i>Q在 <i>C:\spring-framework-1.2-rc2\lib\jakarta-commons</i> 中)拯?<i>SpringSeriesPart4JMS\lib</i> 文g夏V还要把所有的 jar 库从 <i>\MQSeriesInstallableDirectory\Java\lib</i> 目录拯?<i>SpringSeriesPart4JMS\lib</i> 文g夏V其中包?MQseries ?JMS 的相兛_。现在就拥有了构建的依赖集?/p> <p>接下来,打开命o提示W,切换?<i>SpringProject4</i> 目录Qƈ在命令提C符下输入以下命令:</p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">> ant -f build-jmssender.xml. </pre> </td> </tr> </tbody> </table> <br /> <p>q会构徏q运?<code>SendMQSpringJMS</code> c,它会调用 <code>JMSSender</code> c,发送消息到 WebSphere MQ <code>RequestResponse</code> 队列?code>SendMQSpringJMS</code> q会通过它的 <code>ClassPathXmlApplicationContext</code> 装入 spring 配置文g。一?bean 全部装蝲Q就可以通过 Spring ?ApplicationContext ?<code>getBean()</code> Ҏ讉K JMSSenderQ请参阅清单 7Q?/p> <br /> <br /> <a name="N10326"> <b>清单 7. 装入CZ应用E序?Spring 配置</b> </a> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode"> ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(new String[] { "spring-mqseries-jms.xml" }); JMSSender jmsSender = (JMSSender) appContext.getBean("jmsSender"); </pre> </td> </tr> </tbody> </table> <br /> <p>消息传递到队列上之后,误?JMS 接收方客h以检索消息。请打开命o提示W,切换到目?<i>SpringProject4</i>Qƈ输入Q?/p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">> ant -f build-jmsreceiver.xml </pre> </td> </tr> </tbody> </table> <br /> <p>q会构徏q运?<code>ReceiveMQSpringJMS</code> c,该类会调?<code>JMSReceiver</code> c,以从 WebSphere MQ ?<code>RequestResponse</code> 队列接收文本消息。在控制C会打印出以下消息Q?/p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode">Message Received --> This is a sample message. </pre> </td> </tr> </tbody> </table> <br /> <p> <a name="N1034A"> <span id="ndtrzff" class="smalltitle"> <strong> <font face="Arial">l束?/font> </strong> </span> </a> </p> <p>?Spring pd的最后这文章中Q您学习?Spring JMS 框架的基。我首先介绍了示例应用程序的核心lg —?Spring JMS 框架?IBM ?WebSphere MQ 5.3Q然后介l了如何?Spring JMS 模板?WebSphere MQ 队列发送消息和从中接收消息。虽然这个示例非常简单,但是可以把这里介l的步骤应用到更复杂的应用程序?/p> <p>我希望介l?Spring 框架核心模块的这一pdҎ有所帮助。请参阅 <a ><font color="#996699">参考资?/font></a> 学习更多有关 Spring 框架?Spring JMS 的内宏V?/p> <br /> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td> <img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /> <br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /> </td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td> <img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /> <br /> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="center"> <img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /> <br /> </td> <td valign="top" align="right"> <a class="fbox" > <b> <font color="#996699">回页?/font> </b> </a> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p> <span id="v9l7fz9" class="atitle"> <a name="download">下蝲</a> </span> </p> <table class="data-table-1" cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <th scope="col">描述</th> <th scope="col">名字</th> <th scope="col" align="right">大小</th> <th scope="col">下蝲Ҏ</th> </tr> <tr> <th class="tb-row" scope="row">Example code, Spring files, and build scripts</th> <td nowrap="">wa-spring4-SpringSeriesPart4JMS.zip</td> <td nowrap="" align="right">17 KB</td> <td nowrap=""> <a class="fbox" href="ftp://www6.software.ibm.com/software/developer/library/wa-spring4-SpringSeriesPart4JMS.zip"><b><font color="#5c81a7">FTP</font></b></a></td> </tr> </tbody> </table> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr valign="top"> <td colspan="5"> <font color="#5c81a7"> <img height="12" alt="" src="http://www.ibm.com/i/c.gif" width="12" border="0" /> </font> </td> </tr> <tr> <td> <font color="#5c81a7"> <img height="16" alt="" src="http://www.ibm.com/i/v14/icons/fw.gif" width="16" /> </font> </td> <td> <a class="fbox" > <font color="#5c81a7">关于下蝲Ҏ的信?/font> </a> </td> <td> <font color="#5c81a7"> <img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="50" /> </font> </td> <td> <font color="#5c81a7"> <img height="16" alt="" src="http://www.ibm.com/i/v14/icons/sout.gif" width="16" /> </font> </td> <td> <a class="fbox" > <font color="#5c81a7">Get Adobe] Reader]</font> </a> </td> </tr> </tbody> </table> <br /> <br /> <p> <a name="resources"> <span id="9jhjb9p" class="atitle">参考资?</span> </a> </p> <b>学习</b> <br /> <ul> <li>您可以参阅本文在 developerWorks 全球站点上的 <a target="_blank"><font color="#5c81a7">英文原文</font></a>?br /><br /></li> <li>?a ><font color="#5c81a7">轻量U开发的成功U诀Q第 3 部分: Spring 露出水面</font></a>”(Bruce TateQdeveloperWorksQ?005 q?6 月)QBruce Tate 介绍?Spring 作ؓ轻量U容器的意义?br /><br /></li> <li>?a ><font color="#5c81a7">Writing Java Message Service programs using WebSphere MQ V5.3</font></a>”(Willy FarrellQdeveloperWorksQ?003 q?10 月)Q安装和配置 WebSphere MQ 5.3 以进?JMS 开发和试的详l指对{?br /><br /></li> <li>?a ><font color="#5c81a7">?AXIS ~写 JMS 应用E序</font></a>”(Naveen BalaniQdeveloperWorksQ?003 q?2 月)Q开发同?JMS SOAP 应用E序?br /><br /></li> <li> <a > <font color="#5c81a7">Web 架构专区</font> </a>Q数癄涉及Z Web 的解x案的文章?/li> </ul> <br /> <b>获得产品和技?/b> <br /> <ul> <li> <a > <font color="#5c81a7">Spring 主页</font> </a>Q下?Spring 框架?br /><br /></li> <li> <a > <font color="#5c81a7">JMS 主页</font> </a>Q下?Java 消息服务?br /><br /></li> <li> <a > <font color="#5c81a7">JNDI 主页</font> </a>Q下?JNDI ?FSContext?br /><br /></li> <li> <a > <font color="#5c81a7">WebSphere MQ</font> </a>Q得到可信的、可靠的 JMS 提供者?br /><br /></li> </ul> <br /> <b>讨论</b> <br /> <ul> <li> <a > <font color="#5c81a7">参与论坛讨论</font> </a>?br /><br /></li> <li> <a > <font color="#5c81a7">developerWorks blogs</font> </a>Q加?developerWorks C֌?br /></li> </ul> <img src ="http://m.tkk7.com/dudubird/aggbug/102663.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/dudubird/" target="_blank">毛里求斯的化?/a> 2007-03-08 19:08 <a href="http://m.tkk7.com/dudubird/articles/102663.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Spring JMSL实现异步消息传递(转)http://m.tkk7.com/dudubird/articles/102650.html毛里求斯的化?/dc:creator>毛里求斯的化?/author>Thu, 08 Mar 2007 10:07:00 GMThttp://m.tkk7.com/dudubird/articles/102650.htmlhttp://m.tkk7.com/dudubird/comments/102650.htmlhttp://m.tkk7.com/dudubird/articles/102650.html#Feedback0http://m.tkk7.com/dudubird/comments/commentRss/102650.htmlhttp://m.tkk7.com/dudubird/services/trackbacks/102650.htmlJava消息服务(JMS)是用于编写用异步消息传递的JEE应用E序的API。传l的使用JMS APIq行消息传递的实现包括多个步骤Q例如JNDI查询队列q接工厂和Queue资源Q在实际发送和接收消息前创Z个JMS会话?

   Spring框架则简化了使用JEElg(包括JMS)的Q务。它提供的模板机刉藏了典型的JMS实现的细节,q样开发h员可以集中精力放在处理消息的实际工作中,而不用担心如何去创徏Q访问或清除JMS资源?/p>

   本文对Spring JMS API作一个概qͼq过一个运行在JBoss MQ服务器上的web例程来介l如何用Spring JMS API来异步处理(发送和接收Q消息。我通过传统JMS实现和Spring JMS实现两者间的比较,来展CZ用Spring JMS处理消息是如何的单和灉|?/p>

异步消息传递和面向服务架构

  在现实中Q大多数webh都是同步处理的。例如,当用戯d一个网站,首先输入用户名和密码Q然后服务器验证d合法性。如果验证成功,E序允许该用户q入|站。这里,dh在从客户端接收以后被x处理了。信用卡验证是另一个同步处理的例子Q只有服务器证实输入的信用卡h有效的,同时客户在帐户上有够的存款Q客h被允许l操作。但是让我们思考一下在序处理pȝ上的支付l算步骤。一旦系l证实该用户信用卡的信息是准的Qƈ且在帐户上有_的资金,׃必等到所有的支付l节落实、{账完成。支付结可以异步方式进行,q样客户可以l箋q行核查操作?/p>

   需要比典型同步h耗费更长旉的请求,可以使用异步处理。另一个异步处理的例子是,在本地贷Ƒ֤理程序中Q提交至自动扉KpȝQAUSQ的信用h处理q程。当借方提交h甌后,抉|公司会向AUS发送请求,以获取信用历史记录。由于这个请求要求得到全面而又详细的信用报告,包括借方C和过ȝ帐户Q最q的付款和其他胦务资料,服务器需要耗费较长的时_几小时或着有时甚至是几天)来对q些h作出响应。客LE序Q应用)要与服务器连接ƈ耗费如此长的旉来等待结果,q是毫无意义的。因此通信应该是异步发生的Q也是Q一旦请求被提交Q它p攄在队列中Q同时客L与服务器断开q接。然后AUS服务从指定的队列中选出hq行处理Qƈ处理得到的消息攄在另一个消息队列里。最后,客户端程序从q个队列中选出处理l果Q紧接着处理q个信用历史数据?/p>

JMS

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

  1. 创徏JNDI初始上下文(contextQ?
  2. 从JNDI上下文获取一个队列连接工厂?
  3. 从队列连接工厂中获取一个Quene?
  4. 创徏一个Session对象?
  5. 创徏一个发送者(senderQ或接收者(receiverQ对象?
  6. 使用步骤5创徏的发送者或接收者对象发送或接收消息?
  7. 处理完消息后Q关闭所有JMS资源?
您可以看刎ͼ步骤6是处理消息的唯一地方。其他步骤都只是理与实际业务要求无关的JMS资源Q但是开发h员必ȝ写ƈl护q些额外步骤的代码?

Spring JMS

   Spring框架提供了一个模板机制来隐藏Java APIs的细节。JEE开发h员可以用JDBCTemplate和JNDITemplatecL分别讉K后台数据库和JEE资源Q数据源Q连接池Q。JMS也不例外。Spring提供JMSTemplatec,因此开发h员不用ؓ一个JMS实现ȝ写样本代码。接下来是在开发JMS应用E序时Spring所h一些的优势?/p>

  1. 提供JMS抽象APIQ简化了讉K目标Q队列或主题Q和向指定目标发布消息时JMS的用?
  2. JEE开发h员不需要关心JMS不同版本Q例如JMS 1.0.2与JMS 1.1Q之间的差异?
  3. 开发h员不必专门处理JMS异常Q因为Spring为所有JMS异常提供了一个未l检查的异常Qƈ在JMS代码中重新抛出?
一旦您在JMS应用E序中开始用SpringQ您会ƣ赏到它在处理异步消息传递上的简ѝSpring JMS框架提供多种Javac,可以L实现JMS应用。表1列出了这些类的一部分?

   ?. Spring JMSc?/p>
cd?/th>功能
JmsExceptionorg.springframework.jms只要发生一个JMS异常QSpring框架׃抛出异常Q这个类是这些所抛出的异常的基(抽象Q类?/td>
JmsTemplate, JmsTemplate102org.springframework.jms.coreq些是辅助类Q用于简化JMS的用,处理JMS资源Q如q接工厂Q目标和发送?接收者对象)的创建和释放。JmsTemplate102是JmsTemplate的子c,使用JMS1.0.2规范
MessageCreatororg.springframework.jms.coreq是JmsTemplatecM用的回叫接口Q它为指定的会话创徏JMS消息?/td>
MessageConverterorg.springframework.jms.support.converterq个接口充当一个抽象,用来在Java对象与JMS消息之间q行转换?/td>
DestinationResolverorg.springframework.jms.support.destinationq是JmsTemplate用来解析目标名的接口。该接口的默认实现是DynamicDestinationResolver和JndiDestinationResolve

  在接下来的部分,我将详细解释?所列的一部分c(例如JmsTemplateQDestinationResolver和MessageConverterQ?/p>

JMSTemplate

  JmsTemplate提供了几U辅助方法,用来执行一些基本操作。要开始用JmsTemplate前,您需要知道JMS供应商支持哪个JMS规范Q?a target="_blank">JBoss AS 4.0.2?a target="_blank">WebLogic 8.1服务器支持JMS 1.0.2规范。WebLogic Server 9.0包括了对JMS 1.1规范?a target="_blank">支持。JMS 1.1l一了点对点QPTPQ和发布/订阅QPub/SubQ域的编E接口。这U改变的l果是Q开发h员可以创Z个事务会话,然后在这同一个JMS会话里,可以从一个Queue(PTP)中接收消息,同时发送另一个消息到一个Topic(Pub/Sub)。JMS 1.1向后兼容JMS 1.0Q应此根据JMS 1.0~写的代码仍可以适用于JMS 1.1?/p>

   JmsTemplate提供多种发送和接收消息的方法。表2列出了这些方法的一部分?/p>

   ?. JMS templateҎ

Ҏ名称功能
send发送消息至默认或指定的目标。JmsTemplate包含sendҎQ它通过javax.jms.Destination或JNDI查询来指定目标?/td>
receive从默认或指定的目标接收消息,但只会在指定的时间后传递消息。我们可以通过receiveTimeout属性指定超时时间?/td>
convertAndSendq个Ҏ委托MessageConverter接口实例处理转换q程Q然后发送消息至指定的目标?/td>
receiveAndConvert从默认或指定的目标接收消息。ƈ消息{换ؓJava对象?/td>

  目标可以通过JNDI上下文保存和获取。当配置SpringE序上下文(application contextQ时Q我们可以用JndiObjectFactoryBeancd得对JMS的引用。DestinationResolver接口是用来把目标名称解析成JMS目标Q当应用E序存在大量目标Ӟq是非常有用的。DynamicDestinationResolver(DestinationResolver的默认实?是用来解析动态目标的?/p>

   MessageConverter接口定义了将Java对象转换为JMS消息的约定。通过q个转换器,应用E序代码可以集中于处理事务对象,而不用ؓ对象如何表示为JMS消息q样的内部细节所困饶。SimpleMessageConverter(和SimpleMessageConverter102)是MessageConverter的默认实现。可使用它们分别String转换为JMS TextMessageQ字节数l?byte[])转换为JMS BytesMessageQMap转换为JMS MapMessageQ和Serializable对象转换为JMS ObjectMessage。您也可以编写自定义的MessageConverter实例Q通过XMLl定框架Q例?a target="_blank">JAXBQ?CastorQ?a target="_blank">Commons DigesterQ?a target="_blank">XMLBeans?a target="_blank">XStreamQ,来实现XML文档到TextMessage对象的{换?/p>

CZE序

  我将用一个贷Ƅ请处理系l(命名为LoanProcQ示例来演示如何在JMS应用E序中用Spring。作ƄL一部分QLoanProc通过发送贷ƾ详情(hIDQ借方名字Q借方的SSNQ贷ƾ期限和h数额Q,从AUSpȝ获得信用历史详情。ؓ了简便v见,我们Z两个基本参数来表CZ用历史详情:信用分数Q又名FICO得分Q和h数额。让我们假设处理信用查请求是按以下业务规则进行的Q?/p>

  1. 如果h数额{于或低?500,000Q借方必须臛_有一??的信用(也就是,借方的FICO得分?80?99之间Q?
  2. 如果h数额高于$500,000Q借方必须臛_?很好"的信用,意味着借方的信用得分要高于700?

h甌使用案例

  信用h处理使用案例包括以下几个步骤Q?/p>

  1. 用户在贷Ƅ请页面输入贷ƾ详情ƈ提交h甌?
  2. 发送请求到一个名为CreditRequestSendQueue的消息队列。然后程序发送贷ƾ详情到AUSpȝQ获取信用历史详情?
  3. AUSpȝ从队列中挑出h详情Qƈ使用h参数从它的数据库中获取信用历史信息?
  4. 然后AUS找到的借方的信用历史信息创Z个新的消息,发送到一个新的名为CreditRequestReceiveQueue的消息队列?
  5. 最后,LoanProc从接攉列中选出响应消息Q处理贷Ƅh军_是否批准或否决申诗?

  在这个例E中Q两个消息队列都配置在同一个JBoss MQ server上。用案例用?的序列图QSequenceDiagramQ表C?/p>

序列? src=

?.h处理E序的序列图 (单击截图来查看完整视?

   下面的表3昄了在例程中我所使用的不同技术和开?/a>框架Qƈ按应用逻辑层排列?/p>

   ?. 在JMS应用E序中用的框架

逻辑?/th>技?框架
MVCSpring MVC
ServiceSpring Framework (version 2.1)
JMS APISpring JMS
JMS ProviderJBoss MQ (version 4.0.2)
JMS ConsoleHermes
IDEEclipse 3.1

使用Hermes讄JMS资源

  Z异步处理消息Q首先我们需要消息队列发送和接收消息。我们可以用Jboss里的配置XML文g创徏一个新的消息队列,然后使用JMS控制台浏览队列的详细情况。清?昄了配|JMS的XML配置代码片断Q这个应该加入到jbossmq-destinations-service.xml文gQ位?JBOSS_HOME%\server\all\deploy-hasingleton\jm文g夹下。)

   清单1.JBoss MQ Server上JMS队列的配|?/p>

<!--  Credit Request Send Queue  -->
<mbean code="org.jboss.mq.server.jmx.Queue"
  name="jboss.mq.destination:service=Queue,name=CreditRequestSendQueue">
  <depends optional-attribute-name="DestinationManager">
 jboss.mq:service=DestinationManager
  </depends>
</mbean>

<!--  Credit Request Receive Queue  -->
<mbean code="org.jboss.mq.server.jmx.Queue"
  name="jboss.mq.destination:service=Queue,name=CreditRequestReceiveQueue">
  <depends optional-attribute-name="DestinationManager">
 jboss.mq:service=DestinationManager
  </depends>
</mbean>

  现在Q让我们看看如何使用一个名为Hermes的JMS工具来浏览消息队列?a target="_blank">Hermes是一个Java Swing应用E序Q它可以创徏、管理和监视JMS提供商(例如JBossMQQ?a target="_blank">WebSphereMQQ?a target="_blank">ActiveMQ?a target="_blank">Arjuna服务器)里的JMS目标。从它的|站上下载HermesQ解压羃.zip文g到本地目录(例如Qc:\dev\tools\hermesQ。一旦安装完成,双击文ghermes.batQ位于bin文g夹下Q启动程序?/p>

   要在Hermes里配|JBossMQ服务器,请参考Hermes|站上的q个演示。它有着的step-by-step可视化指C来配置JBoss MQ。当配置一个新的JNDI初始上下文时Q请输入下面的信息?/p>

  • providerURL = jnp://localhost:1099
  • initialContextFactory = org.jnp.interfaces.NamingContextFactory
  • urlPkgPrefixes = org.jnp.interfaces:org.jboss.naming
  • securityCredentials = admin
  • securityPrincipal = admin

  当您创徏新的目标Ӟ误入queue/CreditRequestSendQueue和queue/CreditRequestReceiveQueue。图2昄了JMS控制台的ȝ口,其中有ؓJMS例程创徏的新的消息队列?/p>

Hermes中所有目标的截图

?2. Hermes中所有目标的截图.Q单L图来查看完整视图Q?/p>

   下面的图3昄了在从消息发送者类发送消息到CreditRequestSendQueue后,Hermes JMS控制台及消息队列的截图。您可以看见?个消息在队列中,控制台显CZ消息详情Q例如消息IDQ消息目标,旉戛_实际的消息内宏V?/p>

Hermes中所有队列的截图

?3. Hermes中所有队列的截图.Q单L图来查看完整视图Q?/p>

   在例E中使用的队列名U和其他JMS和JNDI参数见表 4?/p>

   ?. Spring JMS配置参数

参数名称参数?/th>
Initial Context Factoryorg.jnp.interfaces.NamingContextFactory
Provider URLlocalhost:8080
Initial Context Factory URL Packagesorg.jnp.interfaces:org.jboss.naming
Queue Connection FactoryUIL2ConnectionFactory
Queue Namequeue/CreditRequestSendQueue, queue/CreditRequestReceiveQueue

Spring配置

  既然我们已经有了q行例程所需要的JMS目标Q现在该了解?a target="_blank">XML Spring配置文gQ名为spring-jms.xmlQ来l配JMSlg的具体细节了。这些组件是ҎInversion of Controller (IOC)设计模式里的讄方式注入原则Qsetter injection principleQ,用JMS对象实例cȝ配的。让我们详细查看q些lgQƈ为每一个JMSlg演示一DXML配置代码?/p>

   JNDI上下文是取得JMS资源的v始位|,因此首先我们要配|JNDI模板。清?昄了名为jndiTemplate的Spring beanQ其中列有JNDI初始上下文所必需的常用参数?/p>

   清单2. JNDI上下文模?/p>

<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>

  接着Q我们配|队列连接工厂。清?昄了队列连接工厂的配置?/p>

   清单3. JMS队列q接工厂配置

<bean id="jmsQueueConnectionFactory"
      class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiTemplate">
        <ref bean="jndiTemplate"/>
    </property>
    <property name="jndiName">
        <value>UIL2ConnectionFactory</value>
    </property>
</bean>

  我们定义2个JMS目标来发送和接收消息。详情见清单4??/p>

   清单4. 发送队列配|?/p>

<bean id="sendDestination"
    class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiTemplate">
        <ref bean="jndiTemplate"/>
    </property>
    <property name="jndiName">
        <value>queue/CreditRequestSendQueue</value>
    </property>
</bean>

  清单5. 接收队列配置

<bean id="receiveDestination"
    class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiTemplate">
        <ref bean="jndiTemplate"/>
    </property>
    <property name="jndiName">
        <value>queue/CreditReqeustReceiveQueue</value>
    </property>
</bean>

  然后我们再来配置JmsTemplatelg。在例程中我们用JmsTemplate102。同时用defaultDestination属性来指定JMS目标?/p>

   清单6. JMS模板配置

<bean id="jmsTemplate" 
      class="org.springframework.jms.core.JmsTemplate102">
    <property name="connectionFactory">
        <ref bean="jmsQueueConnectionFactory"/>
    </property>
    <property name="defaultDestination">
        <ref bean="destination"/>
    </property>
    <property name="receiveTimeout">
        <value>30000</value>
    </property>
</bean>

  最后我们配|发送者和接收者组件。清??分别是Sender ?Receiver对象的配|?/p>

   清单7. JMS Sender配置

<bean id="jmsSender" class="springexample.client.JMSSender">
    <property name="jmsTemplate">
        <ref bean="jmsTemplate"/>
    </property>
</bean>

  清单8. JMS Receiver配置

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

试及监?/h3>

  我写了一个测试类Q命名ؓLoanApplicationControllerTestQ用来测试LoanProcE序。我们可以用这个类来设定贷Ƒ֏C及调用信用请求服务类?/p>

   让我们看一下不使用Spring JMS API而用传lJMS开发途径的消息发送者实例。清?昄了MessageSenderJMSc里的sendMessageҎQ其中包含了使用JMS API处理消息的所有必需步骤?/p>

   清单9. 传统JMS实例

public void sendMessage() {

    queueName = "queue/CreditRequestSendQueue";
    System.out.println("Queue name is " + queueName);

    /*
     * Create JNDI Initial Context
     */
    try {
        Hashtable env = new Hashtable();
        env.put("java.naming.factory.initial",
            "org.jnp.interfaces.NamingContextFactory");
        env.put("java.naming.provider.url","localhost");
        env.put("java.naming.factory.url.pkgs",
            "org.jnp.interfaces:org.jboss.naming");

        jndiContext = new InitialContext(env);
    } catch (NamingException e) {
        System.out.println("Could not create JNDI API " +
            "context: " + e.toString());
    }

    /*
     * Get queue connection factory and queue objects from JNDI context.
     */
    try {
        queueConnectionFactory = (QueueConnectionFactory)
        jndiContext.lookup("UIL2ConnectionFactory");

        queue = (Queue) jndiContext.lookup(queueName);
    } catch (NamingException e) {
        System.out.println("JNDI API lookup failed: " +
            e.toString());
    }

    /*
     * Create connection, session, sender objects.
     * Send the message.
     * Cleanup JMS connection.
     */
    try {
        queueConnection =
            queueConnectionFactory.createQueueConnection();
        queueSession = queueConnection.createQueueSession(false,
                Session.AUTO_ACKNOWLEDGE);
        queueSender = queueSession.createSender(queue);
        message = queueSession.createTextMessage();
        message.setText("This is a sample JMS message.");
        System.out.println("Sending message: " + message.getText());
        queueSender.send(message);

    } catch (JMSException e) {
        System.out.println("Exception occurred: " + e.toString());
    } finally {
        if (queueConnection != null) {
            try {
                queueConnection.close();
            } catch (JMSException e) {}
        }
    }
}

  现在Q我们来看看使用了Spring的消息发送者实例。清?0昄了MessageSenderSpringJMScMsendҎ的代码?/p>

   清单10. 使用Spring API的JMS实例

public void send() {
    try {
        ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(new String[] {
                "spring-jms.xml"});

        System.out.println("Classpath loaded");

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

        jmsSender.sendMesage();

        System.out.println("Message sent using Spring JMS.");
    } catch(Exception e) {
        e.printStackTrace();
    }
}

  如您所见,通过使用配置文gQ所有与理JMS资源有关的步骤都交由Spring容器处理。我们只需引用一个JMSSender对象Q然后调用对象里的sendMessageҎ?/p>

l束?/h3>

  在本文中Q我们看到Spring框架是如何用JMS API化异步消息传递。SpringL了所有用JMS处理消息所必需的样本代码(例如得到一个队列连接工厂,从Java代码里创建队列和会话对象Q在q行时用配|文件对它们q行l配Q。我们可以动态的交换JMS资源对象Q而不必修改Q何Java代码Q这要感谢Inversion of Control (IOC) 原则的力量?/p>

  既然异步消息传递是SOA框架的整体构成部分,Spring很适合U_到SOA工具集。此外,JMS理工具Q如HermesQ得创建、管理和监督JMS资源变得ҎQ特别是对于pȝ理员来说?/p>

]]>利用JMS建立消息传递系l(转)http://m.tkk7.com/dudubird/articles/102647.html毛里求斯的化?/dc:creator>毛里求斯的化?/author>Thu, 08 Mar 2007 09:53:00 GMThttp://m.tkk7.com/dudubird/articles/102647.htmlhttp://m.tkk7.com/dudubird/comments/102647.htmlhttp://m.tkk7.com/dudubird/articles/102647.html#Feedback0http://m.tkk7.com/dudubird/comments/commentRss/102647.htmlhttp://m.tkk7.com/dudubird/services/trackbacks/102647.html
  ExchangeQ交换)pȝ

  消息交换反映了程序组件或应用E序之间的一U交互作用。消息交换系l是一U类g下的pȝQ一个相似系l的客户端可以发送和接收M其它客户端的消息。每个客L都ƈ入系l的代理中,它提供了建立、发送、接收和d消息的可能?br />
  交换pȝ使得分布式的交互操作成ؓ可能。组件在目的圎ͼDestinationQ发送消息,收gZ可以在相同的目的C得到q个消息。发送者和收gZ一定是互相熟悉的。换句话_它ƈ没有发送者知道一些收件h的信息,也没有强q收件h知道某些发送者的信息。发送者和收g人只需要知道消息的格式以及要到辄目的地。在q种情Ş下,上述的系l不同于与它紧密相连的一些技术,例如q程Ҏ调用QRMIQ,它只要求开发h员了解RMI中的一些方法?br />
  消息传递系l?/strong>

  消息传递系l是一U分布式的系l,是基于系l组件之间的异步消息交换。面向消息的中间ӞMessage-Oriented MiddlewareQMOMQ就是这U品,消息传递系l是在它的原理上建立的?br />
  消息传递系l应用Y件不会直接地通讯Q这与传l的pȝQ基于RMI的)形成鲜明的对照)Q而需要依赖MOM的帮助。如果系l的某个lg希望l另一个组件发送消息,它将把给定的消息发送给MOMQ接着MOM把该消息发送给收g人?br />

  与传l的ZRMI构徏的系l相比,它有以下优点Q?br />
  · 发送消息的应用E序不需要期待回应,可以l箋执行?br />
  · 没有发送消息的应用E序和特定消息的收g人在某个特定的时LȀzȝ。如果消息的收gZ是激zȝQMOM保证收gZ旦激zd立即收到该消息?br />
  · pȝlg没有直接地彼此相q。它们被分离开了,q就是在q行时刻能把lg从一个主Z输到另一个、却不会中断pȝ可用性的原因?br />
  消息交换模型Q点对点模型和发表-预订模型

  目前有两U“基本的”消息交换模型:点对Ҏ型和发表Q预订(pub-subQ模型。点对点模型应用于一个或多个lgQ发送者)仅仅l一个组件收件hQ接收者)发送消息的情Ş。这U模型是Z消息队列概念的:发送者把消息发送到队列中,接收者从该队列中d消息。在点对Ҏ型中Q相同的队列上可能存在多个接收者,但是MOM只给其中一个传递消息。给哪一个传递消息依赖于MOM的实玎ͼimplementationQ?br />
  发表Q预订模型应用于一个或多个lgQ发表者)l一个或多个lg收g人(预订者)发送消息的情Ş。这U特定的模型是基于消息主题(message topicQ概늚Q发表者把消息发送到某个主题中,而该特定主题的预订者接收这些消息?br />
  发表Q预订模型看h更加“优雅”,但是很多发表Q预订模型不能保证消息按照发送的ơ序传递(它与点对Ҏ型相反,点对炚w列实CFIFOQ先q先出)原理Q。因此,消息的次序很重要Q或者ؓ了同步需要用消息的头和属性部分)的时候,应该避免采用发表-预订模型?br />
  Java消息服务QJMSQ是使用面向消息中间件的一套Java APIQ它允许你的应用E序建立、发送、接收和d消息。这l程序集位于J2EEE序包结构树上的javax.jmsE序包中。JMS在很多MOM产品中得C实现Q其中iPlanet Message Queue?IBM MQSeries、Progress Software SonicMQ、BEA WebLogic Server、Prism Technologies OpenFusion{最有名气,也存在一些免费的实现?br />
  JMS同时支持消息交换的两U“基本的”模型。但是,其说明(specificationQƈ没有要求厂商同时实现两种模型Q尽大多数JMS产品实现了点对点和发表-预订模型?br />
  JMS应用E序

  JMS应用E序的主要部分是Q?br />
  · 产生q接的部分和目的?br />
  · q接

  · 对话

  · 产生消息的部?br />
  · 使用消息的部?br />
  · 消息

  产生q接的部分(ConnectionFactoryQ是负责建立JMSq接的对象。每个ConnectionFactory都是QueueConnectionFactory或TopicConnectionFactory的一个副本(copyQ。MOM理器徏立特定的对象Qƈ把它与JNDI树关联v来,q样JMS客户端就能够使用标准的JNDI查找表得到ConnectionFactory的入口。在点对点的模型中,它用了javax.jms.QueueConnectionFactoryQ在发表Q预订模型中Q它使用的是javax.jms.TopicConnectionFactory?br />
  目的圎ͼDestinationQ——它是队列或主题Q这依赖于我们用了下面哪种模型Qjavax.jms.Queue或javax.jms.Topic?br />
  q接QConnectionQ——它可能是客L和服务应用之间的开攄TCP/IP。它可以被用于徏立一个或量的对话。在你的应用E序能够接收消息前,你必调用start()Ҏ。ؓ了暂停发送消息,你需要调用stop()?br />
  对话QSessionQ——在JMSq接的帮助下建立的对象,被客L用作发送和接收消息?br />
  产生消息的部分(MessageProducerQ——对话徏立的对象Q被用于在目的地中发送消息?br />
  使用消息的部分(MessageConsumerQ——对话徏立的对象Q用于接收消息。ؓ了同步接收消息,需要用receive()Ҏ。对于异步的情ŞQ用MessageListener和唯一的方法——onMessage()。在该方法中Q在定义的消息到辑֐应该执行一定的操作?br />
  消息QMessageQ——消息本w。JMS消息׃个部分组成:

  · 消息?br />
  · 属性(不是必要的)

  · 消息体(不是必要的)

  本文没有解释更多的细节信息,你可以在官方文档中找到具体的l节?img src ="http://m.tkk7.com/dudubird/aggbug/102647.html" width = "1" height = "1" />

]]>
վ֩ģ壺 ߲| ѿС12Ƶ| ޾Ʒ뾫ƷmV߹ۿ| ŮɫëƬѿ| һɫþ88ۺ޾Ʒ| þ޾Ʒվ| avר| ѹۿվ| ٸ69XXX| þ޾Ʒվ| Ѵվ߹ۿ| պëƬƵ| ޾Ʒ߹ۿ| ҹվ߹ۿۿ| ձһ| aһëƬѸ| AVþþƷ| һһͰһƵ | ëƬa߹ۿ| ߹ۿ| ҹƵվ| AVˬҹҹ| վ߹ۿ| avһ| | ŮAëƬƵ| avһ| ˾ƷƵȫ| ɾƷһ| ձһѸ| ޾ƷwwwDz| ձһ| ޸| ҹƷþþþþ˳| ҹƵѹۿ| Ƶ| ߹ۿһ| ѹaƬ| 69Ƶѹۿl| һɫaƬþëƬ| ߹ۿ|