﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-毛里求斯的化石博物馆-文章分类-jms</title><link>http://www.blogjava.net/dudubird/category/20464.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 08 Mar 2007 19:57:02 GMT</lastBuildDate><pubDate>Thu, 08 Mar 2007 19:57:02 GMT</pubDate><ttl>60</ttl><item><title>Spring JMS 消息处理 1-2-3（转）</title><link>http://www.blogjava.net/dudubird/articles/102663.html</link><dc:creator>毛里求斯的化石</dc:creator><author>毛里求斯的化石</author><pubDate>Thu, 08 Mar 2007 11:08:00 GMT</pubDate><guid>http://www.blogjava.net/dudubird/articles/102663.html</guid><wfw:comment>http://www.blogjava.net/dudubird/comments/102663.html</wfw:comment><comments>http://www.blogjava.net/dudubird/articles/102663.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dudubird/comments/commentRss/102663.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dudubird/services/trackbacks/102663.html</trackback:ping><description><![CDATA[
		<blockquote>快速了解使用 Spring JMS 框架和 IBM WebSphere MQ 5.3 进行 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 href="http://www.ibm.com/developerworks/cn/views/java/articles.jsp?view_by=search&amp;search_by=Spring+%E7%B3%BB%E5%88%97" target="_new"><font color="#5c81a7">Spring 系列</font></a></i> 的第 4 期也是最后一期中，我将介绍 Spring JMS（Java 消息服务）框架的特性。JMS PG 定义了 Java 应用程序通过面向消息的中间件（MOM）创建和交换消息的标准途径。</p>
		<p>就像在这个系列前面的文章中一样，我将使用一个简单的示例来演示 Spring JMS 的特性。您将随我一道开发一个点对点的（P2P）基于消息的系统，使用 Spring JMS 框架通过 JMS 接口与 IBM 的 WebSphere MQ 集成。完成练习后，将可以通过这个系统发送和接收简单的文本消息。</p>
		<p>在开始之前，请 <a href="http://www.ibm.com/developerworks/cn/java/wa-spring4/#download"><font color="#996699">下载文章的源代码</font></a>。请参阅 <a href="http://www.ibm.com/developerworks/cn/java/wa-spring4/#resources"><font color="#996699">参考资料</font></a> 访问 Spring 框架和 IBM WebSphere MQ 5.3。还需要 Apache Ant 来运行示例应用程序。</p>
		<p>
				<a name="N1007A">
						<span class="atitle">Spring JMS</span>
				</a>
		</p>
		<p>Spring 的 JMS 抽象框架简化了 JMS API 的使用，并与 JMS 提供者（比如 IBM 的 WebSphere MQ 5.3）平滑地集成。<i>org.springframework.jms.core</i> 包提供了在 Spring 中使用 JMS 的核心功能。它的模板类处理资源的创建和释放，简化了 JMS 的使用。</p>
		<p>像其他大多数 Spring 模板类一样，JMS 模板类提供了执行公共操作的 helper 方法。在需要更复杂应用的情况下，类把处理任务的核心委托给用户实现的回调接口。JMS 类提供了方便的方法，用来发送消息、同步地使用消息以及向用户公开 JMS 会话和消息的制作者。</p>
		<p>以下 JMS 包和 <i>org.springframework.jms.core</i> 一起构成了 Spring JMS 的功能：</p>
		<dl>
				<dt>
						<b>org.springframework.jms.support</b>
				</dt>
				<dd>提供转换 <code>JMSException</code> 的功能。转换代码把检测到的 <code>JMSException</code> 层次结构转换成未检测到异常的镜像层次结构。 
</dd>
				<dt>
						<b>org.springframework.jms.support.converter</b>
				</dt>
				<dd>提供 <code>MessageConverter</code> 抽象，以在 Java 对象和 JMS 消息之间进行转换。 
</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 还包含针对 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" href="http://www.ibm.com/developerworks/cn/java/wa-spring4/#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100BF">
						<span class="atitle">IBM WebSphere MQ</span>
				</a>
		</p>
		<p>就像前面提到的，示例应用程序会用 Spring 的 JMS 框架通过 JMS 接口与 IBM 的 WebSphere MQ 集成。通过在应用程序和 Web 服务之间传递消息，WebSphere MQ 提供了可靠的、有恢复能力的应用程序集成。它使用队列和事务性工具帮助保持消息跨网络的完整性。WebSphere MQ 降低了信息丢失的风险和调和通信 IT 系统的需要。</p>
		<p>WebSphere MQ 在它所支持的所有平台上提供了一致的应用程序编程接口，这有助于让集成的程序可移植。除了标准接口外，WebSphere MQ 还完整实现了JMS 接口，包括对发布-订阅消息传递的支持。WebSphere MQ Explorer 工具可以远程地管理和配置整个 MQ 网络。管理和配置工具基于开放源码的 Eclipse 框架，而且是可扩展的。</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" href="http://www.ibm.com/developerworks/cn/java/wa-spring4/#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100CC">
						<span class="atitle">Spring JMS 模板</span>
				</a>
		</p>
		<p>Spring 框架提供了 <code>JmsTemplate</code> 的两个实现。<code>JmsTemplate</code> 类使用 JMS 1.1 API，子类 <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 更复杂的应用，回调 <code>SessionCallback</code> 向用户提供了 JMS 会话，而 <code>callback ProducerCallback</code> 则公开了 <code>Session</code> 和 <code>MessageProducer</code> 组合。 </p>
		<p>清单 1 显示了示例应用程序使用的 JMS 模板的配置。清单摘自 <i>spring-mqseries-jms.xml</i> 文件（请参阅 <a href="http://www.ibm.com/developerworks/cn/java/wa-spring4/#download"><font color="#996699">下载</font></a>）。 </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">				
  &lt;!-- JMS Queue Template --&gt;
  &lt;bean id="jmsQueueTemplate" 
          class="org.springframework.jms.core.JmsTemplate102"&gt;
    &lt;property name="connectionFactory"&gt;
      &lt;ref bean="jmsQueueConnectionFactory"/&gt;
    &lt;/property&gt;
    &lt;property name="destinationResolver"&gt;
      &lt;ref bean="jmsDestinationResolver"/&gt;
    &lt;/property&gt;
    &lt;property name="pubSubDomain"&gt;
      &lt;value&gt;false&lt;/value&gt;
    &lt;/property&gt;
    &lt;property name="receiveTimeout"&gt;
      &lt;value&gt;20000&lt;/value&gt;
    &lt;/property&gt;
  &lt;/bean&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<code>jmsQueueTemplate</code> bean 与 JMS 连接工厂和 JMS 目标解析器绑定在一起，用于解析 JMS 客户机通过 JNDI 提供的目标队列名。<code>connectionFactory</code> 属性指定了如何获得到 JMS 提供者的连接。在本例中，清单 2 显示了如何从 JNDI 检索连接工厂。</p>
		<br />
		<br />
		<a name="N10127">
				<b>清单 2. 通过 JNDI 配置 JMS 连接工厂</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">				
 &lt;!-- JMS Queue Connection Factory --&gt;
  &lt;bean id="internalJmsQueueConnectionFactory"
          class="org.springframework.jndi.JndiObjectFactoryBean"&gt;
    &lt;property name="jndiTemplate"&gt;
      &lt;ref bean="jndiTemplate"/&gt;
    &lt;/property&gt;
    &lt;property name="jndiName"&gt;
      &lt;value&gt;MQ_JMS_MANAGER&lt;/value&gt;
    &lt;/property&gt;
  &lt;/bean&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>可以看到，<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">				
