2010-07-02 21 views
7

JBoss 5.1.0 üzerinde * -ds.xml (standart jboss DS) kullanılarak yapılandırılmış Datasource (PostgreSQL 8.3.11) var. XADataSource kullanır (PGXADataSource). Ayrıca ActiveMQ aracılığım var (şu anda VM'de, VM'de çalışıyor, ancak ayrı sunucuda olacak).JBA'daki ActiveMQ JCA bağlayıcısı XA bağlantılarını kullanmak üzere nasıl yapılandırılır?

Yapmak istediğim, ActiveAc Bağlantı Fabrikası ve Veri Kaynağının XA İşlemlerine katılmasını sağlamaktır. Örneğin, DB kaydını güncellemek ve bir JMS mesajını UOW olarak göndermek istiyorum. Kaptın bu işi.

PGXADataSource'ı my-pg-ds.xml dosyasında yapılandırdım ve çalışıyor (yürütme işlemini PGXAConnection's start method adresine kadar izleyebilirim). ActiveMQXAConnectionFactory'u doğrudan ilkbaharda yapılandırmaya çalıştım (Spring 3.0.2.RELEASE kullanıyorum), ancak bu çalışmaz, çünkü bu durumda Spring işlem yöneticisi (Spring'in JtaTransactionManager'u yapılandırmasına izin vermek için ek açıklamaları kullanıyorum. Jboss işlem yöneticisi), verilen ActiveMQXAConnection için XAResource'u kaydetmez. Ne zaman bir mesaj göndermeye çalıştığımda bir istisna alıyorum JMSException "Session'ın XAResource dağıtılmış bir işlemde listelenmemiş." ActiveMQXASession'dan atılmıştır. bu işe yaramadı beri, ActiveMQ ConnectionFactory ait JCA yapılandırmasına geçiş yaptı

(this belgeye dayanarak) ve düzenli için çalışır, ama ben o XAConnectionFactory kullanmayı nasıl yapılandırabileceğinizi anlamıyorum. Resource Adapter sadece XA bağlantı fabrikası için uygun ManagedConnectionFactory, ManagedConnection, vb. Uygulamalara sahip değil gibi görünüyor.

Bir şey eksik mi yoksa kaynak bağdaştırıcısına XA sarmalayıcıları yazmaktan başka seçeneğim yok mu?

cevap

6

Tamam, ben çözümü buldum. Jboss, herhangi bir JMS fabrikası için JCA konektörünü içerir (her iki işlem türünü destekler: XA ve yerel). /server//deploy/jms-ra.rar adresinde bulunur. Bunu nasıl yapılandırdım.

jms-ra.rar yanındaki dağıtma dizine gider Öncelikle activemq-jms-ds.xml dosyası: Bu jms-ra.rar içine bakmak ve org.jboss.resource.adapter.jms.JmsConnectionFactory için bağlantı fabrika yönetilen sağlayabilir adaptörü bulmak için JBoss söyler

<?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> 

. Dahili jms adaptörü, bağlantı fabrikalarının JNDI adlarını depolamak için kullanılan JmsProviderAdapter'e bağlıdır (tüm yapılandırmalarda benim ismim aynıdır).

JMSProviderLoader öğesini yapılandırmak için mbean etiketini kullanıyorum (bu, dahili JBoss yapılandırmalarından birinden kopyalanır). Şimdi, tek yapmam gereken bir şekilde XA bağlantı fabrikamın bir örneğini oluşturmak ve onu java:/activemq/XAConnectionFactory'a bağlamak. Bunu yapmanın birkaç yolu vardır (örneğin MBean sarmalayıcıyı uygulayın).

Ben Jboss 5 olduğum için microcontainer kullanıyorum (Jboss 6'da çalışması muhtemel).

<?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> 

Ben ActiveMQXAConnectionFactory fasulye oluşturun: Ben deployers direcotry içine activemq-jms-jboss-beans.xml dosya eklendi. JNDI'ye bağlamak için, JndiBinding ek açıklama ile ona açıklama ekliyorum. Bu açıklamanın çalışması için JndiLifecycleCallback'e ihtiyacımız var. Anlayabildiğim kadarıyla, Microcontainer tarafından yaratılan her fasülye JndiLifecycleCallback denir ve o fasülyede JndiBinding ek açıklamalarını kontrol eder.

İlgili konular