返回介绍

17.2.4 使用基于消息的 RPC

发布于 2024-08-17 00:45:49 字数 2811 浏览 0 评论 0 收藏 0

在第15章中,我们展示了Spring把bean的方法暴露为远程服务以及从客户端向这些服务发起调用的几种方式。在本章,我们学习了如何通过队列和主题在应用程序之间发送消息。现在我们将了解一下如何使用JMS作为传输通道来进行远程调用。

为了支持基于消息的RPC,Spring提供了JmsInvokerServiceExporter,它可以把bean导出为基于消息的服务;为客户端提供了JmsInvokerProxyFactoryBean来使用这些服务。

让我们回顾一下第15章,Spring提供了多种方式把bean导出为远程服务。我们使用RmiServiceExporter把bean导出为RMI服务,使用HessianExporter和BurlapExporter导出为基于HTTP的Hessian和Burlap服务,还使用HttpInvoker Service Exporter创建基于HTTP的HTTP invoker服务。但Spring还提供了一种在第15章中我们未探讨的服务导出器。

导出基于JMS的服务

JmsInvokerServiceExporter很类似于其他的服务导出器。事实上,JmsInvoker-ServiceExporter与HttpInvokerServiceExporter在名称上有某种对称型。如果HttpInvokerServiceExporter可以导出基于HTTP通信的服务,那么JmsInvoker-ServiceExporter就应该可以导出基于JMS的服务。

为了演示JmsInvokerServiceExporter是如何工作的,考虑如下的AlertServiceImpl。

程序清单17.6 AlertServiceImpl是一个处理JMS消息的POJO,但是不依赖于JMS

我们现在不要过于关注sendSpittleAlert()方法的细节。在第19章,我们将会继续探讨如何使用Spring发送E-mail。现在,我们需要关注的重点在于AlertServiceImpl是一个简单的POJO,没有任何迹象标示它要用来处理JMS消息。它只是实现了简单的AlertService接口,该接口如下所示:

正如我们所看到的,AlertServiceImpl使用了@Component注解来标注,所以它会被Spring自动发现并注册为Spring应用上下文中ID为alertService的bean。在配置JmsInvokerServiceExporter时,我们将引用这个bean:

这个bean的属性描述了导出的服务应该是什么样子的。service属性设置为alertServicebean的引用,它是远程服务的实现。同时,serviceInterface属性设置为远程服务对外提供接口的全限定类名。

导出器的属性并没有描述服务如何基于JMS通信的细节。但好消息是JmsInvokerServiceExporter可以充当JMS监听器。因此,我们使用<jms:listenercontainer>元素配置它:

我们为JMS监听器容器指定了连接工厂,所以它能够知道如何连接消息代理,而<jms:listener>声明指定了远程消息的目的地。

使用基于JMS的服务

这时候,基于JMS的提醒服务已经准备好了,等待队列中名字为spitter.alert.queue的RPC消息到达。在客户端,JmsInvokerProxyFactoryBean用来访问服务。

JmsInvokerProxyFactoryBean很类似于我们在第15章中所讨论的其他远程代理工厂bean。它隐藏了访问远程服务的细节,并提供一个易用的接口,通过该接口客户端与远程服务进行交互。与代理RMI服务或HTTP服务的最大区别在于,JmsInvokerProxy-FactoryBean代理了通过JmsInvokerServiceExporter所导出的JMS服务。

为了使用提醒服务,我们可以像下面那样配置JmsInvokerProxyFactoryBean:

connectionFactory和queryName属性指定了RPC消息如何被投递——在这里,也就是在给定的连接工厂中,我们所配置的消息代理里面名为spitter.alert.queue的队列。对于serviceInterface,指定了代理应该通过AlertService接口暴露功能。

多年来,JMS一直是Java应用中主流的消息解决方案。但是对于Java和Spring开发者来说,JMS并不是唯一的消息可选方案。在过去的几年中,高级消息队列协议(Advanced Message Queuing Protocol ,AMQP)得到了广泛的关注。因此,Spring也为通过AMQP发送消息提供了支持,这就是我们下面要讲解的内容。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文