Spring 支持
我们完全支持 Spring 用于配置 JMS 客户端以及配置 JMS 消息代理。
有一篇很棒的文章介绍了如何在 ActiveMQ Classic 中使用 Spring - 我建议先阅读它。
配置 JMS 客户端
在 Spring 中配置 ActiveMQ Classic JMS 客户端很简单,只需在标准的 Spring XML 配置文件中像任何其他 bean 一样配置 ActiveMQConnectionFactory 实例即可。有几个示例和测试用例可用,这个显示了如何在 Spring 中构建 ActiveMQConnectionFactory,然后将其传递给 Spring JmsTemplate 以供一些 POJO 使用。
例如,以下 XML 片段向我们展示了如何为连接到特定主机名和端口上的远程代理的 ActiveMQ Classic 创建 JMS 连接工厂。
<bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL">
<value>tcp://127.0.0.1:61616</value>
</property>
</bean>
以下显示了如何使用 Zeroconf 发现可用的代理以连接。
<bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL">
<value>zeroconf://_activemq.broker.development.</value>
</property>
</bean>
从 ActiveMQ Classic 1.1 开始,您也可以使用 JNDI 在 Spring 中配置 ActiveMQ Classic。此示例展示了如何使用 ActiveMQ Classic 的JNDI 支持来配置 Spring。
使用 Spring
如果您使用的是 Spring 2.0 的新基于 XML 架构的配置,您可以将 ActiveMQ Classic 代理 XML 嵌入任何常规 Spring.xml 文件中,而无需上面工厂 bean。例如,以下是在 Spring 2.0 中常规 Spring XML 文件的示例,该文件还配置了代理。
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:amq="https://activemq.apache.org/schema/core"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
https://activemq.apache.org/schema/core https://activemq.apache.org/schema/core/activemq-core.xsd">
<amq:broker useJmx="false" persistent="false">
<amq:transportConnectors>
<amq:transportConnector uri="tcp://127.0.0.1:0" />
</amq:transportConnectors>
</amq:broker>
<amq:connectionFactory id="jmsFactory" brokerURL="vm://127.0.0.1"/>
</beans>
这使您能够与整个代理一起配置 JMS 工件,例如目标和连接工厂。
使用 Spring 的 JmsTemplate
Spring 支持一个方便的抽象 JmsTemplate,它允许您在发送消息等操作时隐藏一些底层 JMS 细节。
请注意,有一些JmsTemplate 注意事项需要注意。
使用 JmsTemplate 时要牢记的一点是,默认情况下,它会为发送的每个消息创建一个新的连接、会话、生产者 - 然后关闭所有这些。这非常低效!这样做是为了在 EJB 容器中工作,这些容器往往使用特殊的 ConnectionFactory 来进行池化。
如果您没有使用 JCA 容器来管理您的 JMS 连接,我们建议您使用来自activemq-pool
库的池化 JMS 连接提供者(org.apache.activemq.pool.PooledConnectionFactory),它将池化 JMS 资源以与 Spring 的 JmsTemplate 或 EJB 协同工作。
例如。
<!-- a pooling based JMS provider -->
<bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
<property name="connectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL">
<value>tcp://127.0.0.1:61616</value>
</property>
</bean>
</property>
</bean>
<!-- Spring JMS Template -->
<bean id="myJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory">
<ref local="jmsFactory"/>
</property>
</bean>
PooledConnectionFactory
支持池化 Connection、Session 和 MessageProducer 实例,因此它可以与Camel和 Spring 的JmsTemplate 和 MessagListenerContainer等工具一起使用。连接、会话和生产者在使用后将返回池,以便稍后可以重复使用它们,而无需再次创建它们的成本。
注意:虽然PooledConnectionFactory
确实允许创建活动消费者集合,但它不会“池化”消费者。池化对于连接、会话和生产者是有意义的,因为它们可能很少使用,创建起来很昂贵,并且可以在最小的成本下保持闲置状态。另一方面,消费者通常只在启动时创建,并保持运行状态,处理传入的消息。当消费者完成时,最好将其关闭,而不是让它保持闲置并将其返回到池中以供以后重复使用:这是因为,即使消费者处于闲置状态,ActiveMQ Classic 也会继续将消息传递到消费者的预取缓冲区中,这些消息将被保留在那里直到消费者再次活跃起来。
如果您要创建消费者集合(例如,用于多线程消息消费),您应该考虑保持较低的预取值(例如 10 或 20),以确保所有消息最终不会都传递给其中一个消费者。
我们还有一个池化 JMS ConnectionFactory,用于在 JCA/MDB 容器(org.apache.activemq.ra.InboundConnectionProxyFactory)内使用,当使用我们的 JCA 资源适配器时,它将重复使用用于传入消息的相同 JMS 连接/会话。
从 Spring 内部消费 JMS
Spring 的MessagListenerContainer应该用于消息消费。这提供了 MDB 的全部功能 - 有效的 JMS 消费和消息侦听器的池化 - 但无需完整的 EJB 容器。
您可以使用activemq-pool
的org.apache.activemq.pool.PooledConnectionFactory
有效地池化消费者集合的连接和会话,或者可以使用 Spring JMS 的org.springframework.jms.connection.CachingConnectionFactory
来实现相同的效果。
更多信息
还可以查看以下博客,了解有关使用 Spring JMS 与 ActiveMQ Classic 的信息