2016-09-15 8 views
2

Я пытаюсь создать мост между JMS Артемиды (Запуск в WildFly 10) и ActiveMQ 5,14JMS мост между WildFly 10 Артемида и ActiveMQ 5,14 (ONCE_AND_ONLY_ONCE Качество обслуживания)

В целом процесс, кажется, работает плавно, но, к сожалению, я застрял в конфигурации XA, которая необходима, чтобы заставить QOS ONCE_AND_ONLY_ONCE работать.

Хотя сообщения действительно поступают на стороне ActiveMQ, я получаю следующее сообщение об ошибке в журнале 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) 

Моя проблема похожа на этот (Wildfly 10 ONCE_AND_ONLY_ONCE JMS моста), но, к сожалению, решение Безразлично» t полностью применимо к моей ситуации, потому что моей целью является ActiveMQ 5.14.

Из всех сообщений, которые я прочитал, кажется ясным, что я должен убедиться, что фабрики соединений для обеих сторон моста должны быть настроены для поддержки XA. На стороне Artemis это кажется достаточно простым: просто добавьте в определение фабричный тип = «XA_GENERIC». Тем не менее, я не могу понять, как это сделать на стороне ActiveMQ.

Вот отрывок из моего автономного-full.xml, который определяет мою подсистему обмена сообщений:

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

Для определения ActiveMQ я использовал адаптер ресурсов, определяются следующим образом:

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

Некоторые указатели в правильном направлении будут оценены

Greg

ответ

2

После публикации этого вопроса я попробовал что-то, что, похоже, сработало. Все равно было бы интересно услышать, если это правильный подход.

При просмотре файла ra.xml в адаптере ресурсов я заметил, что он предлагает дополнительную фабрику соединений в качестве объекта admin. Поэтому я добавил следующее определение адаптера ресурсов в автономном-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> 

С помощью этого Factory Connection я обновил JMS мост следующим образом:

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

Теперь все кажется, работает хорошо , Сообщения поступают на сторону ActiveMQ, и я не получаю никаких проблем в журнале WildFly. Whoopwhoop

+0

Не могли бы вы предоставить более подробную информацию о своем решении? я задал аналогичный вопрос здесь http://stackoverflow.com/questions/43179283/while-starting-wildfly-10-1-to-work-with-artemis-jboss-ra-activemq-ra-is-not-in – webyildirim

+0

@ webyildirim, я прочитал ваш пост только сейчас, но я думаю, что моя ситуация сильно отличается от того, чего вы пытаетесь достичь. Тем не менее, я опубликую соответствующие разделы моей конфигурации по вашему вопросу. –