好的,我找到了解决方案。 Jboss 包括适用于任何 JMS 工厂的 JCA 连接器(支持两种类型的事务:XA 和本地)。它位于 /server//deploy/jms-ra.rar。这是我的配置方式。
首先,activemq-jms-ds.xml 文件进入 jms-ra.rar 旁边的部署目录:
<?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 文件添加到deployersdirecotry:
<?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。据我所知,在微容器创建的每个 bean 上都会调用 JndiLifecycleCallback 并检查该 bean 上的 JndiBinding 注释。