JMS(Java 消息服务)
Spring 提供了一个 JMS 集成框架,以类似于 Spring 对 JDBC API 的集成方式简化了 JMS API 的使用。
JMS 大致可以分为两个功能区域,即消息的生产和消费。JmsTemplate
类用于消息生产和同步消息接收。对于类似于 Jakarta EE 的消息驱动 bean 风格的异步接收,Spring 提供了许多消息监听器容器,你可以用来创建消息驱动 POJO(MDP)。Spring 还提供了一种声明式的方法来创建消息监听器。
org.springframework.jms.core
包提供了使用 JMS 的核心功能。它包含了 JMS 模板类,通过处理资源的创建和释放来简化 JMS 的使用,就像 JdbcTemplate
对 JDBC 所做的那样。Spring 模板类的设计原则是提供辅助方法来执行常见操作,并且对于更复杂的用法,将处理任务的核心部分委托给用户实现的回调接口。JMS 模板遵循相同的设计。这些类提供了各种便捷方法用于发送消息、同步消费消息,并向用户公开 JMS 会话和消息生产者。
org.springframework.jms.support
包提供 JMSException
翻译功能。该翻译将已检查的 JMSException
层次结构转换为未检查异常的镜像层次结构。如果存在任何特定于提供者的已检查 jakarta.jms.JMSException
的子类,则此异常会被包装在未检查的 UncategorizedJmsException
中。
org.springframework.jms.support.converter
包提供了一个 MessageConverter
抽象,用于在 Java 对象和 JMS 消息之间进行转换。
org.springframework.jms.support.destination
包提供了多种策略来管理 JMS 目标,例如为存储在 JNDI 中的目标提供服务定位器。
org.springframework.jms.annotation
包提供了必要的基础设施,通过使用 @JmsListener
来支持注解驱动的监听器端点。
org.springframework.jms.config
包提供了 jms
命名空间的解析器实现,以及用于配置监听器容器和创建监听器端点的 Java 配置支持。
最后,org.springframework.jms.connection
包提供了适用于独立应用程序的 ConnectionFactory
实现。它还包含了 Spring 的 JMS PlatformTransactionManager
的实现(巧妙命名为 JmsTransactionManager
)。这允许将 JMS 作为事务性资源无缝集成到 Spring 的事务管理机制中。
从 Spring Framework 5 开始,Spring 的 JMS 包完全支持 JMS 2.0,并且在运行时需要 JMS 2.0 API。我们建议使用与 JMS 2.0 兼容的提供者。
如果您在系统中使用的是较旧的消息代理,可以尝试为现有代理版本升级到与 JMS 2.0 兼容的驱动程序。或者,您也可以尝试使用基于 JMS 1.1 的驱动程序,只需将 JMS 2.0 API jar 放在类路径上,但仅使用与您的驱动程序兼容的 JMS 1.1 API。Spring 的 JMS 支持默认遵循 JMS 1.1 约定,因此通过相应的配置,它确实支持这种场景。然而,请仅将此视为过渡场景。
章节摘要
📄️ 使用 Spring JMS
本节介绍如何使用 Spring 的 JMS 组件。
📄️ 发送消息
JmsTemplate 包含许多便捷方法来发送消息。发送方法通过使用 jakarta.jms.Destination 对象来指定目标,其他方法则通过在 JNDI 查找中使用字符串来指定目标。不带目标参数的发送方法使用默认目标。
📄️ 接收消息
这篇文章描述了如何在 Spring 中使用 JMS 接收消息。
📄️ 支持 JCA 消息端点
从 2.5 版本开始,Spring 还提供对基于 JCA 的 MessageListener 容器的支持。JmsMessageEndpointManager 尝试从提供者的 ResourceAdapter 类名中自动确定 ActivationSpec 类名。因此,通常可以提供 Spring 的通用 JmsActivationSpecConfig,如以下示例所示:
📄️ 基于注解的监听器端点
接收异步消息的最简单方法是使用带注释的监听器端点基础设施。简而言之,它允许您将托管 bean 的方法公开为 JMS 监听器端点。以下示例展示了如何使用它:
📄️ JMS 命名空间支持
Spring 提供了一个 XML 命名空间来简化 JMS 配置。要使用 JMS 命名空间元素,您需要引用 JMS 模式,如以下示例所示: