Я пытаюсь настроить 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
Но мне кажется, что детали немного светятся, поэтому я немного растерялся, что делать дальше.
Я ценю помощь всех. Я чувствую, что я очень близок к тому, чтобы заставить это работать!