簡體   English   中英

TomEE:JMS提供程序-具有AMQP Wire協議的ActiveMQ

[英]TomEE: JMS Provider - ActiveMQ with AMQP Wire protocol

我正在嘗試將TomEE(帶有Java EE的Tomcat)配置為使用AMQP有線協議連接到外部代理(Azure服務總線)。 默認情況下,JMS Provider看起來像是ActiveMQ。 根據文檔,ActiveMQ確實支持AMQP協議。 我的目標是使用ActiveMQ作為TomEE隨附的JMS提供程序。 但是,當我部署基本的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 Service Bus一起使用?

我確實嘗試了從github上的Azure JMS快速入門:( https://github.com/Azure/azure-service-bus/tree/master/samples/Java/qpid-jms-client/JmsQueueQuickstart ),這是可行的,所以我我有信心Service Bus已啟動並正在運行。 但是,我無法在TomEE中部署JMS應用程序。 任何幫助將不勝感激。

更新:我正在使用賈斯汀·貝特拉姆建議的AMPQ資源適配器: https : //github.com/amqphub/amqp-10-resource-adapter

我在耳朵文件中包含了rar,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配置為使用其他名稱。

我找不到有關如何在TomEE中配置RA的大量信息。 我碰到的唯一一件事就是該文檔: http : //tomee.apache.org/changing-jms-implementations.html

但是它似乎在細節上有些不足,因此我對下一步的工作有些迷茫。

我非常感謝大家的幫助。 我覺得我已經很接近要開始工作了!

我認為您在混淆經紀人和客戶。 我已經將ActiveMQ與AMQP一起使用,但這是一個連接到ActiveMQ代理的AMQP客戶端。 您正在嘗試使用ActiveMQ JCA資源適配器,該適配器旨在使ActiveMQ代理使用OpenWire協議,以使用AMQP連接到Azure Service Bus。 這是行不通的,而且從未設計過。

您需要使用可以說AMQP的JCA資源適配器(即不是ActiveMQ JCA RA)。 也許看看這個通用的JMS JCA資源適配器 它被設計用於JBoss AS或Wildfly,但不應有任何其他限制,除非它在TomEE中使用。 然后,您可以將Qpid JMS作為客戶端插入其中。 您可以在此處看到另一個組件的示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM