簡體   English   中英

如何在JBoss中配置ActiveMQ JCA連接器以使用XA連接?

[英]How to configure ActiveMQ JCA connector in JBoss to use XA connections?

在JBoss 5.1.0上,我使用* -ds.xml(標准jboss DS)配置了Datasource(PostgreSQL 8.3.11)。 它使用XADataSource( PGXADataSource )。 我也有ActiveMQ代理(現在它在VM中運行,在JBoss下,但它將在單獨的服務器上運行)。

我想做的是讓ActiveMQ連接工廠和數據源參與XA事務。 例如,我想更新DB記錄並將UMS消息作為UOW發送。 你明白了。

我在my-pg-ds.xml中配置了PGXADataSource並且它可以工作(我可以跟蹤執行到PGXAConnection的start方法 )。 我試圖在Spring中直接配置ActiveMQXAConnectionFactory (我使用的是Spring 3.0.2.RELEASE),但是這不起作用,因為在這種情況下是Spring事務管理器(我使用注釋讓Spring配置JtaTransactionManager ,它只需將所有工作委托給Jboss事務管理器)沒有為給定的ActiveMQXAConnection登記XAResource。 每當我嘗試發送消息時,我都會收到異常JMSException,說“會話的XAResource尚未在分布式事務中登記”。 ActiveMQXASession拋出。

由於這不起作用,我已切換到ActiveMQ ConnectionFactory的JCA配置(基於文檔),它適用於常規ConnectionFactory ,但我不明白如何配置它以使用XAConnectionFactory。 看起來資源適配器根本沒有適用於XA連接工廠的ManagedConnectionFactory,ManagedConnection等實現。

我錯過了什么或者我別無選擇,只能為資源適配器編寫XA包裝器?

好的,我找到了解決方案。 Jboss包含任何JMS工廠的JCA連接器(支持兩種類型的事務:XA和本地)。 它位於/server//deploy/jms-ra.rar。 這是我配置它的方式。

首先,進入jms-ra.rar旁邊的deploy目錄的activemq-jms-ds.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE connection-factories
    PUBLIC "-//JBoss//DTD JBOSS JCA Config 1.5//EN"
    "http://www.jboss.org/j2ee/dtd/jboss-ds_1_5.dtd">

<connection-factories>
    <mbean code="org.jboss.jms.jndi.JMSProviderLoader"
       name="jboss.messaging:service=JMSProviderLoader,name=ActiveMQJMSProvider">
        <attribute name="ProviderName">ActiveMQJMSProvider</attribute>
        <attribute name="ProviderAdapterClass">org.jboss.jms.jndi.JNDIProviderAdapter</attribute>
        <attribute name="FactoryRef">java:/activemq/XAConnectionFactory</attribute>
        <attribute name="QueueFactoryRef">java:/activemq/XAConnectionFactory</attribute>
        <attribute name="TopicFactoryRef">java:/activemq/XAConnectionFactory</attribute>
    </mbean>

    <tx-connection-factory>
        <jndi-name>JmsXAConnectionFactory</jndi-name>
        <xa-transaction/>
        <rar-name>jms-ra.rar</rar-name>
        <connection-definition>org.jboss.resource.adapter.jms.JmsConnectionFactory</connection-definition>
        <config-property name="JmsProviderAdapterJNDI" type="java.lang.String">java:/ActiveMQJMSProvider</config-property>
    </tx-connection-factory>
</connection-factories>

這告訴Jboss查看jms-ra.rar並找到可以為org.jboss.resource.adapter.jms.JmsConnectionFactory提供托管連接工廠的適配器。 內部jms適配器依賴於JmsProviderAdapter,它用於存儲連接工廠的JNDI名稱(在我的配置中,所有名稱都相同)。

我使用mbean標簽來配置JMSProviderLoader(這是從內部JBoss配置中復制的)。 現在,我所要做的就是以某種方式創建一個XA連接工廠的實例並將其綁定到java:/activemq/XAConnectionFactory 有幾種方法可以做到這一點(例如,實現MBean包裝器)。

由於我是Jboss 5,我使用了微容器(可能在Jboss 6中工作)。 我將activemq-jms-jboss-beans.xml文件添加到deployers direcotry中:

<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="urn:jboss:bean-deployer:2.0">
    <!-- Define a Jndi binding aspect/annotation that exposes beans via jndi
        when they are registered with the kernel.
    -->
    <aop:lifecycle-configure xmlns:aop="urn:jboss:aop-beans:1.0"
        name="DependencyAdvice"
        class="org.jboss.aop.microcontainer.aspects.jndi.JndiLifecycleCallback"
        classes="@org.jboss.aop.microcontainer.aspects.jndi.JndiBinding"
        manager-bean="AspectManager"
        manager-property="aspectManager">
    </aop:lifecycle-configure>

    <bean name="ActiveMQXAConnectionFactory" class="org.apache.activemq.ActiveMQXAConnectionFactory">
        <annotation>@org.jboss.aop.microcontainer.aspects.jndi.JndiBinding(name="activemq/XAConnectionFactory", aliases={"java:/activemq/XAConnectionFactory"})</annotation>
        <property name="brokerURL">vm://localhost</property>
    </bean>
</deployment>

我創建了一個ActiveMQXAConnectionFactory bean。 為了將它綁定到JNDI,我使用JndiBinding注釋對其進行注釋。 要使此注釋起作用,我們需要JndiLifecycleCallback。 據我所知,JidiLifecycleCallback在由微容器創建的每個bean上調用,並檢查該bean上的JndiBinding注釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM