JCA 容器
JCA 容器正在迁移
我们将继续支持 ActiveMQ Classic JCA 容器,直到 ActiveMQ Classic 3.1。
之后,我们将迁移到 Jencks,它是 ActiveMQ Classic 代码库的迁移,以及来自 Geronimo 和其他贡献者的代码。
Jencks 在逻辑上完全等同于 ActiveMQ Classic JCA 容器,迁移到它非常简单(主要是 JCA 容器的类名更改),但 Jencks 的优点是它支持完整的 XA 恢复,并且与 Geronimo 的 TransactionManager 和 WorkManager 配合良好。
因此,我们建议您在方便的时候迁移到 Jencks;Lingo 和 ServiceMix 等项目已经迁移,并且迁移过程很简单。
我们有一个轻量级、易于嵌入的基于 Spring 的 JCA 容器,它允许我们在任何 Java 应用程序中提供类似 MDB 的功能,而无需完整的 EJB 容器。
这使我们能够使用依赖注入来支持 *消息驱动的 POJO*,以实现高效的 JMS 消费,同时使用轻量级容器池化 POJO,而不是依赖 EJB。
JCA 容器还使我们能够在运行时以编程方式创建新的消息驱动的 POJO,而不是依赖于 EJB 的固定部署时选项。
示例
这是一个 示例,演示了在入站 JMS 订阅(在本例中为主题)上部署 POJO(EchoBean)的 Spring XML。
首先,我们可以创建任意数量的 JCAContainer 实例;目前,我们为每个 JCA 资源适配器(即 JMS 提供程序)创建一个。JCAContainer 还使用 WorkManager,它是 JCA 对一组线程池的称呼。我们可以在 JCAContainer 实例之间共享 WorkManager,或者为每个 JCAContainer 创建一个。
一旦我们拥有 JCAContainer,我们就可以通过 addConnector 工厂方法向其中添加任意数量的 JCAConnector 实例,每个实例代表一个 JMS 订阅,并提供一组 POJO 来处理消息。订阅详细信息由 activationSpec 属性指定,该属性通常是一个 bean,它依赖于 JMS 提供程序;这允许提供程序添加新的扩展,同时保持您的应用程序代码为纯 JMS。
请注意,常规的 Spring 池化机制(targetSource 属性)用于池化实际的 POJO,并且 Spring 使用依赖注入来构造 POJO 的实例。
注意 如果 POJO 不是线程安全的,您必须将 singleton 标志设置为 false。
要求
要使用 JCA 容器,您只需要在类路径中包含以下 jar 包
- 如果您使用 ActiveMQ Classic 作为您的 JMS 提供程序,则需要 所需的 ActiveMQ Classic jar 包,或者如果您使用其他提供程序,则需要您的提供程序的 jar 包
- activemq-container.jar
- spring.jar
- J2EE.jar(用于 JCA API)。如果您在 Tomcat 内部,它不喜欢类路径中的 j2ee.jar,因此请使用来自 Geronimo 的单独 jar 包,例如 geronimo-spec-j2ee-connector-*.jar(用于 JCA API)
- commons-collections.jar
- commons-pool.jar
- aopalliance.jar(Spring 使用 TargetSource 引入的一个临时依赖关系,我们应该能够在以后删除此依赖关系)。
**注意** activemq-container.jar 中的类和资源未包含在 activemq.jar 中
要使用 JCA 容器,请使用 2.x 代码版本。在 1.x 分支的代码中发现并修复了几个问题。
需要注意的事项
默认情况下,ActiveMQ Classic 资源适配器 会尝试连接到远程代理(即 tcp://127.0.0.1:61616)。此外,如果您想通过 XML 设置代理的配置方式,请尝试使用 *brokerXmlConfig* 属性。
注意:在 AMQ 3.x 中,默认行为是 ActiveMQ Classic 资源适配器会创建一个嵌入式代理