&lt;bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate"&gt;
    &lt;property name="environment"&gt;
      &lt;props&gt;
        &lt;prop key="java.naming.factory.initial"&gt;
            com.sun.jndi.fscontext.RefFSContextFactory
        &lt;/prop&gt;
        &lt;prop key="java.naming.provider.url"&gt;
            file:/C:/JNDI-Directory
        &lt;/prop&gt;
      &lt;/props&gt;
    &lt;/property&gt;
  &lt;/bean&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>以上配置进行 JNDI 查询时用 <code>com.sun.jndi.fscontext.RefFSContextFactory</code> 指定初始上下文工厂，用基于文件的 <i>file:/C:/JNDI-Directory</i> 作为提供者 URL。根据示例应用程序的意图，JNDI 访问会采用基于文件的 <code>FSContext</code> 版本（请参阅 <a href="http://www.ibm.com/developerworks/cn/java/wa-spring4/#resources"><font color="#996699">参考资料</font></a>）的配置把 MQ 队列绑定到 JNDI。</p>
		<p>有了定义好的 JMS 模板，下一步就是把它绑定到示例应用程序中，然后就可以用它发送和接收消息了。</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" href="http://www.ibm.com/developerworks/cn/java/wa-spring4/#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10169">
						<span class="atitle">Spring JMS 实现</span>
				</a>
		</p>
		<p>JMS 模板可以绑定到应用程序中，以发送和接收 JMS 消息。在清单 4 中可以看出我如何把 <a href="http://www.ibm.com/developerworks/cn/java/wa-spring4/#code1"><font color="#996699">清单 1</font></a> 中的 JMS 模板绑定到示例应用程序中。</p>
		<br />
		<br />
		<a name="N1017B">
				<b>清单 4. 把 JmsTemplate 绑定到应用程序中</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">				
  &lt;bean id="jmsSender" 
          class="springexample.client.JMSSender"&gt;
    &lt;property name="jmsTemplate102"&gt;
      &lt;ref bean="jmsQueueTemplate"/&gt;
    &lt;/property&gt;
    &lt;/bean&gt;
    &lt;bean id="jmsReceiver" 
          class="springexample.client.JMSReceiver"&gt;
    &lt;property name="jmsTemplate102"&gt;
        &lt;ref bean="jmsQueueTemplate"/&gt;
      &lt;/property&gt;
    &lt;/bean&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>可以看到，我把 <code>jmsQueueTemplate</code> 绑定到用来发送和接收消息的 <code>JmsSender</code> 应用程序 bean 和 <code>JmsReceiver</code> bean。清单 5 显示了与 <code>JMSSender</code> 类有关的代码。</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> 类用 <code>jmsTemplate102.send()</code> 方法发送 JMS 消息。<code>send()</code> 方法的第一个参数是 JNDI 队列名，队列名指定了消息应当发送到哪里。（很快就会看到如何把 WebSphere MQ 的队列名绑定到 JNDI。）<code>send()</code> 方法的第二个参数是 <code>MessageCreator</code> 类。<code>JmsTemplate</code> 中的调用代码提供了 <code>Session</code> 类，这个类提供了一个创建 JMS 消息的回调接口。</p>
		<p>下一步是用 JMS 的 <code>Session</code> 类创建一个简单的文本消息。在代码执行时，消息会传递给 WebSphere MQ 服务器的队列。清单 6 显示了使用 <code>JmsTemplate</code> 检索 JMS 消息的 <code>JMSReceiver</code> 应用程序 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 --&gt;" + 
                    textMessage.getText());
        }
      }catch(Exception e){
            e.printStackTrace();
      }
    }
}
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<code>JMSReceiver</code> 类用 <code>jmsTemplate102.receive()</code> 方法同步地接收 JMS 消息。<code>receive()</code> 方法指定 JNDI 队列名，并从中检索消息。<code>JMSTemplate</code> 类的 <code>processMessage()</code> 方法由接收 JMS 客户机调用。<code>JSMTemplate</code> bean 的属性 <i>receiveTimeout</i>（列在 <code>JMSTemplate</code> 配置中）指定接收客户机同步地从队列中接收消息时要等候的时间。</p>
		<p>现在应用程序的代码已完成！下一步就是配置 WebSphere MQ 队列并把它们绑定到 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" href="http://www.ibm.com/developerworks/cn/java/wa-spring4/#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N101FC">
						<span class="atitle">队列管理器的设置</span>
				</a>
		</p>
		<p>在运行应用程序之前，需要设置 WebSphere MQ 的队列管理器和队列，并把它们绑定到 JNDI。如果喜欢的话，可以按照这部分的示例做：只需 <a href="http://www.ibm.com/developerworks/cn/java/wa-spring4/#download"><font color="#996699">下载</font></a> 设置 WebSphere MQ 队列的批文件和应用程序的源代码和部署描述符即可。把 zip 文件解压到驱动器 C:。</p>
		<p>
				<b>设置队列</b>
				<br />运行 <i>C:\SpringSeriesPart4JMS\batch</i> 文件夹中的 <i>mqsetup.bat</i> 文件。这个批文件要求在 path 环境变量中设置好 MQ 安装的 bin 文件夹（例如 <i>C:\mqseries\bin</i>）。运行了批文件之后，应当看到消息 “<code>All valid MQSC commands were processed</code>”。要打开 MQ Explorer 并检查已经创建的队列管理器和队列，请选择 <b>Start -&gt; Programs -&gt; IBM MQSeries -&gt; MQSeriesExplorer</b>。图 1 显示出示例应用程序 <code>QueueManager</code><code>MQJMS.QManager</code> 已经创建并正在运行。</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>请在应用程序屏幕左侧面板上点击 <code>MQJMS.QManager</code> 下的 <b>Queues</b> 文件夹。应当看到已经创建了一个队列 <code>RequestResponseQueue</code>，如图 2 所示。</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>这就完成了队列的设置。</p>
		<p>
				<b>设置 JMS 和 JNDI 管理</b>
				<br />
				<br />在示例应用程序中，JNDI 的访问利用了可以从 JNDI 主页得到的基于文件的 <code>FSContext</code> 版本（请参阅 <a href=""><font color="#5c81a7">参考资料</font></a>）。<i>FSContext.jar</i> 文件也包含在 WebSphere MQ 的 JMS 支持当中。请添加文件夹 <i>\MQSeriesInstallable\MQSeries\Java\lib</i> 和 <i>\MQSeriesInstallable\MQSeries\Java\bin</i> 到系统的 PATH 环境变量中。而且，请把 <i>\MQSeriesInstallable\MQSeries\Java\lib</i> 文件夹中的所有 jar 文件添加到系统的 CLASSPATH 环境变量中。还可以运行 <i>C:\SpringSeriesPart4JMS\batch</i> 文件夹中的 <i>classpath.cmd</i> 文件，它会设置必要的 path 和 CLASSPATH 变量。要做到这点，只需要修改 <i>classpath.cmd</i> 文件中的 <code>MQ_JAVA_INSTALL_PATH</code>，把它指到 WebSphere MQ JMS 的安装目录。</p>
		<p>接下来，修改 <i>\MQSeriesInstallableDirectory\Java\bin</i> 中的 <i>JMSAdmin.config</i> 配置文件，MQSeries JMS 管理程序用它指明应用程序要使用的上下文工厂和 JNDI 实现的地址。请取消以下行的注释：</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>并注释掉其余两个 <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>并注释掉其余两个 <code>PROVIDER_URL</code> 变量。</p>
		<p>可以在 <i>C:\SpringSeriesPart4JMS\batch</i> 文件夹中发现参考的示例配置文件。</p>
		<p>为了保存 JNDI 对象，请在驱动器 C: 上创建名为 <i>JNDI-Directory</i> 的目录。切换到 <i>\MQSeriesInstallableDirectory\Java\bin</i> 目录并运行 <i>JMSAdmin</i> 批文件，应当看到 <i>InitCtx</i> 变量。</p>
		<p>逐个输入以下内容：</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 队列绑定到 JNDI 对象，作为应用程序客户可以通过 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" href="http://www.ibm.com/developerworks/cn/java/wa-spring4/#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N102CE">
						<span class="atitle">运行示例</span>
				</a>
		</p>
		<p>要运行示例，请从 <a href="http://prdownloads.sourceforge.net/springframework/spring-framework-1.2-rc2-with-dependencies.zip?download" target="_new"><font color="#5c81a7">spring sourceforge download</font></a> 下载 Spring 框架和它的所有依赖文件并解压，例如解压到 c:\。会创建文件夹 <i>C:\spring-framework-1.2-rc2</i>（或最新版本）。</p>
		<p>要运行 Spring 应用程序，请把本文的源代码解压到任意文件夹，例如 <i>c:\</i>。会创建文件夹 <i>SpringSeriesPart4JMS</i>。就像前面提到过的，还需要安装 Apache Ant 和它的 Spring 依赖 jar 文件。请把 Spring 库 —— 即 <i>spring.jar</i>（在 <i>C:\spring-framework-1.2-rc2\dist</i> 中）和 <i>commons-logging.jar</i>（在 <i>C:\spring-framework-1.2-rc2\lib\jakarta-commons</i> 中）拷贝到 <i>SpringSeriesPart4JMS\lib</i> 文件夹。还要把所有的 jar 库从 <i>\MQSeriesInstallableDirectory\Java\lib</i> 目录拷贝到 <i>SpringSeriesPart4JMS\lib</i> 文件夹。其中包含 MQseries 和 JMS 的相关库。现在就拥有了构建的依赖集。</p>
		<p>接下来，打开命令提示符，切换到 <i>SpringProject4</i> 目录，并在命令提示符下输入以下命令：</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">&gt; ant -f build-jmssender.xml.
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这会构建并运行 <code>SendMQSpringJMS</code> 类，它会调用 <code>JMSSender</code> 类，发送消息到 WebSphere MQ <code>RequestResponse</code> 队列。<code>SendMQSpringJMS</code> 还会通过它的 <code>ClassPathXmlApplicationContext</code> 装入 spring 配置文件。一旦 bean 全部装载，就可以通过 Spring 的 ApplicationContext 的 <code>getBean()</code> 方法访问 JMSSender（请参阅清单 7）。</p>
		<br />
		<br />
		<a name="N10326">
				<b>清单 7. 装入示例应用程序的 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 接收方客户机以检索消息。请打开命令提示符，切换到目录 <i>SpringProject4</i>，并输入：</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">&gt; ant -f build-jmsreceiver.xml
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这会构建并运行 <code>ReceiveMQSpringJMS</code> 类，该类会调用 <code>JMSReceiver</code> 类，以从 WebSphere MQ 的 <code>RequestResponse</code> 队列接收文本消息。在控制台上会打印出以下消息：</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">Message Received --&gt; This is a sample message.
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="N1034A">
						<span class="smalltitle">
								<strong>
										<font face="Arial">结束语</font>
								</strong>
						</span>
				</a>
		</p>
		<p>在 Spring 系列的最后这篇文章中，您学习了 Spring JMS 框架的基础。我首先介绍了示例应用程序的核心组件 —— Spring JMS 框架和 IBM 的 WebSphere MQ 5.3，然后介绍了如何用 Spring JMS 模板向 WebSphere MQ 队列发送消息和从中接收消息。虽然这个示例非常简单，但是可以把这里介绍的步骤应用到更复杂的应用程序。</p>
		<p>我希望介绍 Spring 框架核心模块的这一系列对您有所帮助。请参阅 <a href="http://www.ibm.com/developerworks/cn/java/wa-spring4/#resources"><font color="#996699">参考资料</font></a> 学习更多有关 Spring 框架和 Spring JMS 的内容。</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" href="http://www.ibm.com/developerworks/cn/java/wa-spring4/#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<span 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" href="http://www.ibm.com/developerworks/cn/whichmethod.html">
												<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" href="http://www.adobe.com/products/acrobat/readstep2.html">
												<font color="#5c81a7">Get Adobe® Reader®</font>
										</a>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<b>学习</b>
		<br />
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的 <a href="http://www.ibm.com/developerworks/web/library/wa-spring4/?S_TACT=105AGX52&amp;S_CMP=cn-a-j" target="_blank"><font color="#5c81a7">英文原文</font></a>。<br /><br /></li>
				<li>“<a href="http://www.ibm.com/developerworks/cn/opensource/os-lightweight3/"><font color="#5c81a7">轻量级开发的成功秘诀，第 3 部分: Spring 露出水面</font></a>”（Bruce Tate，developerWorks，2005 年 6 月）：Bruce Tate 介绍了 Spring 作为轻量级容器的意义。<br /><br /></li>
				<li>“<a href="http://www.ibm.com/developerworks/ibm/library/i-ad5mq53/?S_TACT=105AGX52&amp;S_CMP=cn-a-j"><font color="#5c81a7">Writing Java Message Service programs using WebSphere MQ V5.3</font></a>”（Willy Farrell，developerWorks，2003 年 10 月）：安装和配置 WebSphere MQ 5.3 以进行 JMS 开发和测试的详细指导。<br /><br /></li>
				<li>“<a href="http://www.ibm.com/developerworks/cn/webservices/ws-jms/"><font color="#5c81a7">用 AXIS 编写 JMS 应用程序</font></a>”（Naveen Balani，developerWorks，2003 年 2 月）：开发同步 JMS SOAP 应用程序。<br /><br /></li>
				<li>
						<a href="http://www.ibm.com/developerworks/web/?S_TACT=105AGX52&amp;S_CMP=cn-a-j">
								<font color="#5c81a7">Web 架构专区</font>
						</a>：数百篇涉及基于 Web 的解决方案的文章。</li>
		</ul>
		<br />
		<b>获得产品和技术</b>
		<br />
		<ul>
				<li>
						<a href="http://prdownloads.sourceforge.net/springframework/">
								<font color="#5c81a7">Spring 主页</font>
						</a>：下载 Spring 框架。<br /><br /></li>
				<li>
						<a href="http://java.sun.com/products/jms/index.jsp">
								<font color="#5c81a7">JMS 主页</font>
						</a>：下载 Java 消息服务。<br /><br /></li>
				<li>
						<a href="http://java.sun.com/products/jndi/index.html">
								<font color="#5c81a7">JNDI 主页</font>
						</a>：下载 JNDI 和 FSContext。<br /><br /></li>
				<li>
						<a href="http://www.ibm.com/software/integration/wmq/">
								<font color="#5c81a7">WebSphere MQ</font>
						</a>：得到可信的、可靠的 JMS 提供者。<br /><br /></li>
		</ul>
		<br />
		<b>讨论</b>
		<br />
		<ul>
				<li>
						<a href="http://www.ibm.com/developerworks/community/">
								<font color="#5c81a7">参与论坛讨论</font>
						</a>。<br /><br /></li>
				<li>
						<a href="http://www.ibm.com/developerworks/blogs/?S_TACT=105AGX52&amp;S_CMP=cn-a-j">
								<font color="#5c81a7">developerWorks blogs</font>
						</a>：加入 developerWorks 社区。<br /></li>
		</ul>
