




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、使用Spring JMS轻松实现异步消息传递异步进程通信是面向服务架构(SOA) 一个重要的组成部分,因为企业里很 多系统通信,特别是与外部组织间的通信,实质上都是异步的。Java消息服务(JMS)是用于编写使用异步消息传递的 JEE应用程序的API。传统的使用JMS API进行消息传递的实现包括多个步骤,例如 JNDI查询队列连接工厂和Queue 资源,在实际发送和接收消息前创建一个 JMS会话。Spring框架则简化了使用JEE组件(包括JMS)的任务。它提供的模板机 制隐藏了典型的JM迎现的细节,这样开发人员可以集中精力放在处理消息的 实际工作中,而不用担心如何去创建,访问或清除 JM砥
2、源。本文将对Spring JMS API作一个概述,并通过一个运行在 JBoss MQ服 务器上的web例程来介绍如何使用Spring JMS API来异步处理(发送和接收) 消息。我将通过传统JM敛现和Spring JMS实现两者间的比较,来展示使用 Spring JMS处理消息是如何的简单和灵活。异步消息传递和面向服务架构在现实中,大多数web请求都是同步处理的。例如,当用户要登入一个 网站,首先输入用户名和密码,然后服务器验证登录合法性。如果验证成功, 程序将允许该用户进入网站。这里,登录请求在从客户端接收以后被即时处理 了。信用卡验证是另一个同步处理的例子;只有服务器证实输入的信用卡号
3、是 有效的,同时客户在帐户上有足够的存款,客户才被允许继续操作。但是让我 们思考一下在顺序处理系统上的支付结算步骤。一旦系统证实该用户信用卡的 信息是准确的,并且在帐户上有足够的资金,就不必等到所有的支付细节落实、 转账完成。支付结算可以异步方式进行,这样客户可以继续进行核查操作。需要比典型同步请求耗费更长时间的请求,可以使用异步处理。另一个 异步处理的例子是,在本地贷款处理程序中,提交至自动承销系统(AUS)的信用请求处理过程。当借方提交贷款申请后,抵押公司会向AUS®送请求,以获取信用历史记录。由于这个请求要求得到全面而又详细的信用报告,包括借方 现今和过去的帐户,最近的付款和其
4、他财务资料,服务器需要耗费较长的时间 (几小时或着有时甚至是几天)来对这些请求作出响应。客户端程序(应用)要与 服务器连接并耗费如此长的时间来等待结果,这是毫无意义的。因此通信应该 是异步发生的;也就是,一旦请求被提交,它就被放置在队列中,同时客户端与服务器断开连接。然后 AUS服务从指定的队列中选出请求进行处理,并将处 理得到的消息放置在另一个消息队列里。最后,客户端程序从这个队列中选出 处理结果,紧接着处理这个信用历史数据。JMS如果您使用过JMS弋码,您会发现它与JDBCE JCA很像。它所包含的样 本代码创建或JMSS源对象回溯,使得每一次您需要写一个新类来发送和接收 消息时,都具有更
5、好的代码密集性和重复性。以下序列显示了传统JMS实现所包括的步骤:创建JNDI初始上下文(context)。从JNDI上下文获取一个队列连接工厂。从队列连接工厂中获取一个Quene创建一个Session对象。创建一个发送者(sender)或接收者(receiver) 对象。使用步骤5创建的发送者或接收者对象发送或接收消息。处理完消息后,关闭所有JM砥源。您可以看到,步骤6是处理消息的唯一地方。其他步骤都只是管理与实 际业务要求无关的JM砥源,但是开发人员必须编写并维护这些额外步骤的代 码。Spring JMS Spring 框架提供了一个模板机制来隐藏 Java APIs的细节。 JEE开发人
6、员可以使用JDBCTemplate和JNDITemplate类来分别访问后台数据 库和JEE资源(数据源,连接池)。JMS也不例外。Spring提供JMSTemplate类, 因此开发人员不用为一个JMS实现去编写样本代码。接下来是在开发 JMS应用 程序时Spring所具有一些的优势。提供JMSW象API,简化了访问目标(队列或主题)和向指定目标发布消息 时JMS的使用。JEE开发人员不需要关心JM2同版本(例如JMS 1.0.2与JMS 1.1)之间 的差异。开发人员不必专门处理JMS#常,因为Spring为所有JM附常提供了一 个未经检查的异常,并在JMS弋码中重新抛出。一旦您在JMS应
7、用程序中开始使用Spring ,您将会欣赏到它在处理异步 消息传递上的简便。Spring JMS框架提供多种Java类,可以轻松实现JMS应 用。表1列出了这些类的一部分。表1.Spring JMS 类类名包功能 JmsException org.springframework.jms只要发生一个 JMS异常,Spring框架就会抛出异常,这个类是这些所抛出的异常的基(抽象)类。JmsTemplate,JmsTemplate102 org.springframework.jms.core这些是辅助类,用于简化JMS的使用,处理JM砥源(如连接工厂,目标和发送者/接收者对象) 的创建和释放。Jm
8、sTemplate102是JmsTemplate的子类,使用 JMS1.0.2规范 MessageCreator org.springframework.jms.core 这是 JmsTemplate 类使用的 回叫接口,它为指定的会话创建 JMS?肖息MessageConverter org.springframework.jms.support.converter这个接口充当个抽象, 用来在Java对象与乂8?肖息之间进行转换。DestinationResolver org.springframework.jms.support.destination 这是 JmsTemplate 用来解
9、析 目标名的接口。该接口的默认实现是DynamicDestinationResolver 和JndiDestinationResolve在接下来的部分,我将详细解释表1所列的一部分类(例如JmsTemplate,DestinationResolver 和 MessageConverter)。JMSTemplate JmsTemplate提供了几种辅助方法,用来执行一些基本操作。 要开始使用JmsTemplate前,您需要知道JMS供应商支持哪个JMS规范, JBoss AS 4.0.2 和 WebLogic 8.1 服务器支持 JMS 1.0.2 规范。WebLogic Server 9.0
10、包括了对JMS 1.1规范的支持。JMS 1.1统一了点对点(PTP)和发 布/订阅(Pub/Sub)域的编程接口。这种改变的结果就是,开发人员可以创建一 个事务会话,然后在这同一个 JM话里,可以从一个 Queue(PTP升接收消 息,同时发送另一个消息到一个 Topic(Pub/Sub) 。JMS 1.1向后兼容JMS 1.0, 应此根据JMS 1.0编写的代码仍可以适用于 JMS 1.1。JmsTemplate提供多种发送和接收消息的方法。表 2列出了这些方法的一 部分。表 2.JMS template 方法方法名称功能send发送消息至默认或指定的目标。JmsTemplate包含 se
11、nd方法,它通过javax.jms.Destination 或JNDI查询来指定目标。 receive从默认或指定的目标接收消息,但只会在指定的时间后传递消息。我们可以通过receiveTimeout属性指定超时时间。convertAndSend这个方法委 托MessageConverter接口实例处理转换过程,然后发送消息至指定的目标。 receiveAndConvert从默认或指定的目标接收消息。并将消息转换为Java对象。目标可以通过JNDI上下文保存和获取。当配置 Spring程序上下文 (application context) 时,我们可以用 JndiObjectFactoryBe
12、an 类取得对 JMS的引用。DestinationResolver 接口是用来把目标名称解析成 JMS目标, 当应用程序存在大量目标时,这是非常有用的。 DynamicDestinationResolver(DestinationResolver 的默认实现)是用来解析 动态目标的。MessageConverter接口定义了将Java对象转换为JMS消息的约定。通过 这个转换器,应用程序代码可以集中于处理事务对象,而不用为对象如何表示 为JMS?肖息这样的内部细节所困饶。SimpleMessageConverter(和 SimpleMessageConverter102)是 MessageC
13、onverter 的默认实现。可使用它们 分别将String 转换为JMS TextMessage,字节数组(byte)转换为JMS BytesMessage, Map转换为 JMS MapMessage 和 Serializable对象转换为JMS ObjectMessage。您也可以编写自定义的 MessageConverter实例,通过 XMUW定框架(例如 JAXB Castor , Commons Digester, XMLBean或 XStream), 来实现XMLt档到TextMessage对象的转换。小例程序我将用一个贷款申请处理系统(命名为LoanProc)示例来演示如何在J
14、MS 应用程序中使用Spring。作为贷款申请的一部分,LoanProc通过发送贷款详 情(贷款ID,借方名字,借方的SSN贷款期限和贷款数额),从AUS系统获得 信用历史详情。为了简便起见,我们基于两个基本参数来表示信用历史详情: 信用分数(又名FICO得分)和贷款数额。让我们假设处理信用检查请求是按以 下业务规则进行的:如果贷款数额等于或低于,000 ,借方必须至少有一个"好”的信用(也就是, 借方的FICO得分在680到699之间)。如果贷款数额高于,000,借方必须至少有"很好”的信用,意味着借方的 信用得分要高于700。贷款申请使用案例信用请求处理使用案例包括以下
15、几个步骤:用户在贷款申请页面输入贷款详情并提交贷款申请。发送请求到一个名为CreditRequestSendQueue的消息队列。然后程序发送贷款详情到AU繇统,获取信用历史详情。AUS系统从队列中挑出贷款详情,并使用贷款参数从它的数据库中获取信 用历史信息。然后AUSa找到的借方的信用历史信息创建一个新的消息,发送到一个 新的名为CreditRequestReceiveQueue的消息队列。最后,LoanProc从接收队列中选出响应消息,处理贷款申请来决定是否 批准或否决申请。在这个例程中,两个消息队列都配置在同一个JBoss MQ server上。使用案例用图1的序列图(SequenceD
16、iagram)表示图1.贷款处理程序的序列图下面的表3显示了在例程中我所使用的不同技术和开源框架,并按应用 逻辑层排列。表3.在JMS应用程序中使用的框架逻辑层技术 / 框架 MVC Spring MVC Service Spring Framework(version2.1)JMS API Spring JMS JMS Provider JBoss MQ(version 4.0.2)JMS Console Hermes IDE Eclipse 3.1使用Hermes设置JMSS?源为了异步处理消息,首先我们需要消息队列发送和接收消息。我们可以用Jboss里的配置XML±件创建一个新
17、的消息队列,然后使用JMS控制台浏览队列的详细情况。清单1显示了配置JMS的XMLK置代码片断(这个应该加入 至U jbossmq-destinations-service.xml文件,位T%JBOSS_HOME%serverlldeploy-hasingletonjm 文件夹下。)清单I.JBoss MQ Server上JMW歹用勺配置! -Credit Request Send Queue-mbean code="org.jboss.mq.server.jmx.Queue"name="jboss.mq.destination service=Queue,nam
18、e=CreditRequestSendQueue"depends optional-attribute-name="DestinationManager"第5页jboss.mq : service=DestinationManager/depends /mbean! -Credit Request Receive Queue-mbean code="org.jboss.mq.server.jmx.Queue”name="jboss.mq.destinationservice=Queue,name=CreditRequestReceiveQueu
19、e”depends optional-attribute-name="DestinationManager"jboss.mq : service=DestinationManager/depends/mbean现在,让我们看看如何使用一个名为Hermes的JMS工具来浏览消息队列,Hermes是一个Java Swing应用程序,它可以创建、管理和监视JMSS供商(例如 JBossMQ WebSphereMQActiveMQ 和 Arjuna 服务器)里的 JMS目标。从 它的网站上下载Hermes,解压缩.zip文件到本地目录(例如,c: dev oolshermes)。一
20、旦安装完成,双击文件 hermes.bat(位于bin文件夹下)启动 程序。要在Hermes里配置JBossMCffi务器,请参考Hermes网站上的这个演示 它有着出色的step-by-step 可视化指示来配置JBoss MQ当配置一个新的 JNDI初始上下文时,请输入下面的信息。providerURL=jnp : /localhost : 1099initialContextFactory=erfaces.NamingContextFactory urlPkgPrefixes=erfaces : org.jboss.naming securit
21、yCredentials=admin securityPrincipal=admin当您创建新的目标时,请输入 queue/CreditRequestSendQueue和 queue/CreditRequestReceiveQueue 。图 2 显示了 JMS空制台的主窗口,其中 有为JMS例程创建的新的消息队列。图2.Hermes中所有目标的截图下面的图3显示了在从消息发送者类发送消息到CreditRequestSendQueue后,Hermes JMS空制台及消息队列的截图。您可以看见有5个消息在队列中,控制台显示了消息详情,例如消息ID,消息目标,时间戳和实际的消息内容。图3.Herme
22、s中所有队列的截图在例程中使用的队列名称和其他 JM*口 JNDI参数见表4。表4.Spring JMS配置参数参数名称参数值Initial Context Factory erfaces.NamingContextFactory Provider URL localhost: 8080Initial Context Factory URL Packages erfacesorg.jboss.naming Queue Connection Factory UIL2ConnectionFactory Queue Namequeue/CreditRequ
23、estSendQueue,queue/CreditRequestReceiveQueue Spring配置既然我们已经有了运行例程所需要的JMS目标,现在该了解用XMLSpring配置文件(名为spring-jms.xml) 来组配JMSS件的具体细节了。这些 组件是根据Inversion of Controller(IOC)设计模式里的设置方式注入原则(setter injection principle) ,用JMS对象实例类组配的。让我们详细查看 这些组件,并为每一个JMS&件演示一段XML配置代码。JNDI上下文是取得JM砥源的起始位置,因此首先我们要配置JNDI模板.清单2显
24、示了名为jndiTemplate 的Spring bean ,其中列有JNDI初始上下文 所必需的常用参数。清单2.JNDI上下文模板beanid="jndiTemplate"class="org.springframework.jndi.JndiTemplate”property name="environment"props prop key="java.naming.factory.initial”erfaces.NamingContextFactory/prop prop key="java.n
25、vider.url” localhost/prop prop key="java.naming.factory.url.pkgs"erfaces : org.jboss.naming/prop/props/property/bean接着,我们配置队列连接工厂。清单3显示了队列连接工厂的配置清单3.JMS队列连接工厂配置bean id="jmsQueueConnectionFactory”class="org.springframework.jndi.JndiObjectFactoryBean”property na
26、me="jndiTemplate”ref bean="jndiTemplate"/property property name="jndiName”value UIL2ConnectionFactory/value/property/bean我们定义2个JMS目标来发送和接收消息。详情见清单 4和5。清单4.发送队列配置bean id="sendDestination”class="org.springframework.jndi.JndiObjectFactoryBean”property name="jndiTempla
27、te”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&quo
28、t;/property property name="jndiName”value queue/CreditReqeustReceiveQueue/value/property/bean然后我们再来配置JmsTemplate组件。在例程中我们使用 JmsTemplate102。同时使用 defaultDestination 属性来指定 JMS目标。清单6.JMS模板配置bean id="jmsTemplate"class="org.springframework.jms.core.JmsTemplate102”property name="co
29、nnectionFactory”ref bean="jmsQueueConnectionFactory"/property property name="defaultDestination"ref bean="destination"/property property name="receiveTimeout”value 30000/value/property/bean最后我们配置发送者和接收者组件。清单 7和8分别是Sender和 Receiver对象的配置。清单7.JMS Sender配置bean id="
30、;jmsSender"class="springexample.client.JMSSender"property name="jmsTemplate"ref bean="jmsTemplate"/property/bean清单 8.JMS Receiver 配置第9页bean id="jmsReceiver"class="springexample.client.JMSReceiver”property name="jmsTemplate”ref bean="jmsTemp
31、late"/property/bean测试及监视我写了一个测试类,命名为 LoanApplicationControllerTest ,用来测试 LoanProc程序。我们可以使用这个类来设定贷款参数以及调用信用请求服务 类。让我们看一下不使用Spring JMS API而使用传统JMS开发途径的消息发 送者实例。清单9显示了 MessageSenderJMS1里的sendMessage方法,其中 包含了使用JMS API处理消息的所有必需步骤。清单9.传统JMS实例public void sendMessage()queueName="queue/CreditReques
32、tSendQueue"System.out.println("Queue name is"+queueName) ;*Create JNDI Initial ContexttryHashtable env=new Hashtable() ;env.put("java.naming.factory.initial","erfaces.NamingContextFactory") ;env.put("vider.url","localhost&qu
33、ot;);env.put("java.naming.factory.url.pkgs","erfaces : org.jboss.naming") ;jndiContext=new InitialContext(env) ;catch(NamingException e)System.out.println("Could not create JNDI API"+"context : "+e.toString() ;第10页*Get queue connection factory and q
34、ueue objects from JNDI context.tryqueueConnectionFactory=(QueueConnectionFactory)jndiContext.lookup("UIL2ConnectionFactory") ;queue=(Queue)jndiContext.lookup(queueName);catch(NamingException e)System.out.println("JNDI API lookup failed : "+ e.toString() ;*Create connection,sessio
35、n,sender objects.*Send the message.*Cleanup JMS connection.tryqueueConnection=queueConnectionFactory.createQueueConnection() ;queueSession=queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE) queueSender=queueSession.createSender(queue);message=queueSession.createTextMessage(); message.setText("This is asample JMS message.") ; System.out.println("Sending mess
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大学英语《科技报告阅读》教案(2025-2026学年)
- 上海骨科治疗器械有限公司2025年上半年行动报告
- 婚礼策划服务合同法律条款解析
- 2025年反垄断法规在电商领域的应用研究报告
- 企业绩效评价与财务风险管理融合研究可行性报告2025
- 2025年产业升级论证报告数字经济时代产业数字化转型可行性研究报告
- 合同违约索赔成功案例分析
- 技术融合风险控制-洞察及研究
- 跨学科老年护理知识整合策略-洞察及研究
- 气候变化与粮食安全的关系探讨-洞察及研究
- 高中英语完形填空高频词汇300个
- 2023-2025年世纪公园综合养护项目招标文件
- 男朋友男德守则100条
- 食品安全风险管控日管控检查清单
- 乡村振兴汇报模板
- 津16D19 天津市住宅区及住宅建筑内光纤到户通信设施标准设计图集 DBJT29-205-2016
- 医院感染科室院感管理委员会会议记录
- 高分子物理-第2章-聚合物的凝聚态结构课件
- CNAS体系基础知识培训课件
- 三字经全文带拼音打印版带翻译
- 河蟹健康养殖与常见疾病防治技术课件
评论
0/150
提交评论