代码之家  ›  专栏  ›  技术社区  ›  Georgy Bolyuba

如何在JBoss中配置activemqjca连接器以使用XA连接?

  •  8
  • Georgy Bolyuba  · 技术社区  · 14 年前

    在JBoss5.1.0上,我使用*-ds.xml(标准JBoss ds)配置了数据源(PostgreSQL 8.3.11)。它使用XADataSource( PGXADataSource

    我想做的是让ActiveMQ连接工厂和数据源参与XA事务。例如,我想更新DB record并将JMS消息作为UOW发送。你明白了。

    我在my-pg-ds.xml中配置了PGXADataSource,它可以正常工作(我可以一直跟踪到 PGXAConnection's start method ). 我已尝试配置 ActiveMQXAConnectionFactory JtaTransactionManager ActiveMQXAConnection ActiveMQXASession .

    由于这不起作用,我已经切换到ActiveMQ ConnectionFactory的JCA配置(基于 this ConnectionFactory ,但我不明白如何将其配置为使用XAConnectionFactory。好像 Resource Adapter

    我是遗漏了什么,还是除了为资源适配器编写XA包装器之外别无选择?

    1 回复  |  直到 11 年前
        1
  •  7
  •   Georgy Bolyuba    14 年前

    好的,我找到了解决办法。Jboss包括用于任何JMS工厂的JCA连接器(支持两种类型的事务:XA和local)。它位于/server//deploy/jms-ra.rar中。我是这样配置的。

    第一, 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

    我使用mbean标记来配置JMSProviderLoader(这是从内部JBoss配置之一复制的)。现在,我所要做的就是创建一个XA连接工厂的实例并将其绑定到 java:/activemq/XAConnectionFactory . 有几种方法可以做到这一点(例如,实现MBean包装器)。

    因为我是JBoss5,所以我使用了microcontainer(它可能在JBoss6中工作)。我补充道 activemq-jms-jboss-beans.xml deployers 目录:

    <?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 豆子。为了将它绑定到JNDI,我使用JndiBinding注释对它进行注释。要使此注释正常工作,我们需要JndiLifecycleCallback。据我所知,对microcontainer创建的每个bean调用JndiLifecycleCallback,并检查该bean上的JndiBinding注释。