<img src ="http://www.blogjava.net/dudubird/aggbug/102663.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dudubird/" target="_blank">毛里求斯的化石</a> 2007-03-08 19:08 <a href="http://www.blogjava.net/dudubird/articles/102663.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Spring JMS轻松实现异步消息传递（转）</title><link>http://www.blogjava.net/dudubird/articles/102650.html</link><dc:creator>毛里求斯的化石</dc:creator><author>毛里求斯的化石</author><pubDate>Thu, 08 Mar 2007 10:07:00 GMT</pubDate><guid>http://www.blogjava.net/dudubird/articles/102650.html</guid><wfw:comment>http://www.blogjava.net/dudubird/comments/102650.html</wfw:comment><comments>http://www.blogjava.net/dudubird/articles/102650.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dudubird/comments/commentRss/102650.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dudubird/services/trackbacks/102650.html</trackback:ping><description><![CDATA[异步进程通信是面向服务架构(SOA)一个重要的组成部分，因为企业里很多系统通信，特别是与外部组织间的通信，实质上都是异步的。<a href="http://java.sun.com/products/jms/" target="_blank">Java消息服务</a>(JMS)是用于编写使用异步消息传递的JEE应用程序的API。传统的使用JMS API进行消息传递的实现包括多个步骤，例如JNDI查询队列连接工厂和Queue资源，在实际发送和接收消息前创建一个JMS会话。
<p>　　 <a href="http://www.springframework.org/" target="_blank">Spring框架</a>则简化了使用JEE组件(包括JMS)的任务。它提供的模板机制隐藏了典型的JMS实现的细节，这样开发人员可以集中精力放在处理消息的实际工作中，而不用担心如何去创建，访问或清除JMS资源。</p><p>　　 本文将对Spring JMS API作一个概述，并通过一个运行在JBoss MQ服务器上的web例程来介绍如何使用Spring JMS API来异步处理（发送和接收）消息。我将通过传统JMS实现和Spring JMS实现两者间的比较，来展示使用Spring JMS处理消息是如何的简单和灵活。</p><h3>异步消息传递和面向服务架构</h3><p>　　在现实中，大多数web请求都是同步处理的。例如，当用户要登入一个网站，首先输入用户名和密码，然后服务器验证登录合法性。如果验证成功，程序将允许该用户进入网站。这里，登录请求在从客户端接收以后被即时处理了。信用卡验证是另一个同步处理的例子；只有服务器证实输入的信用卡号是有效的，同时客户在帐户上有足够的存款，客户才被允许继续操作。但是让我们思考一下在顺序处理系统上的支付结算步骤。一旦系统证实该用户信用卡的信息是准确的，并且在帐户上有足够的资金，就不必等到所有的支付细节落实、转账完成。支付结算可以异步方式进行，这样客户可以继续进行核查操作。</p><p>　　 需要比典型同步请求耗费更长时间的请求，可以使用异步处理。另一个异步处理的例子是，在本地贷款处理程序中，提交至自动承销系统（AUS）的信用请求处理过程。当借方提交贷款申请后，抵押公司会向AUS发送请求，以获取信用历史记录。由于这个请求要求得到全面而又详细的信用报告，包括借方现今和过去的帐户，最近的付款和其他财务资料，服务器需要耗费较长的时间（几小时或着有时甚至是几天）来对这些请求作出响应。客户端程序（应用）要与服务器连接并耗费如此长的时间来等待结果，这是毫无意义的。因此通信应该是异步发生的；也就是，一旦请求被提交，它就被放置在队列中，同时客户端与服务器断开连接。然后AUS服务从指定的队列中选出请求进行处理，并将处理得到的消息放置在另一个消息队列里。最后，客户端程序从这个队列中选出处理结果，紧接着处理这个信用历史数据。</p><h3>JMS</h3><p>　　 如果您使用过JMS代码，您会发现它与JDBC或JCA很像。它所包含的样本代码创建或JMS资源对象回溯，使得每一次您需要写一个新类来发送和接收消息时，都具有更好的代码密集性和重复性。以下序列显示了传统JMS实现所包括的步骤：</p><ol type="1"><li>创建JNDI初始上下文（context）。 
</li><li>从JNDI上下文获取一个队列连接工厂。 
</li><li>从队列连接工厂中获取一个Quene。 
</li><li>创建一个Session对象。 
</li><li>创建一个发送者（sender）或接收者（receiver）对象。 
</li><li>使用步骤5创建的发送者或接收者对象发送或接收消息。 
</li><li>处理完消息后，关闭所有JMS资源。 </li></ol>您可以看到，步骤6是处理消息的唯一地方。其他步骤都只是管理与实际业务要求无关的JMS资源，但是开发人员必须编写并维护这些额外步骤的代码。 
<p></p><h3>Spring JMS</h3><p>　　 Spring框架提供了一个模板机制来隐藏Java APIs的细节。JEE开发人员可以使用JDBCTemplate和JNDITemplate类来分别访问后台数据库和JEE资源（数据源，连接池）。JMS也不例外。Spring提供JMSTemplate类，因此开发人员不用为一个JMS实现去编写样本代码。接下来是在开发JMS应用程序时Spring所具有一些的优势。</p><ol type="1"><li>提供JMS抽象API，简化了访问目标（队列或主题）和向指定目标发布消息时JMS的使用。 
</li><li>JEE开发人员不需要关心JMS不同版本（例如JMS 1.0.2与JMS 1.1）之间的差异。 
</li><li>开发人员不必专门处理JMS异常，因为Spring为所有JMS异常提供了一个未经检查的异常，并在JMS代码中重新抛出。 </li></ol>一旦您在JMS应用程序中开始使用Spring，您将会欣赏到它在处理异步消息传递上的简便。Spring JMS框架提供多种Java类，可以轻松实现JMS应用。表1列出了这些类的一部分。 
<p></p><p>　　 表1. Spring JMS类</p><table class="tabel-general" cellspacing="0" cellpadding="0" width="100%"><tbody><tr><th class="left">类名</th><th class="center">包</th><th class="right">功能</th></tr><tr><td class="left">JmsException</td><td class="center">org.springframework.jms</td><td class="right">只要发生一个JMS异常，Spring框架就会抛出异常，这个类是这些所抛出的异常的基（抽象）类。</td></tr><tr><td class="left">JmsTemplate, JmsTemplate102</td><td class="center">org.springframework.jms.core</td><td class="right">这些是辅助类，用于简化JMS的使用，处理JMS资源（如连接工厂，目标和发送者/接收者对象）的创建和释放。JmsTemplate102是JmsTemplate的子类，使用JMS1.0.2规范</td></tr><tr><td class="left">MessageCreator</td><td class="center">org.springframework.jms.core</td><td class="right">这是JmsTemplate类使用的回叫接口，它为指定的会话创建JMS消息。</td></tr><tr><td class="left">MessageConverter</td><td class="center">org.springframework.jms.support.converter</td><td class="right">这个接口充当一个抽象，用来在Java对象与JMS消息之间进行转换。</td></tr><tr><td class="left">DestinationResolver</td><td class="center">org.springframework.jms.support.destination</td><td class="right">这是JmsTemplate用来解析目标名的接口。该接口的默认实现是DynamicDestinationResolver和JndiDestinationResolve</td></tr></tbody></table><p>　　在接下来的部分，我将详细解释表1所列的一部分类（例如JmsTemplate，DestinationResolver和MessageConverter）。</p><h3>JMSTemplate</h3><p>　　JmsTemplate提供了几种辅助方法，用来执行一些基本操作。要开始使用JmsTemplate前，您需要知道JMS供应商支持哪个JMS规范，<a href="http://www.jboss.com/products/jbossas" target="_blank">JBoss AS 4.0.2</a>和<a href="http://www.bea.com/" target="_blank">WebLogic 8.1</a>服务器支持JMS 1.0.2规范。WebLogic Server 9.0包括了对<a href="http://java.sun.com/products/jms/" target="_blank">JMS 1.1</a>规范的<a href="http://dev2dev.bea.com/pub/a/2005/09/weblogic9_jms.html" target="_blank">支持</a>。JMS 1.1统一了点对点（PTP）和发布/订阅（Pub/Sub）域的编程接口。这种改变的结果就是，开发人员可以创建一个事务会话，然后在这同一个JMS会话里，可以从一个Queue(PTP)中接收消息，同时发送另一个消息到一个Topic(Pub/Sub)。JMS 1.1向后兼容JMS 1.0，应此根据JMS 1.0编写的代码仍可以适用于JMS 1.1。</p><p>　　 JmsTemplate提供多种发送和接收消息的方法。表2列出了这些方法的一部分。</p><p>　　 表2. JMS template方法</p><table class="tabel-general" cellspacing="0" cellpadding="0" width="100%"><tbody><tr><th class="left">方法名称</th><th class="right">功能</th></tr><tr><td class="left">send</td><td class="right">发送消息至默认或指定的目标。JmsTemplate包含send方法，它通过javax.jms.Destination或JNDI查询来指定目标。</td></tr><tr><td class="left">receive</td><td class="right">从默认或指定的目标接收消息，但只会在指定的时间后传递消息。我们可以通过receiveTimeout属性指定超时时间。</td></tr><tr><td class="left">convertAndSend</td><td class="right">这个方法委托MessageConverter<a href="http://www.onjava.com/pub/a/onjava/2006/02/22/asynchronous-messaging-with-spring-jms.html?page=2#" target="_blank">接口</a>实例处理转换过程，然后发送消息至指定的目标。</td></tr><tr><td class="left">receiveAndConvert</td><td class="right">从默认或指定的目标接收消息。并将消息转换为Java对象。</td></tr></tbody></table><p>　　目标可以通过JNDI上下文保存和获取。当配置Spring程序上下文（application context）时，我们可以用JndiObjectFactoryBean类取得对JMS的引用。DestinationResolver接口是用来把目标名称解析成JMS目标，当应用程序存在大量目标时，这是非常有用的。DynamicDestinationResolver(DestinationResolver的默认实现)是用来解析动态目标的。</p><p>　　 MessageConverter接口定义了将<a href="http://www.onjava.com/pub/a/onjava/2006/02/22/asynchronous-messaging-with-spring-jms.html?page=2" target="_blank">Java对象</a>转换为JMS消息的约定。通过这个转换器，应用程序代码可以集中于处理事务对象，而不用为对象如何表示为JMS消息这样的内部细节所困饶。SimpleMessageConverter(和SimpleMessageConverter102)是MessageConverter的默认实现。可使用它们分别将String转换为JMS TextMessage，字节数组(byte[])转换为JMS BytesMessage，Map转换为JMS MapMessage，和Serializable对象转换为JMS ObjectMessage。您也可以编写自定义的MessageConverter实例，通过XML绑定框架（例如<a href="http://java.sun.com/webservices/jaxb/index.jsp" target="_blank">JAXB</a>， <a href="http://www.castor.org/" target="_blank">Castor</a>，<a href="http://jakarta.apache.org/commons/digester/" target="_blank">Commons Digester</a>，<a href="http://xmlbeans.apache.org/" target="_blank">XMLBeans</a>或<a href="http://xstream.codehaus.org/" target="_blank">XStream</a>），来实现XML文档到TextMessage对象的转换。</p><h3>示例程序</h3><p>　　我将用一个贷款申请处理系统（命名为LoanProc）示例来演示如何在JMS应用程序中使用Spring。作为贷款申请的一部分，LoanProc通过发送贷款详情（贷款ID，借方名字，借方的SSN，贷款期限和贷款数额），从AUS系统获得信用历史详情。为了简便起见，我们基于两个基本参数来表示信用历史详情：信用分数（又名FICO得分）和贷款数额。让我们假设处理信用检查请求是按以下业务规则进行的：</p><ol type="1"><li>如果贷款数额等于或低于$500,000，借方必须至少有一个"好"的信用（也就是，借方的FICO得分在680到699之间）。 
</li><li>如果贷款数额高于$500,000，借方必须至少有"很好"的信用，意味着借方的信用得分要高于700。 </li></ol><h3>贷款申请使用案例</h3><p>　　信用请求处理使用案例包括以下几个步骤：</p><ol type="1"><li>用户在贷款申请页面输入贷款详情并提交贷款申请。 
</li><li>发送请求到一个名为CreditRequestSendQueue的消息队列。然后程序发送贷款详情到AUS系统，获取信用历史详情。 
</li><li>AUS系统从队列中挑出贷款详情，并使用贷款参数从它的数据库中获取信用历史信息。 
</li><li>然后AUS将找到的借方的信用历史信息创建一个新的消息，发送到一个新的名为CreditRequestReceiveQueue的消息队列。 
</li><li>最后，LoanProc从接收队列中选出响应消息，处理贷款申请来决定是否批准或否决申请。 </li></ol><p>　　在这个例程中，两个消息队列都配置在同一个JBoss MQ server上。使用案例用图1的序列图（SequenceDiagram）表示</p><p align="center"><a href="http://www.onjava.com/onjava/2006/02/22/graphics/LoanAppSpringJMSSequenceDiagram_lg.jpg" target="_blank"><img height="169" alt="序列图" src="http://dev2dev.bea.com.cn/images/image060511001.gif" width="300" border="0" /></a><br /><br />图1.贷款处理程序的序列图 (单击截图来查看完整视图)</p><p>　　 下面的表3显示了在例程中我所使用的不同技术和<u><a href="http://www.onjava.com/pub/a/onjava/2006/02/22/asynchronous-messaging-with-spring-jms.html?page=3" target="_blank">开源</a></u>框架，并按应用逻辑层排列。</p><p>　　 表3. 在JMS应用程序中使用的框架</p><table class="tabel-general" cellspacing="0" cellpadding="0" width="100%"><tbody><tr><th class="left">逻辑层</th><th class="right">技术/框架</th></tr><tr><td class="left">MVC</td><td class="right">Spring MVC</td></tr><tr><td class="left">Service</td><td class="right">Spring Framework (version 2.1)</td></tr><tr><td class="left">JMS API</td><td class="right">Spring JMS</td></tr><tr><td class="left">JMS Provider</td><td class="right"><a href="http://www.onjava.com/pub/a/onjava/2006/02/22/asynchronous-messaging-with-spring-jms.html?page=3#" target="_blank">JBoss</a> MQ (version 4.0.2)</td></tr><tr><td class="left">JMS Console</td><td class="right">Hermes</td></tr><tr><td class="left">IDE</td><td class="right">Eclipse 3.1</td></tr></tbody></table><h3>使用Hermes设置JMS资源</h3><p>　　为了异步处理消息，首先我们需要消息队列发送和接收消息。我们可以用Jboss里的配置<a href="http://www.onjava.com/pub/a/onjava/2006/02/22/asynchronous-messaging-with-spring-jms.html?page=3#" target="_blank">XML文件</a>创建一个新的消息队列，然后使用JMS控制台浏览队列的详细情况。清单1显示了配置JMS的XML配置代码片断（这个应该加入到jbossmq-destinations-service.xml文件，位于%JBOSS_HOME%\server\all\deploy-hasingleton\jm文件夹下。）</p><p>　　 清单1.JBoss MQ Server上JMS队列的配置</p><pre class="code">&lt;!--  Credit Request Send Queue  --&gt;
&lt;mbean code="org.jboss.mq.server.jmx.Queue"
  name="jboss.mq.destination:service=Queue,name=CreditRequestSendQueue"&gt;
  &lt;depends optional-attribute-name="DestinationManager"&gt;
 jboss.mq:service=DestinationManager
  &lt;/depends&gt;
