JCA 訊息端點支援

從 2.5 版本開始,Spring 也為基於 JCA 的 MessageListener 容器提供支援。JmsMessageEndpointManager 嘗試從提供者的 ResourceAdapter 類別名稱自動判斷 ActivationSpec 類別名稱。因此,通常可以提供 Spring 的通用 JmsActivationSpecConfig,如下列範例所示

  • Java

  • Kotlin

  • Xml

@Bean
public JmsMessageEndpointManager jmsMessageEndpointManager(ResourceAdapter resourceAdapter,
		MessageListener myMessageListener) {

	JmsActivationSpecConfig specConfig = new JmsActivationSpecConfig();
	specConfig.setDestinationName("myQueue");

	JmsMessageEndpointManager endpointManager = new JmsMessageEndpointManager();
	endpointManager.setResourceAdapter(resourceAdapter);
	endpointManager.setActivationSpecConfig(specConfig);
	endpointManager.setMessageListener(myMessageListener);
	return endpointManager;
}
@Bean
fun jmsMessageEndpointManager(
	resourceAdapter: ResourceAdapter, myMessageListener: MessageListener) = JmsMessageEndpointManager().apply {
		setResourceAdapter(resourceAdapter)
		activationSpecConfig = JmsActivationSpecConfig().apply {
			destinationName = "myQueue"
		}
		messageListener = myMessageListener
	}
<bean class="org.springframework.jms.listener.endpoint.JmsMessageEndpointManager">
	<property name="resourceAdapter" ref="resourceAdapter"/>
	<property name="activationSpecConfig">
		<bean class="org.springframework.jms.listener.endpoint.JmsActivationSpecConfig">
			<property name="destinationName" value="myQueue"/>
		</bean>
	</property>
	<property name="messageListener" ref="myMessageListener"/>
</bean>

或者,您可以使用給定的 ActivationSpec 物件設定 JmsMessageEndpointManagerActivationSpec 物件也可能來自 JNDI 查找 (使用 <jee:jndi-lookup>)。以下範例顯示如何執行此操作

  • Java

  • Kotlin

  • Xml

@Bean
JmsMessageEndpointManager jmsMessageEndpointManager(ResourceAdapter resourceAdapter,
		MessageListener myMessageListener) {

	ActiveMQActivationSpec spec = new ActiveMQActivationSpec();
	spec.setDestination("myQueue");
	spec.setDestinationType("jakarta.jms.Queue");

	JmsMessageEndpointManager endpointManager = new JmsMessageEndpointManager();
	endpointManager.setResourceAdapter(resourceAdapter);
	endpointManager.setActivationSpec(spec);
	endpointManager.setMessageListener(myMessageListener);
	return endpointManager;
}
@Bean
fun jmsMessageEndpointManager(
	resourceAdapter: ResourceAdapter, myMessageListener: MessageListener) = JmsMessageEndpointManager().apply {
		setResourceAdapter(resourceAdapter)
		activationSpec = ActiveMQActivationSpec().apply {
			destination = "myQueue"
			destinationType = "jakarta.jms.Queue"
		}
		messageListener = myMessageListener
	}
<bean class="org.springframework.jms.listener.endpoint.JmsMessageEndpointManager">
	<property name="resourceAdapter" ref="resourceAdapter"/>
	<property name="activationSpec">
		<bean class="org.apache.activemq.ra.ActiveMQActivationSpec">
			<property name="destination" value="myQueue"/>
			<property name="destinationType" value="jakarta.jms.Queue"/>
		</bean>
	</property>
	<property name="messageListener" ref="myMessageListener"/>
</bean>

請參閱 JmsMessageEndpointManagerJmsActivationSpecConfigResourceAdapterFactoryBean 的 javadoc 以取得更多詳細資訊。

Spring 也提供一個通用的 JCA 訊息端點管理器,它不與 JMS 綁定:org.springframework.jca.endpoint.GenericMessageEndpointManager。此元件允許使用任何訊息監聽器類型 (例如 JMS MessageListener) 和任何供應商特定的 ActivationSpec 物件。請參閱您的 JCA 供應商的文件,以了解您的連接器的實際功能,並參閱 GenericMessageEndpointManager javadoc 以取得 Spring 特定的組態詳細資訊。

基於 JCA 的訊息端點管理非常類似於 EJB 2.1 Message-Driven Bean。它使用相同的底層資源提供者契約。與 EJB 2.1 MDB 一樣,您也可以在 Spring 內容中使用 JCA 供應商支援的任何訊息監聽器介面。Spring 仍然為 JMS 提供明確的「便利」支援,因為 JMS 是與 JCA 端點管理契約一起使用的最常見端點 API。