TomEE: JMS-провайдер - ActiveMQ с протоколом AMQP Wire - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь настроить TomEE (Tomcat с Java EE) для подключения к внешнему брокеру (служебная шина Azure) с использованием проводного протокола AMQP. Похоже, по умолчанию JMS-провайдер - ActiveMQ. Согласно документации, ActiveMQ поддерживает протокол AMQP. Моя цель - использовать ActiveMQ в качестве JMS-провайдера, поставляемого с TomEE. Однако при развертывании основного файла ear появляется следующая ошибка:

03-Jun-2019 16:43:19.629 WARNING [http-nio-8080-exec-1] org.apache.geronimo.transaction.manager.TransactionImpl.enlistResource Unable to enlist XAResource org.apache.geronimo.transaction.manager.WrapperNamedXAResource@117d2011, errorCode: -7
 javax.transaction.xa.XAException: Disposed due to prior exception
    at org.apache.activemq.TransactionContext.toXAException(TransactionContext.java:803)
    at org.apache.activemq.TransactionContext.setXid(TransactionContext.java:729)
    at org.apache.activemq.TransactionContext.start(TransactionContext.java:379)
    at org.apache.activemq.ra.LocalAndXATransaction.start(LocalAndXATransaction.java:151)
    at org.apache.geronimo.transaction.manager.WrapperNamedXAResource.start(WrapperNamedXAResource.java:111)
    at org.apache.geronimo.transaction.manager.TransactionImpl.enlistResource(TransactionImpl.java:209)
    at org.apache.geronimo.connector.outbound.TransactionEnlistingInterceptor.getConnection(TransactionEnlistingInterceptor.java:60)
    at org.apache.geronimo.connector.outbound.TransactionCachingInterceptor.getConnection(TransactionCachingInterceptor.java:101)
    at org.apache.geronimo.connector.outbound.ConnectionHandleInterceptor.getConnection(ConnectionHandleInterceptor.java:43)
    at org.apache.geronimo.connector.outbound.TCCLInterceptor.getConnection(TCCLInterceptor.java:39)
    at org.apache.geronimo.connector.outbound.ConnectionTrackingInterceptor.getConnection(ConnectionTrackingInterceptor.java:66)
    at org.apache.geronimo.connector.outbound.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:81)
    at org.apache.activemq.ra.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:94)
    at org.apache.activemq.ra.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:67)
    at local.gerb.HelloImpl.sendJMS(HelloImpl.java:79)

[....]

Caused by: org.apache.activemq.transport.InactivityIOException: Channel was inactive for too (>30000) long: tcp://40.71.10.195:5671
    at org.apache.activemq.transport.amqp.AmqpInactivityMonitor$1$1.run(AmqpInactivityMonitor.java:69)
    ... 3 more

Кто-нибудь использовал ActiveMQ с AMQP? Или для бонусных баллов кто-нибудь работал с сервисной шиной Azure?

Я попробовал быстрый запуск Azure JMS с github: (https://github.com/Azure/azure-service-bus/tree/master/samples/Java/qpid-jms-client/JmsQueueQuickstart), и это работает, поэтому я уверен, что служебная шина запущена и работает. Однако я не могу развернуть приложение JMS в TomEE. Любая помощь будет принята с благодарностью.

Обновление: я использую адаптер ресурсов AMPQ, который Джастин Бертрам предлагает: https://github.com/amqphub/amqp-10-resource-adapter

Я включил rar в свой файл ear, и TomEE, похоже, успешно загрузил адаптер ресурсов:

04-Jun-2019 02:21:02.117 INFO [main] org.apache.openejb.config.OutputGeneratedDescriptors.writeRaXml Dumping Generated ra.xml to: /usr/local/tomee/temp/ra-6070887435985632449resource-adapter-1.0.1-SNAPSHOT.rar.xml
04-Jun-2019 02:21:02.140 INFO [main] org.apache.openejb.config.ConfigurationFactory.configureService Configuring Service(id=AmqpResourceAdapter, type=Resource, provider-id=AmqpResourceAdapter)
04-Jun-2019 02:21:02.142 INFO [main] org.apache.openejb.config.ConfigurationFactory.configureService Configuring Service(id=resource-adapter-1.0.1-SNAPSHOT.rar, type=Resource, provider-id=resource-adapter-1.0.1-SNAPSHOT.rar)
04-Jun-2019 02:21:02.142 INFO [main] org.apache.openejb.config.ConfigurationFactory.configureService Configuring Service(id=resource-adapter-1.0.1-SNAPSHOT.rar, type=Container, provider-id=Default MDB Container)

Но, похоже, позже произойдет сбой при запуске TomEE. Кажется, что адаптер ресурсов ActiveMQ и адаптер ресурсов AMPQ находятся в конфликте друг с другом. Теперь я получаю исключение javax.naming.NameAlreadyBoundException:

04-Jun-2019 02:21:03.947 SEVERE [main] org.apache.tomee.catalina.ServerListener.lifecycleEvent TomEE Listener can't start OpenEJB
 org.apache.openejb.OpenEJBException: Cannot bind Container with id Default MDB Container : ParsedName{path=openejb/Container/Default MDB Container, component=Default MDB Container}
    at org.apache.openejb.assembler.classic.Assembler.bindService(Assembler.java:2847)
    at org.apache.openejb.assembler.classic.Assembler.createContainer(Assembler.java:2817)
    at org.apache.openejb.assembler.classic.Assembler.buildContainerSystem(Assembler.java:623)
    at org.apache.openejb.assembler.classic.Assembler.build(Assembler.java:487)
    at org.apache.openejb.OpenEJB$Instance.<init>(OpenEJB.java:150)
    at org.apache.openejb.OpenEJB.init(OpenEJB.java:307)
    at org.apache.tomee.catalina.TomcatLoader.initialize(TomcatLoader.java:247)
    at org.apache.tomee.catalina.ServerListener.lifecycleEvent(ServerListener.java:168)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:94)
    at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:395)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:108)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:632)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:655)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:309)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:492)
Caused by: javax.naming.NameAlreadyBoundException: ParsedName{path=openejb/Container/Default MDB Container, component=Default MDB Container}
    at org.apache.openejb.core.ivm.naming.NameNode.bind(NameNode.java:181)
    at org.apache.openejb.core.ivm.naming.IvmContext.bind(IvmContext.java:322)
    at org.apache.openejb.assembler.classic.Assembler.bindService(Assembler.java:2845)

Похоже, что это проблема (я думаю):

org.apache.openejb.config.ConfigurationFactory.configureService Configuring Service(id=resource-adapter-1.0.1-SNAPSHOT.rar, type=Container, provider-id=Default MDB Container

Похоже, что ActiveMQ и AMPQ имеют контейнер MDB по умолчанию, который вызывает исключение при развертывании. Однако я не уверен, как настроить AMPQ RA для использования другого имени.

Я не могу найти много информации о том, как настроить RA в TomEE. Единственное, с чем я столкнулся, это документ: http://tomee.apache.org/changing-jms-implementations.html

Но мне кажется, что детали немного светятся, поэтому я немного растерялся, что делать дальше.

Я ценю помощь всех. Я чувствую, что я очень близок к тому, чтобы заставить это работать!

1 Ответ

2 голосов
/ 03 июня 2019

Я думаю, что вы путаете брокеров и клиентов.Я использовал ActiveMQ с AMQP, но это был клиент AMQP, подключающийся к брокеру ActiveMQ.Вы пытаетесь использовать адаптер ресурсов ActiveMQ JCA, который предназначен для передачи протокола OpenWire посреднику ActiveMQ для подключения к служебной шине Azure с помощью AMQP.Это не сработает и никогда не предназначалось для работы.

Вам необходимо использовать адаптер ресурсов JCA, который может говорить на языке AMQP (то есть не ActiveMQ JCA RA).Может быть, взгляните на этот универсальный адаптер ресурсов JMS JCA .Он был разработан для использования в JBoss AS или Wildfly, но не должно быть ничего, препятствующего его использованию в TomEE.Затем вы можете подключить Qpid JMS в качестве клиента.Вы можете увидеть пример другого компонента, который делает это здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...