2016-09-15 1 views
2

Je suis en train de mettre en place un pont JMS entre Artemis (Rodage wildfly 10) et ActiveMQ 5,14JMS pont entre wildfly 10 Artemis et ActiveMQ 5,14 (ONCE_AND_ONLY_ONCE Qualité de service)

En général, le processus semble fonctionner en douceur, mais malheureusement, je suis coincé sur la configuration XA qui est nécessaire pour que la QoS de ONCE_AND_ONLY_ONCE fonctionne.

Bien que les messages n'arrivent sur le côté ActiveMQ, je reçois l'erreur suivante dans le journal wildfly:

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) 

Mon problème est similaire à celui-ci (wildfly 10 pont JMS ONCE_AND_ONLY_ONCE) mais malheureusement la solution n » Je m'applique totalement à ma situation, car ma cible est ActiveMQ 5.14. De tous les messages que j'ai lus il semble clair que je devrais m'assurer que les usines de connexion pour les deux côtés du pont devraient être configurées pour le support de XA. Du côté d'Artemis, cela semble assez simple: il suffit d'ajouter factory-type = "XA_GENERIC" à la définition. Cependant, je ne suis pas capable de comprendre comment faire cela du côté d'ActiveMQ.

est ici l'extrait de mon-full.xml autonome qui spécifie mon sous-système de messagerie:

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

Pour la définition ActiveMQ Je l'ai utilisé un adaptateur de ressources, défini comme suit:

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

Quelques indications dans la bonne direction seront appréciées

Greg

Répondre

2

Après avoir posté cette question, j'ai essayé quelque chose qui semble avoir fonctionné. Serait toujours intéressé d'entendre si c'est la bonne approche si.

En regardant le fichier ra.xml dans l'adaptateur de ressources, j'ai remarqué qu'il offre une fabrique de connexions supplémentaire en tant qu'objet d'administration. Donc, j'ajouté ce qui suit à la définition adaptateur de ressources en mode autonome-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> 

En utilisant cette usine de connexion je puis mis à jour le JMS Bridge comme suit:

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

Maintenant, tout semble bien fonctionner . Les messages arrivent du côté ActiveMQ et je ne rencontre aucun problème dans le journal WildFly. Whoopwhoop

+0

Pourriez-vous donner plus de détails sur votre solution? J'ai posé une question similaire ici http://stackoverflow.com/questions/43179283/while-starting-wildfly-10-1-to-work-with-artemis-jboss-ra-activemq-ra-is-not-in – webyildirim

+0

@ webyildirim, j'ai lu votre message tout à l'heure, mais je pense que ma situation est très différente de ce que vous essayez d'accomplir. Néanmoins, je vais poster les sections pertinentes de ma config sur votre question. –