&lt;/mbean&gt;

&lt;!--  Credit Request Receive Queue  --&gt;
&lt;mbean code="org.jboss.mq.server.jmx.Queue"
  name="jboss.mq.destination:service=Queue,name=CreditRequestReceiveQueue"&gt;
  &lt;depends optional-attribute-name="DestinationManager"&gt;
 jboss.mq:service=DestinationManager
  &lt;/depends&gt;
&lt;/mbean&gt;
</pre><p>　　现在，让我们看看如何使用一个名为Hermes的JMS工具来浏览消息队列。<a href="http://www.hermesjms.com/" target="_blank">Hermes</a>是一个Java Swing应用程序，它可以创建、管理和监视JMS提供商（例如<a href="http://www.jboss.com/products/jbossas" target="_blank">JBossMQ</a>，<a href="http://www-306.ibm.com/software/integration/wmq/" target="_blank">WebSphereMQ</a>，<a href="http://www.activemq.org/" target="_blank">ActiveMQ</a>和<a href="http://www.arjuna.com/products/arjunams/" target="_blank">Arjuna</a>服务器）里的JMS目标。从它的<a href="http://sourceforge.net/projects/hermesjms" target="_blank">网站</a>上下载Hermes，解压缩.zip文件到本地目录（例如，c:\dev\tools\hermes）。一旦安装完成，双击文件hermes.bat（位于bin文件夹下）启动程序。</p><p>　　 要在Hermes里配置JBossMQ服务器，请参考Hermes网站上的这个<a href="http://www.hermesjms.com/demos/jboss_config.html" target="_blank">演示</a>。它有着出色的step-by-step可视化指示来配置JBoss MQ。当配置一个新的JNDI初始上下文时，请输入下面的信息。</p><ul type="disc"><li>providerURL = jnp://localhost:1099 
</li><li>initialContextFactory = org.jnp.interfaces.NamingContextFactory 
</li><li>urlPkgPrefixes = org.jnp.interfaces:org.jboss.naming 
</li><li>securityCredentials = admin 
</li><li>securityPrincipal = admin </li></ul><p>　　当您创建新的目标时，请输入queue/CreditRequestSendQueue和queue/CreditRequestReceiveQueue。图2显示了JMS控制台的主窗口，其中有为JMS例程创建的新的消息队列。</p><p align="center"><a href="http://www.onjava.com/onjava/2006/02/22/graphics/HermesJMSDestinations_lg.jpg" target="_blank"><img height="159" alt="Hermes中所有目标的截图" src="http://dev2dev.bea.com.cn/images/image060511003.jpg" width="312" border="0" /></a><br /><br />图 2. Hermes中所有目标的截图.（单击截图来查看完整视图）</p><p>　　 下面的图3显示了在从消息发送者类发送消息到CreditRequestSendQueue后，Hermes JMS控制台及消息队列的截图。您可以看见有5个消息在队列中，控制台显示了消息详情，例如消息ID，消息目标，时间戳和实际的消息内容。</p><p align="center"><a href="http://www.onjava.com/onjava/2006/02/22/graphics/HermesJMSQueueDetails_lg.jpg" target="_blank"><img height="159" alt="Hermes中所有队列的截图" src="http://dev2dev.bea.com.cn/images/image060511005.jpg" width="312" border="0" /></a><br /><br />图 3. Hermes中所有队列的截图.（单击截图来查看完整视图）</p><p>　　 在例程中使用的队列名称和其他JMS和JNDI参数见表 4。</p><p>　　 表4. Spring JMS配置参数</p><table class="tabel-general" cellspacing="0" cellpadding="0" width="100%"><tbody><tr><th class="left">参数名称</th><th class="right">参数值</th></tr><tr><td class="left">Initial Context Factory</td><td class="right">org.jnp.interfaces.NamingContextFactory</td></tr><tr><td class="left">Provider URL</td><td class="right">localhost:8080</td></tr><tr><td class="left">Initial Context Factory URL Packages</td><td class="right">org.jnp.interfaces:org.jboss.naming</td></tr><tr><td class="left">Queue Connection Factory</td><td class="right">UIL2ConnectionFactory</td></tr><tr><td class="left">Queue Name</td><td class="right">queue/CreditRequestSendQueue, queue/CreditRequestReceiveQueue</td></tr></tbody></table><h3>Spring配置</h3><p>　　既然我们已经有了运行例程所需要的JMS目标，现在该了解用<a href="http://www.onjava.com/pub/a/onjava/2006/02/22/asynchronous-messaging-with-spring-jms.html?page=4#" target="_blank">XML</a> Spring配置文件（名为spring-jms.xml）来组配JMS组件的具体细节了。这些组件是根据Inversion of Controller (IOC)<a href="http://www.onjava.com/pub/a/onjava/2006/02/22/asynchronous-messaging-with-spring-jms.html?page=4#" target="_blank">设计模式</a>里的设置方式注入原则（setter injection principle），用JMS对象实例类组配的。让我们详细查看这些组件，并为每一个JMS组件演示一段XML配置代码。</p><p>　　 JNDI上下文是取得JMS资源的起始位置，因此首先我们要配置JNDI模板。清单2显示了名为jndiTemplate的Spring bean，其中列有JNDI初始上下文所必需的常用参数。</p><p>　　 清单2. JNDI上下文模板</p><pre class="code">&lt;bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate"&gt;
    &lt;property name="environment"&gt;
        &lt;props&gt;
            &lt;prop key="java.naming.factory.initial"&gt;
                org.jnp.interfaces.NamingContextFactory
            &lt;/prop&gt;
            &lt;prop key="java.naming.provider.url"&gt;
                localhost
            &lt;/prop&gt;
            &lt;prop key="java.naming.factory.url.pkgs"&gt;
                org.jnp.interfaces:org.jboss.naming
            &lt;/prop&gt;
        &lt;/props&gt;
    &lt;/property&gt;
