


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、使用 Spring JMS 轻松实现异步消息传递异步进程通信是面向效劳架构 SOA 个重要的组成局部,因为企业 里 很多系统通信,特别是与外部组织间的通信,实质上都是异步的。 Java 消息效劳 JMS 是用于编写使用异步消息传递的 JEE 应用程序的 API 。传统 的使用 JMS API 进行消息传递的实现包括多个步骤,例如 JNDI 查询队列连 接工厂和 Queue 资源,在实际发送和接收消息前创立一个 JMS 会话。Spring 框架那么简化了使用 JEE 组件包括 JMS 的任务。它提供的模板 机 制隐藏了典型的 JMS 实现的细节, 这样开发人员可以集中精力放在处理 消息的实 际工
2、作中,而不用担忧如何去创立,访问或去除 JMS 资源。本文将对 Spring JMS API 作一个概述,并通过一个运行在 JBoss MQ 效劳 器上的web例程来介绍如何使用Spring JMS API来异步处理发送和 接收消 息。我将通过传统 JMS 实现和 Spring JMS 实现两者间的比较,来 展示使用 Spring JMS 处理消息是如何的简单和灵活。异步消息传递和面向效劳架构在现实中,大多数 web 请求都是同步处理的。例如,当用户要登入一 个网 站,首先输入用户名和密码,然后效劳器验证登录合法性。如果验证 成功,程序 将允许该用户进入网站。这里,登录请求在从客户端接收以后
3、被即时处理了。信 用卡验证是另一个同步处理的例子;只有效劳器证实输 入的信用卡号是有效的, 同时客户在帐户上有足够的存款,客户才被允许 继续操作。但是让我们思考一下 在顺序处理系统上的支付结算步骤。 一旦 系统证实该用户信用卡的信息是准确的, 并且在帐户上有足够的资金,就 不必等到所有的支付细节落实、转账完成。支付 结算可以异步方式进行, 这样客户可以继续进行核查操作。需要比典型同步请求消耗更长时间的请求,可以使用异步处理。另一 个异 步处理的例子是,在本地贷款处理程序中,提交至自动承销系统 AUS 的信用 请求处理过程。当借方提交贷款申请后,抵押公司会向AUS 发送请求,以获取信用历史记录。
4、由于这个请求要求得到全面而又详细的信用报 告,包 括借方现今和过去的帐户,最近的付款和其他财务资料,效劳器需 要消耗较长的 时间 几小时或着有时甚至是几天 来对这些请求作出响应。 客户端程序 应 用要与效劳器连接并消耗如此长的时间来等待结果,这是 毫无意义的。因此通 信应该是异步发生的;也就是,一旦请求被提交,它 就被放置在队列中,同时客 户端与效劳器断开连接。然后AUS 效劳从指定 的队列中选出请求进行处理, 并将处理得到的消息放置在另一个消息队列 里。最后,客户端程序从这个队列中选出处理结果,紧接着处理这个信用 历史数据。JMS如果您使用过 JMS 代码,您会发现它与 JDBC 或 JCA
5、 彳艮像。它所包含 的 样本代码创立或 JMS 资源对象回溯, 使得每一次您需要写一个新类来发 送和接收 消息时,都具有更好的代码密集性和重复性。以下序列显示了传 统 JMS 实现所包 括的步骤:创立 JNDI 初始上下文 context 。从 JNDI 上下文获取一个队列连接工厂。 从队列连接工厂中获取一个Quene 。创立一个 Session 对象。创立一个发送者 sender 或接收者 receiver 对象。使用步骤 5 创立的发送者或接收者对象发送或接收消息。 处理完消息后,关闭所有 JMS 资源。您可以看到,步骤 6 是处理消息的唯一地方。其他步骤都只是管理与 实际 业务要求无关的
6、 JMS 资源,但是开发人员必须编写并维护这些额外步 骤的代码。Spring JMS Spring框架提供了一个模板机制来隐藏 Java APIs的细节。JEE 开发人员可以使用 JDBCTemplate 和 JNDITemplate 类来分别访问 后台数据库和 JEE资源数据源,连接池。JMS也不例外。Spring提供JMSTemplate类,因 此开发人员不用为一个 JMS 实现去编写样本代码。接 下来是在开发 JMS 应用程 序时 Spring 所具有一些的优势。提供 JMS 抽象 API ,简化了访问目标 队列或主题和向指定目标发布 消息 时 JMS 的使用。JEE开发人员不需要关心J
7、MS不同版本例如与JMS 1.1之间 的差异。开发人员不必专门处理 JMS 异常,因为 Spring 为所有 JMS 异常提供 了一 个未经检查的异常,并在 JMS 代码中重新抛出。一旦您在JMS应用程序中开始使用Spring,您将会欣赏到它在处理 异步消 息传递上的简便。Spring JMS框架提供多种Java类,可以轻松实 现JMS应用。 表1列出了这些类的一局部。表 1.Spring JMS 类类名包功能 JmsException org.springframework.jms 只要发生一个 JMS 异 常, Spring 框架就会抛出异常,这个类是这些所抛出的异常的基抽象类。JmsTe
8、mplate,JmsTemplate102 org.springframework.jms.core这 些是辅助类,用于简化 JMS 的使用,处理 JMS 资源( 如连接工厂,目标和发 送 者 /接收者对象 ) 的创立和释放。 JmsTemplate102 是 JmsTemplate 的子 类,使用 JMS1.0.2 标准 MessageCreator org.springframework.jms.core 这是 JmsTemplate 类使用的回叫接口,它为指定的会话创立 JMS 消息。 MessageConverter org.springframework.jms.support.co
9、nverter 这个接 口充当一个抽象,用来在 Java 对象与 JMS 消息之间进行转换。 DestinationResolver org.springframework.jms.support.destination 这是 JmsTemplate 用来解析目标名的接口。该接口的默认实现是 DynamicDestinationResolver 和 JndiDestinationResolve 在接下来的局部,我将详细解释表 1 所列的一局部类 (例如JmsTemplate , DestinationResolver 和 MessageConverter) 。JMSTemplate JmsTe
10、mplate 提供了几种辅助方法, 用来执行一些根本 操作。 要开始使用JmsTemplate前,您需要知道JMS供应商支持哪个JMS标准,JBoss AS 4.0.2 和 WebLogic 8.1 效劳器支持 JMS 1.0.2 标准。 WebLogic Server 9.0 包 括了对JMS 1.1标准的支持。JMS 1.1统一了点对 点(PTP)和发布/订阅(Pub/Sub) 域的编程接口。这种改变的结果就是,开发 人员可以创立一个事务会话,然后在 这同一个JMS 会话里,可以从一个Queue(PTP 中接收消息,同时发送另一个消息到一个 Topic(Pub/Sub) 。JMS 1.1向
11、后兼容JMS 1.0,应此根据JMS 1 .0编写的代码仍可以适用于 JMS 1.1JmsTemplate 提供多种发送和接收消息的方法。表 2 列出了这些方法的一局部。表 2.JMS template 方法方法名称功能send发送消息至默认或指定的目标。JmsTemplate包含send 方法,它通过 javax.jms.Destination 或 JNDI 查询来指定目标。 receive 从默认 或指定的目标接收消息,但只会在指定的时间后传递消 息。我们可以通过 receiveTimeout 属性指定超时时间。 convertAndSend 这个方法委托 MessageConverter
12、 接口实例处理转换过程,然后发送消息至 指定的目标。 receiveAndConvert 从默认或指定的目标接收消息。并将消 息转换为 Java 对象。目标可以通过 JNDI 上下文保存和获取。当配置 Spring 程序上下文 (application context) 时,我们可以用 JndiObjectFactoryBean 类取得对 JMS 的 引用。 DestinationResolver 接口是用来把目标名称解析成 JMS 目 标,当应用程 序存在大量目标时,这是非常有用的。DynamicDestinationResolver (DestinationResolver 的默认实现 )
13、是用来 解析 动态目标的。MessageConverter 接口定义了将 Java 对象转换为 JM? 肖息的约定。 通过 这个转换器,应用程序代码可以集中于处理事务对象,而不用为对象 如何表示为 JMS 消息这样的内部细节所困饶。 SimpleMessageConverter 和 SimpleMessageConverter102 是 MessageConverter 的默认实现。可使用它 们 分别将 String 转换为 JMS TextMessage, 字节数组 byte 转换为 JMS BytesMessage , Map 转换为 JMS Map Message 和 Serializa
14、ble 对象转换为 JMS ObjectMessage 。您也可以编写自定义的 MessageConverter 实例,通 过 XMLS 定框架例如 JAXB Castor , Commo ns Digester , XMLBea ns 或 XStream , 来实现 XML 文档至 U TextMessage 对象的转换。例如程序我将用一个贷款申请处理系统 命名为 LoanProc 例如来演示如何在 JMS 应用程序中使用 Spring 。作为贷款申请的一局部, LoanProc 通过发送 贷款详情贷款ID,借方名字,借方的SSN贷款期限和贷款数额,从AUS系统获得信 用历史详情。为了简便起
15、见,我们基于两个根本参数来表 示信用历史详情:信用 分数又名 FICO 得分和贷款数额。让我们假设处理 信用检查请求是按以下业 务规那么进行的:如果贷款数额等于或低于 ,000 ,借方必须至少有一个 好的信用也 就是, 借方的 FICO 得分在 680 到 699 之间。如果贷款数额高于 ,000,借方必须至少有 很好的信用,意味着借方 的信 用得分要高于 700。贷款申请使用案例 信用请求处理使用案例包括以下几个步骤: 用户在贷款 申请页面输入贷款详情并提交贷款申请。 发送请求至一个名为 CreditRequestSendQueue 的肖息队列。然后程 序发送贷款详情到 AUS 系统, 获取
16、信用历史详情。AUS 系统从队列中挑出贷款详情,并使用贷款参数从它的数据库中获 取信 用历史信息。然后 AUS 将找到的借方的信用历史信息创立一个新的消息,发送到一 个新 的名为 CreditRequestReceiveQueue 的肖息队列。最后, LoanProc 从接收队列中选出响应消息,处理贷款申请来决定 是否 批准或否决申请。在这个例程中,两个消息队列都配置在同一个 JBoss MQ server 上。 使用 案例用图 1 的序列图 SequenceDiagram 表示图 1. 贷款处理程序的序列图下面的表 3 显示了在例程中我所使用的不同技术和开源框架,并按应 用逻 辑层排列。表
17、3. 在 JMS 应用程序中使用的框架逻辑层技术 / 框架 MVC Spring MVC Service Spring Frameworkversion 2.1JMS API Spring JMS JMS Provider JBoss MQJMS Console Hermes IDE Eclipse 3.1使用 Hermes 设置 JMS 资源为了异步处理消息,首先我们需要消息队列发送和接收消息。我们可 以用 Jboss 里的配置 XML 文件创立一个新的消息队列,然后使用 JMSS 制 台浏览队 列的详细情况。清单1显示了配置JMS的XML配置代码片断这个 应该参加到 jbossmq-des
18、tinations-service.xml 文件,位 于 %JBOSS_HOME%serverlldeploy-hasingletonjm 文件夹下。 清单 I.JBoss MQ Server 上 JMS 队列的配置!-Credit Request Send Queue-mbean code=org.jboss.mq.server.jmx.Queuename=jboss.mq.destination : service=Queue,name=CreditRequestSendQueuedepends optional-attribute-name=DestinationManagerjboss
19、.mq :service=DestinationManager/depends/mbean! -Credit Request Receive Queue-mbean code=org.jboss.mq.server.jmx.Queuename=jboss.mq.destination : service=Queue,name=CreditRequestReceiveQueuedepends optional-attribute-name=DestinationManagerjboss.mq :service=DestinationManager/depends/mbean现在,让我们看看如何使
20、用一个名为 Hermes 的 JMS 工具来浏览消息 队列。 Hermes 是一个 Java Swing 应用程序,它可以创立、管理和监视 JMS 提供商 例 如 JBossMQ , WebSphereM , QActiveMQ 禾口 Arjuna 效劳器里的 JMS 目标。 从它的网站上下载 Hermes 解压缩 .zip 文件到本地目录 例 女口, c: dev oolshermes 。一旦安装完成,双击文件 hermes.bat 位于 bin 文件夹下 启 动程序。要在 Hermes 里配置 JBossMC 服艮务器,请参考 Hermes 网站上的这个演 示 它有着出色的 step-by
21、-step 可视化指示来配置 JBoss MQ 当配置一 个新的 JNDI 初始上下文时,请输入下面的信息。providerURL=jnp : /localhost : 1099 initialContextFactory=erfaces.NamingContextFactory urlPkgPrefixes=erfaces : org.jboss.naming securityCredentials=admin securityPrincipal=admin当您创立新的目标时,请输入 queue/CreditRequestSendQueue 和 q
22、ueue/CreditRequestReceiveQueue 。图 2 显示了 JMS 控制台的主窗口,其 中 有为 JMS 例程创立的新的消息队列。图 2.Hermes 中所有目标的截图下面的图 3 显示了在从消息发送者类发送消息到 CreditRequestSendQueue 后, Hermes JMS 控制台及消息队列的截图。您可 以 看见有5个消息在队列中,控制台显示了消息详情,例如消息ID,消息 目标,时间戳和实际的消息内容。图 3.Hermes 中所有队列的截图在例程中使用的队列名称和其他JMS和JNDI参数见表4。表 4.Spring JMS 配置参数 参数名称参数值 Initi
23、al Context Factory erfaces.NamingContextFactory Provider URL localhost:8080 Initial Context Factory URL Packages erfaces:org.jboss.naming Queue Connection Factory UIL2ConnectionFactory Queue Name queue/CreditRequestSendQueue,queue/CreditRequestReceiveQueue Spring 配置既然我们已经有了运行例程
24、所需要的 JMS 目标,现在该了解用 XML Spring 配置文件 (名为 spring-jms.xml) 来组配 JMS 组件的具体细节了。 这 些组件 是根据In version of Con troller(IOC)设计模式里的设置方式注入 原那么(setter injection principle),用 JMS 对象实例类组配的。让我们详细查看这些组件,并为每一个 JMS 组件演示一段 XML 配置代码。JNDI 上下文是取得 JMS 资源的起始位置,因此首先我们要配置 JNDI 模板。 清单 2 显示了名为 jndiTemplate 的 Spring bean ,其中列有 JND
25、I 初始上下文所 必需的常用参数。清单 2.JNDI 上下文模板bean id=jndiTemplateclass=org.springframework.jndi.JndiTemplateproperty name=environmentprops prop key=java.naming.factory.initial erfaces.NamingContextFactory /prop prop key=vider.url localhost /prop prop key=java.naming.factory.url.pkgs org
26、.erfaces : org.jboss.naming /prop/props /property/bean 接着,我们配置队列连接工厂。清单 3 显示了队列连接工厂的配置 清单 3.JMS 队列连接工厂配置bean id=jmsQueueConnectionFactory class=org.springframework.jndi.JndiObjectFactoryBean property name=jndiTemplateref bean=jndiTemplate/property property name=jndiName value UIL2ConnectionFa
27、ctory/value/property/bean我们定义2个JMS目标来发送和接收消息。详情见清单4和5。清单 4. 发送队列配置bean id=sendDestination class=org.springframework.jndi.JndiObjectFactoryBean property name=jndiTemplate ref bean=jndiTemplate/property property name=jndiName value queue/CreditRequestSendQueue/value /property /beanbean id=receiveDesti
28、nation class=org.springframework.jndi.JndiObjectFactoryBean property name=jndiTemplateref bean=jndiTemplate/property property name=jndiNamevalue queue/CreditReqeustReceiveQueue/value/property/bean然后我们再来配置 JmsTemplate 组件。在例程中我们使用JmsTemplate102 。同时使用 defaultDestination 属性来指定 JMS 目标。 清单 6.JMS 模板配置 bean
29、 id=jmsTemplate class=org.springframework.jms.core.JmsTemplate102 property name=connectionFactory ref bean=jmsQueueConnectionFactory/ /property property name=defaultDestinationref bean=destination/property property name=receiveTimeoutvalue 30000/value/property/bean最后我们配置发送者和接收者组件。清单7和8分别是 Sender 和Re
30、ceiver 对象的配置。清单 7.JMS Sender 配置bean id=jmsSenderclass=springexample.client.JMSSender property name=jmsTemplateref bean=jmsTemplate/property/bean清单 8.JMS Receiver 配置bean id=jmsReceiverclass=springexample.client.JMSReceiverproperty name=jmsTemplateref bean=jmsTemplate/property/bean测试及监视我写了一个测试类,命名为 Lo
31、anApplicationControllerTest ,用来 测试LoanProc 程序。我们可以使用这个类来设定贷款参数以及调用信用请 求效劳类。让我们看一下不使用 Spring JMS API 而使用传统 JMS 开发途径的消 息发 送者实例。清单 9 显示了 MessageSenderJMS 类里的 sendMessage 方 法,其 中包含了使用 JMS API 处理消息的所有必需步骤。清单 9?传统 JMS 实例public void sendMessage()queueName=queue/CreditRequestSendQueue ;System.out.println(Qu
32、eue name is+queueName) ; /*Create JNDI Initial Context*/tryHashtable env=new Hashtable() ; env.put(java.naming.factory.initial,erfaces.NamingContextFactory) ; env.put(vider.url,localhost) ; env.put(java.naming.factory.url.pkgs,erfaces : org.jboss.naming) ;jndiCon
33、text=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=(Qu
34、eue)jndiContext.lookup(queueName) ; catch(NamingExcepti on e)System.out.println(JNDI API lookup failed : + e.toString() ;/*Create connection,session,sender objects.*Send the message. *Cleanup JMS connection.*/tryqueueConnection= queueConnectionFactory.createQueueConnection();queueSession=queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLED ;GE) queueSender=queueSession.createSender(queue) ; message=queueSession.createTextMessage() ;message.setText(This is asample JMS message.) ; S
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 肝移植术后免疫抑制方案
- 中国硼硅玻璃项目商业计划书
- 2025年中国食品甜味剂项目创业计划书
- 中国烟气脱硫项目创业计划书
- 2025年全球化的粮食安全问题与解决方案
- 2025年全球化的金融风险控制
- 2025年全球海洋酸化的生态影响
- 会计初级考试题型及答案
- 2025年中国透皮贴剂项目创业投资方案
- 中国丝绸专用洗涤剂项目投资计划书
- T/CCIAS 009-2023减盐酱油
- 《管理沟通实务(第四版)》课件第一章 沟通与管理沟通
- GA 36-2014中华人民共和国机动车号牌
- 人教七年级历史上第一单元 史前时期:中国境内人类的活动测试题word版含答案
- 2023年乐山新沐港航投资运营有限公司招聘笔试题库及答案解析
- 监理事故案例分析课件
- 我国大型基建工程材料供应的特点
- 【实验报告】教科版小学科学六年级下册实验报告
- 3.1.1 函数的概念(第二课时)课件-高一上学期数学人教A版(2019)必修第一册
- EPC项目投标文件承包人建议书及承包人实施计划
- 二类医疗器械经营管理制度
评论
0/150
提交评论