2016-09-15 6 views
2

Ich versuche, eine JMS-Brücke zwischen Artemis einzurichten (Laufen in Wildfly 10) und ActiveMQ 5,14JMS Brücke zwischen Wildfly 10 Artemis und ActiveMQ 5,14 (ONCE_AND_ONLY_ONCE Quality of Service)

Allgemein Im Prozess scheint zu funktionieren reibungslos, aber leider bleibe ich bei der XA-Konfiguration stecken, die notwendig ist, um ONCE_AND_ONLY_ONCE QoS zum Funktionieren zu bringen.

Obwohl Nachrichten auf der ActiveMQ Seite tun kommen, erhalte ich die folgende Fehlermeldung im Wildfly Protokoll:

11:25:57,920 WARN [org.apache.activemq.artemis.jms.bridge] (Thread-97) AMQ342009: JMS Bridge failed to send + acknowledge batch, closing JMS objects: javax.jms.IllegalStateException: Not a transacted session 
at org.apache.activemq.ActiveMQSession.commit(ActiveMQSession.java:577) 
at org.apache.activemq.ra.ManagedSessionProxy.commit(ManagedSessionProxy.java:108) 
at org.apache.activemq.artemis.jms.bridge.impl.JMSBridgeImpl.sendBatchNonTransacted(JMSBridgeImpl.java:1291) 
at org.apache.activemq.artemis.jms.bridge.impl.JMSBridgeImpl.sendBatch(JMSBridgeImpl.java:1251) 
at org.apache.activemq.artemis.jms.bridge.impl.JMSBridgeImpl.access$1500(JMSBridgeImpl.java:75) 
at org.apache.activemq.artemis.jms.bridge.impl.JMSBridgeImpl$BatchTimeChecker.run(JMSBridgeImpl.java:1794) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 

Mein Problem ist ähnlich wie diese (Wildfly 10 ONCE_AND_ONLY_ONCE JMS-Brücke), aber leider ist die Lösung doesn‘ t völlig auf meine Situation anwenden, weil mein Ziel ActiveMQ 5.14 ist.

Von allen Posts, die ich gelesen habe, scheint es klar, dass ich sicherstellen sollte, dass die Verbindungsfabriken für beide Seiten der Brücke für XA Support konfiguriert werden sollten. Auf der Artemis-Seite scheint das einfach genug zu sein: Fügen Sie einfach factory-type = "XA_GENERIC" zur Definition hinzu. Ich bin jedoch nicht in der Lage, herauszufinden, wie dies auf der ActiveMQ-Seite zu tun ist.

Hier ist der Ausschnitt aus meinem Standalone-full.xml, dass meine Messaging-Subsystem angibt:

<subsystem xmlns="urn:jboss:domain:messaging-activemq:1.0"> 
     <server name="default"> 
      <security-setting name="#"> 
       <role name="guest" delete-non-durable-queue="true" create-non-durable-queue="true" consume="true" send="true"/> 
      </security-setting> 
      <address-setting name="#" message-counter-history-day-limit="10" page-size-bytes="2097152" max-size-bytes="10485760" expiry-address="jms.queue.ExpiryQueue" dead-letter-address="jms.queue.DLQ"/> 
      <http-connector name="http-connector" endpoint="http-acceptor" socket-binding="http"/> 
      <http-connector name="http-connector-throughput" endpoint="http-acceptor-throughput" socket-binding="http"> 
       <param name="batch-delay" value="50"/> 
      </http-connector> 
      <in-vm-connector name="in-vm" server-id="0"/> 
      <http-acceptor name="http-acceptor" http-listener="default"/> 
      <http-acceptor name="http-acceptor-throughput" http-listener="default"> 
       <param name="batch-delay" value="50"/> 
       <param name="direct-deliver" value="false"/> 
      </http-acceptor> 
      <in-vm-acceptor name="in-vm" server-id="0"/> 
      <jms-queue name="ExpiryQueue" entries="java:/jms/queue/ExpiryQueue"/> 
      <jms-queue name="DLQ" entries="java:/jms/queue/DLQ"/> 
      <jms-queue name="NonBridgedTestQueue" entries="java:jboss/exported/jms/queue/nonBridgedTestQueue"/> 
      <jms-queue name="BridgedTestQueue" entries="java:jboss/exported/jms/queue/bridgedTestQueue"/> 
      <connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory" connectors="in-vm"/> 
      <connection-factory name="RemoteConnectionFactory" entries="java:jboss/exported/jms/RemoteConnectionFactory" connectors="http-connector"/> 
      <connection-factory name="InVmXAConnectionFactory" factory-type="XA_GENERIC" entries="java:/XAConnectionFactory" connectors="in-vm"/>    
      <pooled-connection-factory name="activemq-ra" transaction="xa" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" connectors="in-vm"/> 
     </server> 
     <jms-bridge name="simple-jms-bridge" add-messageID-in-header="true" max-batch-time="100" max-batch-size="10" max-retries="5" failure-retry-interval="10000" quality-of-service="ONCE_AND_ONLY_ONCE"> 
      <source destination="jboss/exported/jms/queue/bridgedTestQueue" connection-factory="java:/XAConnectionFactory"/> 
      <target destination="jboss/activemq/queue/bridgedTestQueue" connection-factory="AMQConnectionFactory"/> 
     </jms-bridge> 
    </subsystem> 