&lt;/bean&gt;
</pre><p>　　接着，我们配置队列连接工厂。清单3显示了队列连接工厂的配置。</p><p>　　 清单3. JMS队列连接工厂配置</p><pre class="code">&lt;bean id="jmsQueueConnectionFactory"
      class="org.springframework.jndi.JndiObjectFactoryBean"&gt;
    &lt;property name="jndiTemplate"&gt;
        &lt;ref bean="jndiTemplate"/&gt;
    &lt;/property&gt;
    &lt;property name="jndiName"&gt;
        &lt;value&gt;UIL2ConnectionFactory&lt;/value&gt;
    &lt;/property&gt;
&lt;/bean&gt;
</pre><p>　　我们定义2个JMS目标来发送和接收消息。详情见清单4和5。</p><p>　　 清单4. 发送队列配置</p><pre class="code">&lt;bean id="sendDestination"
    class="org.springframework.jndi.JndiObjectFactoryBean"&gt;
    &lt;property name="jndiTemplate"&gt;
        &lt;ref bean="jndiTemplate"/&gt;
    &lt;/property&gt;
    &lt;property name="jndiName"&gt;
        &lt;value&gt;queue/CreditRequestSendQueue&lt;/value&gt;
    &lt;/property&gt;
&lt;/bean&gt;
</pre><p>　　清单5. 接收队列配置</p><pre class="code">&lt;bean id="receiveDestination"
    class="org.springframework.jndi.JndiObjectFactoryBean"&gt;
    &lt;property name="jndiTemplate"&gt;
        &lt;ref bean="jndiTemplate"/&gt;
    &lt;/property&gt;
    &lt;property name="jndiName"&gt;
        &lt;value&gt;queue/CreditReqeustReceiveQueue&lt;/value&gt;
    &lt;/property&gt;
