Spring 消息驱动与远程调用:异步通信的实用指南
在软件开发中,异步消息传递相较于同步 RPC 具有显著优势。它能实现应用间的间接通信,降低系统间的耦合度,减少单个系统故障的影响,还能避免发送方等待响应,提升应用性能。虽然 JMS 为 Java 应用的异步通信提供了标准 API,但使用起来较为繁琐。Spring 则消除了 JMS 的样板代码和异常处理代码,让异步消息传递更易于使用。本文将详细介绍 Spring 中消息驱动 POJO 的创建、消息监听器的配置,以及基于消息的远程过程调用(RPC)的两种实现方式。
1. 创建消息驱动 POJO
在大学的一个夏天,作者在黄石国家公园的老忠实客栈做客房服务工作。每天下班后,作者会去当地邮局查看是否有邮件。邮局里的老员工行动缓慢,查询邮件的过程十分耗时。这就像 JmsTemplate 的 receive() 方法,调用时会去队列或主题中查找消息,直到消息到达或超时才返回,期间应用只能等待。
EJB 2 规范引入了消息驱动 bean(MDB),它能异步处理消息,与同步消息接收器不同,MDB 会将 JMS 目的地中的消息作为事件进行响应。不过,EJB 2 的 MDB 必须实现 javax.ejb.MessageDrivenBean 接口,还需实现一些 EJB 生命周期回调方法,不太符合 POJO 的特性。
到了 EJB 3 规范,MDB 变得更像 POJO 了,不再需要实现 MessageDrivenBean 接口,而是实现更通用的 javax.jms.MessageListener 接口,并使用 @MessageDriven 注解。
Spring 2.0 提供了类似 EJB 3 MDB 的消息驱动