26.5 支持 JCA 消息端点

从 Spring2.5 版本开始,Spring 也提供了基于 JCA MessageListener容器的支持。JmsMessageEndpointManager将根据提供者ResourceAdapter的类名自动地决定ActivationSpec类名。因此,通常它只提供如下例所示的 Spring 的通用JmsActivationSpecConfig

  1. <bean class="org.springframework.jms.listener.endpoint.JmsMessageEndpointManager">
  2. <property name="resourceAdapter" ref="resourceAdapter"/>
  3. <property name="activationSpecConfig">
  4. <bean class="org.springframework.jms.listener.endpoint.JmsActivationSpecConfig">
  5. <property name="destinationName" value="myQueue"/>
  6. </bean>
  7. </property>
  8. <property name="messageListener" ref="myMessageListener"/>
  9. </bean>

或者,您可以使用给定的ActivationSpec对象设置JmsMessageEndpointManagerActivationSpec对象也可能来自 JNDI 查找(使用<jee:jndi-lookup>)。

  1. <bean class="org.springframework.jms.listener.endpoint.JmsMessageEndpointManager">
  2. <property name="resourceAdapter" ref="resourceAdapter"/>
  3. <property name="activationSpec">
  4. <bean class="org.apache.activemq.ra.ActiveMQActivationSpec">
  5. <property name="destination" value="myQueue"/>
  6. <property name="destinationType" value="javax.jms.Queue"/>
  7. </bean>
  8. </property>
  9. <property name="messageListener" ref="myMessageListener"/>
  10. </bean>

使用 Spring 的 ResourceAdapterFactoryBean,目标ResourceAdapter可以在本地配置,如以下示例所示。

  1. <bean id="resourceAdapter" class="org.springframework.jca.support.ResourceAdapterFactoryBean">
  2. <property name="resourceAdapter">
  3. <bean class="org.apache.activemq.ra.ActiveMQResourceAdapter">
  4. <property name="serverUrl" value="tcp://localhost:61616"/>
  5. </bean>
  6. </property>
  7. <property name="workManager">
  8. <bean class="org.springframework.jca.work.SimpleTaskWorkManager"/>
  9. </property>
  10. </bean>

指定的WorkManager也可能指向环境特定的线程池 - 通常通过SimpleTaskWorkManagerasyncTaskExecutor属性。如果,你恰好考虑使用多个适配器,为你的所有ResourceAdapter实例定义一个共享线程池。

在某些环境(例如 WebLogic 9或更高版本)中,可以从 JNDI 中获取整个ResourceAdapter对象(使用<jee:jndi-lookup>)。然后,基于Spring 的消息监听器可以与服务器托管的ResourceAdapter进行交互,也可以使用服务内置的WorkManager

有关更多详细信息,请参阅JMSMessageEndpointManagerJmsActivationSpecConfig`ResourceAdapterFactoryBean的 JavaDoc。

Spring 还提供了一个通用的 JCA 消息端点管理器,它不绑定到 JMS :org.springframework.jca.endpoint.GenericMessageEndpointManager。 它允许使用任何消息监听器类型(例如 CCI MessageListener)和任何提供者特定的ActivationSpec对象。从所涉及 JCA 提供者的文档可以找到这个连接器的实际能力,并参考“GenericMessageEndpointManager的 JavaDoc ”来了解 Spring 特有的配置详细信息。

基于 JCA 的消息端点管理器与 EJB 2.1的消息驱动 Bean 很相似;它使用了提供者们约定的相同底层资源。 与 EJB 2.1 MDB 一样,任何被 JCA 提供者支持的消息监听器接口都可以在 Spring 上下文中使用。尽管如此,Spring 仍为 JMS 提供了显式的“方便的”支持,很显然是因为 JMS 是 JCA 端点管理约定中最通用的端点 API。