&lt;/bean&gt;
</pre><p>　　然后我们再来配置JmsTemplate组件。在例程中我们使用JmsTemplate102。同时使用defaultDestination属性来指定JMS目标。</p><p>　　 清单6. JMS模板配置</p><pre class="code">&lt;bean id="jmsTemplate" 
      class="org.springframework.jms.core.JmsTemplate102"&gt;
    &lt;property name="connectionFactory"&gt;
        &lt;ref bean="jmsQueueConnectionFactory"/&gt;
    &lt;/property&gt;
    &lt;property name="defaultDestination"&gt;
        &lt;ref bean="destination"/&gt;
    &lt;/property&gt;
    &lt;property name="receiveTimeout"&gt;
        &lt;value&gt;30000&lt;/value&gt;
    &lt;/property&gt;
&lt;/bean&gt;
</pre><p>　　最后我们配置发送者和接收者组件。清单7和8分别是Sender 和 Receiver对象的配置。</p><p>　　 清单7. JMS Sender配置</p><pre class="code">&lt;bean id="jmsSender" class="springexample.client.JMSSender"&gt;
    &lt;property name="jmsTemplate"&gt;
        &lt;ref bean="jmsTemplate"/&gt;
    &lt;/property&gt;
&lt;/bean&gt;
</pre><p>　　清单8. JMS Receiver配置</p><pre class="code">&lt;bean id="jmsReceiver" class="springexample.client.JMSReceiver"&gt;
    &lt;property name="jmsTemplate"&gt;
        &lt;ref bean="jmsTemplate"/&gt;
    &lt;/property&gt;