Für die ActiveMQ Definition ich einen Resource Adapter verwendet haben, wie folgt definiert:

<subsystem xmlns="urn:jboss:domain:resource-adapters:4.0"> 
     <resource-adapters> 
      <resource-adapter id="activemq"> 
       <archive>activemq-rar-5.14.0.rar</archive> 
       <transaction-support>XATransaction</transaction-support> 
       <config-property name="ServerUrl">tcp://localhost:61616?jms.rmIdFromConnectionId=true</config-property> 
       <config-property name="UserName">admin</config-property> 
       <config-property name="UseInboundSession">false</config-property> 
       <config-property name="Password">admin</config-property> 
       <connection-definitions> 
        <connection-definition class-name="org.apache.activemq.ra.ActiveMQManagedConnectionFactory" jndi-name="java:/AMQConnectionFactory" enabled="true" pool-name="AMQConnectionFactory"> 
         <xa-pool> 
          <min-pool-size>1</min-pool-size> 
          <max-pool-size>20</max-pool-size> 
          <prefill>false</prefill> 
          <is-same-rm-override>false</is-same-rm-override> 
         </xa-pool> 
        </connection-definition> 
       </connection-definitions> 
       <admin-objects> 
        <admin-object class-name="org.apache.activemq.command.ActiveMQTopic" jndi-name="java:jboss/activemq/topic/TestTopic" use-java-context="true" pool-name="TestTopic"> 
         <config-property name="PhysicalName"> 
          activemq/topic/TestTopic 
         </config-property> 
        </admin-object> 
        <admin-object class-name="org.apache.activemq.command.ActiveMQQueue" jndi-name="java:jboss/activemq/queue/TestQueue" use-java-context="true" pool-name="TestQueue"> 
         <config-property name="PhysicalName"> 
          activemq/queue/TestQueue 
         </config-property> 
        </admin-object> 
        <admin-object class-name="org.apache.activemq.command.ActiveMQQueue" jndi-name="java:jboss/activemq/queue/bridgedTestQueue" use-java-context="true" pool-name="BridgedTestQueue"> 
         <config-property name="PhysicalName"> 
          activemq/queue/bridgedTestQueue 
         </config-property> 
        </admin-object> 
       </admin-objects> 
      </resource-adapter> 
     </resource-adapters> 
    </subsystem> 

Einige Hinweise in die richtige Richtung werden geschätzt

Greg

Antwort

2

Nachdem ich diese Frage gepostet habe, habe ich etwas versucht, das anscheinend funktioniert hat. Würde mich immer noch interessieren zu hören, ob dies der richtige Ansatz ist.

Beim Betrachten der Datei ra.xml im Resource Adapter habe ich festgestellt, dass sie eine zusätzliche Verbindungsfactory als Admin-Objekt anbietet. So habe ich die folgenden auf die Resource Adapter Definition im Standalone-full.xml:

    <admin-object class-name="org.apache.activemq.ActiveMQXAConnectionFactory" jndi-name="java:jboss/activemq/activeMQXAConnectionFactory" use-java-context="true"> 
         <config-property name="brokerURL"> 
          tcp://localhost:61616?jms.rmIdFromConnectionId=true 
         </config-property> 
        </admin-object> 

dieser Connection Factory verwenden ich dann die JMS-Brücke wie folgt aktualisiert:

 <jms-bridge name="simple-jms-bridge" add-messageID-in-header="true" max-batch-time="100" max-batch-size="10" max-retries="5" failure-retry-interval="10000" quality-of-service="ONCE_AND_ONLY_ONCE"> 
      <source destination="jboss/exported/jms/queue/bridgedTestQueue" connection-factory="java:/XAConnectionFactory"/> 
      <target destination="jboss/activemq/queue/bridgedTestQueue" connection-factory="java:jboss/activemq/activeMQXAConnectionFactory"/> 
     </jms-bridge> 

Jetzt alles scheint gut zu funktionieren . Nachrichten kommen auf der ActiveMQ-Seite an und ich bekomme keine Probleme im WildFly-Protokoll. Whoopwhoop

+0

Könnten Sie bitte mehr Details über Ihre Lösung geben? Ich fragte ähnliche Frage hier http://stackoverflow.com/questions/43179283/while-start-wildfly-10-1-to-work-with-artemis-jboss-ra-activemq-ra-is-not-in – webyildirim

+0

@ webyildirim, ich habe gerade deinen Post gelesen, aber ich denke, meine Situation ist ganz anders als das, was du erreichen willst. Nichtsdestotrotz poste ich die relevanten Abschnitte meiner Konfiguration auf Ihrer Frage. –

Verwandte Themen