本文将对JMS API作一个概述,并通过一个运行在Weblogic服务器上的web例程来介绍如何使用JMS API来异步处理(发送和接收)消息。<o:p></o:p>
异步消息传递和面向服务架构<o:p></o:p>
在现实中,大多数web请求都是同步处理的。例如,当用户要登入一个网站,首先输入用户名和密码,然后服务器验证登录合法性。如果验证成功,程序将允许该用户进入网站。这里,登录请求在从客户端接收以后被即时处理了。但是有些情况下不得不采用异步调用的方式,这个时候向消息队列发送一个消息,其中的请求是异步执行的,客户端可以立即就返回。<o:p></o:p>
JMS<o:p></o:p>
如果您使用过JMS代码,您会发现它与JDBC或JCA很像。它所包含的样本代码创建或JMS资源对象回溯,使得每一次您需要写一个新类来发送和接收消息时,都具有更好的代码密集性和重复性。以下序列显示了传统JMS实现所包括的步骤:<o:p></o:p>
1. 创建JNDI初始上下文(context)。 <o:p></o:p>
2. 从JNDI上下文获取一个队列连接工厂。 <o:p></o:p>
3. 从队列连接工厂中获取一个Quene。 <o:p></o:p>
4. 创建一个Session对象。 <o:p></o:p>
5. 创建一个发送者(sender)或接收者(receiver)对象。 <o:p></o:p>
6. 使用步骤5创建的发送者或接收者对象发送或接收消息。 <o:p></o:p>
7. 处理完消息后,关闭所有JMS资源。 <o:p></o:p>
您可以看到,步骤6是处理消息的唯一地方。其他步骤都只是管理与实际业务要求无关的JMS资源,但是开发人员必须编写并维护这些额外步骤的代码。 <o:p></o:p>
Spring JMS<o:p></o:p>
Spring框架提供了一个模板机制来隐藏Java APIs的细节。J2EE开发人员可以使用JDBCTemplate和JNDITemplate类来分别访问后台数据库和JEE资源(数据源,连接池)。JMS也不例外。Spring提供JMSTemplate类,因此开发人员不用为一个JMS实现去编写样本代码。接下来是在开发JMS应用程序时Spring所具有一些的优势。<o:p></o:p>
1. 提供JMS抽象API,简化了访问目标(队列或主题)和向指定目标发布消息时JMS的使用。 <o:p></o:p>
2. JEE开发人员不需要关心JMS不同版本(例如JMS <st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.0.2</st1:chsdate>与JMS 1.1)之间的差异。 <o:p></o:p>
3. 开发人员不必专门处理JMS异常,因为Spring为所有JMS异常提供了一个未经检查的异常,并在JMS代码中重新抛出。 <o:p></o:p>
一旦您在JMS应用程序中开始使用Spring,您将会欣赏到它在处理异步消息传递上的简便。Spring JMS框架提供多种Java类,可以轻松实现JMS应用。 表面上看Spring获胜,代码少了很多。但是Spirng JMS的配置文件同样是很复杂。要配置jndiTemplate,jndiTemplate,sendDestination,receiveDestination,jmsTemplate等,这里就不列举了。<o:p></o:p>