&lt;/bean&gt;
</pre><h3>测试及监视</h3><p>　　我写了一个测试类，命名为LoanApplicationControllerTest，用来测试LoanProc程序。我们可以使用这个类来设定贷款参数以及调用信用请求服务类。</p><p>　　 让我们看一下不使用Spring JMS API而使用传统JMS开发途径的消息发送者实例。清单9显示了MessageSenderJMS类里的sendMessage方法，其中包含了使用JMS API处理消息的所有必需步骤。</p><p>　　 清单9. 传统JMS实例</p><pre class="code">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) {}
        }
    }
}
</pre><p>　　现在，我们来看看使用了Spring的消息发送者实例。清单10显示了MessageSenderSpringJMS类中send方法的代码。</p><p>　　 清单10. 使用Spring API的JMS实例</p><pre class="code">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();
    }
}
</pre><p>　　如您所见，通过使用配置文件，所有与管理JMS资源有关的步骤都将交由Spring容器处理。我们只需引用一个JMSSender对象，然后调用对象里的sendMessage方法。</p><h3>结束语</h3><p>　　在本文中，我们看到Spring框架是如何使用JMS API简化异步消息传递。Spring去掉了所有使用JMS处理消息所必需的样本代码（例如得到一个队列连接工厂，从Java代码里创建队列和会话对象，在运行时使用配置文件对它们进行组配）。我们可以动态的交换JMS资源对象，而不必修改任何Java代码，这要感谢Inversion of Control (IOC) 原则的力量。</p><p>　　既然异步消息传递是SOA框架的整体构成部分，Spring很适合纳入到SOA工具集。此外，JMS管理工具（如Hermes）使得创建、管理和监督JMS资源变得容易，特别是对于系统管理员来说。</p><img src ="http://www.blogjava.net/dudubird/aggbug/102650.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dudubird/" target="_blank">毛里求斯的化石</a> 2007-03-08 18:07 <a href="http://www.blogjava.net/dudubird/articles/102650.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用JMS建立消息传递系统（转）</title><link>http://www.blogjava.net/dudubird/articles/102647.html</link><dc:creator>毛里求斯的化石</dc:creator><author>毛里求斯的化石</author><pubDate>Thu, 08 Mar 2007 09:53:00 GMT</pubDate><guid>http://www.blogjava.net/dudubird/articles/102647.html</guid><wfw:comment>http://www.blogjava.net/dudubird/comments/102647.html</wfw:comment><comments>http://www.blogjava.net/dudubird/articles/102647.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dudubird/comments/commentRss/102647.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dudubird/services/trackbacks/102647.html</trackback:ping><description><![CDATA[JMS（Java消息服务）是一个消息交换标准，它允许使用J2EE应用程序组件建立、发送、接收和读取消息。它假设分布式通讯拥有自由（free）的连接、是可靠的（reliable）和异步的（asynchronous）。 <br /><br />　　<strong>Exchange（交换）系统</strong><br /><br />　　消息交换反映了程序组件或应用程序之间的一种交互作用。消息交换系统是一种类似于下的系统：一个相似系统的客户端可以发送和接收任何其它客户端的消息。每个客户端都并入系统的代理中，它提供了建立、发送、接收和读取消息的可能。<br /><br />　　交换系统使得分布式的交互操作成为可能。组件在目的地（Destination）发送消息，收件人也可以在相同的目的地中得到这个消息。发送者和收件人不一定是互相熟悉的。换句话说，它并没有强迫发送者知道一些收件人的信息，也没有强迫收件人知道某些发送者的信息。发送者和收件人只需要知道消息的格式以及要到达的目的地。在这种情形下，上述的系统不同于与它紧密相连的一些技术，例如远程方法调用（RMI），它只要求开发人员了解RMI中的一些方法。<br /><br />　　<strong>消息传递系统</strong><br /><br />　　消息传递系统是一种分布式的系统，是基于系统组件之间的异步消息交换。面向消息的中间件（Message-Oriented Middleware，MOM）就是这种产品，消息传递系统是在它的原理上建立的。<br /><br />　　消息传递系统应用软件不会直接地通讯（这与传统的系统（基于RMI的）形成鲜明的对照），而需要依赖MOM的帮助。如果系统的某个组件希望给另一个组件发送消息，它将把给定的消息发送给MOM，接着MOM把该消息发送给收件人。<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img onerror="this.src=http://www.yesky.com/image20010518/153192.jpg;" hspace="3" src="http://dev.yesky.com/image20010518/153192.jpg" align="center" vspace="1" border="1" /></div></td></tr></tbody></table><br />　　与传统的基于RMI构建的系统相比，它有以下优点：<br /><br />　　· 发送消息的应用程序不需要期待回应，可以继续执行。<br /><br />　　· 没有强迫发送消息的应用程序和特定消息的收件人在某个特定的时刻是激活的。如果消息的收件人不是激活的，MOM保证收件人一旦激活就立即收到该消息。<br /><br />　　· 系统组件没有直接地彼此相连。它们被分离开了，这就是在运行时刻能把组件从一个主机传输到另一个、却不会中断系统可用性的原因。<br /><br />　　消息交换模型：点对点模型和发表－预订模型<br /><br />　　目前有两种“基本的”消息交换模型：点对点模型和发表－预订（pub-sub）模型。点对点模型应用于一个或多个组件（发送者）仅仅给一个组件收件人（接收者）发送消息的情形。这种模型是基于消息队列概念的：发送者把消息发送到队列中，接收者从该队列中读取消息。在点对点模型中，相同的队列上可能存在多个接收者，但是MOM只给其中一个传递消息。给哪一个传递消息依赖于MOM的实现（implementation）。<br /><br />　　发表－预订模型应用于一个或多个组件（发表者）给一个或多个组件收件人（预订者）发送消息的情形。这种特定的模型是基于消息主题（message topic）概念的：发表者把消息发送到某个主题中，而该特定主题的预订者接收这些消息。<br /><br />　　发表－预订模型看起来更加“优雅”，但是很多发表－预订模型不能保证消息按照发送的次序传递（它与点对点模型相反，点对点队列实现了FIFO（先进先出）原理）。因此，消息的次序很重要（或者为了同步需要使用消息的头和属性部分）的时候，就应该避免采用发表－预订模型。<br /><br />　　Java消息服务（JMS）是使用面向消息中间件的一套Java API，它允许你的应用程序建立、发送、接收和读取消息。这组程序集位于J2EE程序包结构树上的javax.jms程序包中。JMS在很多MOM产品中得到了实现，其中iPlanet Message Queue、 IBM MQSeries、Progress Software SonicMQ、BEA WebLogic Server、Prism Technologies OpenFusion等最有名气，也存在一些免费的实现。<br /><br />　　JMS同时支持消息交换的两种“基本的”模型。但是，其说明（specification）并没有要求厂商同时实现两种模型，尽管大多数JMS产品实现了点对点和发表－预订模型。<br /><br />　　<strong>JMS应用程序</strong><br /><br />　　JMS应用程序的主要部分是：<br /><br />　　· 产生连接的部分和目的地<br /><br />　　· 连接<br /><br />　　· 对话<br /><br />　　· 产生消息的部分<br /><br />　　· 使用消息的部分<br /><br />　　· 消息<br /><br />　　产生连接的部分（ConnectionFactory）是负责建立JMS连接的对象。每个ConnectionFactory都是QueueConnectionFactory或TopicConnectionFactory的一个副本（copy）。MOM管理器建立特定的对象，并把它与JNDI树关联起来，这样JMS客户端就能够使用标准的JNDI查找表得到ConnectionFactory的入口。在点对点的模型中，它使用了javax.jms.QueueConnectionFactory；在发表－预订模型中，它使用的是javax.jms.TopicConnectionFactory。<br /><br />　　目的地（Destination）——它是队列或主题，这依赖于我们使用了下面哪种模型：javax.jms.Queue或javax.jms.Topic。<br /><br />　　连接（Connection）——它可能是客户端和服务应用之间的开放的TCP/IP。它可以被用于建立一个或少量的对话。在你的应用程序能够接收消息前，你必须调用start()方法。为了暂停发送消息，你需要调用stop()。<br /><br />　　对话（Session）——在JMS连接的帮助下建立的对象，被客户端用作发送和接收消息。<br /><br />　　产生消息的部分（MessageProducer）——对话建立的对象，被用于在目的地中发送消息。<br /><br />　　使用消息的部分（MessageConsumer）——对话建立的对象，用于接收消息。为了同步接收消息，需要使用receive()方法。对于异步的情形，使用MessageListener和唯一的方法——onMessage()。在该方法中，在定义的消息到达后应该执行一定的操作。<br /><br />　　消息（Message）——消息本身。JMS消息由三个部分组成：<br /><br />　　· 消息头<br /><br />　　· 属性（不是必要的）<br /><br />　　· 消息体（不是必要的）<br /><br />　　本文没有解释更多的细节信息，你可以在官方文档中找到具体的细节。<img src ="http://www.blogjava.net/dudubird/aggbug/102647.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dudubird/" target="_blank">毛里求斯的化石</a> 2007-03-08 17:53 <a href="http://www.blogjava.net/dudubird/articles/102647.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>