当前位置: 首页 > 知识库问答 >
问题:

TomEE:JMS提供程序-使用AMQP Wire协议的ActiveMQ

奚才良
2023-03-14

我正在尝试配置TomEE(带有Java EE的Tomcat)以使用AMQP Wire协议连接到外部代理(Azure Service Bus)。缺省情况下,JMS提供程序似乎是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服务总线一起使用吗?

我确实从github尝试了Azure JMS快速入门:(https://github.com/Azure/azure-service-bus/tree/master/samples/Java/qpid-jms-client/JmsQueueQuickstart)这很有效,所以我相信服务总线已经启动并运行。然而,我无法在TomEE中部署JMS应用程序。任何帮助都将不胜感激。

更新:我正在使用Justin Bertram建议的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。命名。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

但它似乎有点轻的细节,所以我有点不知道下一步该怎么做。

我非常感谢大家的帮助。我觉得我很快就能把这项工作做好了!

共有1个答案

吕征
2023-03-14

我认为你把经纪人和客户弄糊涂了。我将ActiveMQ与AMQP一起使用,但它是一个连接到ActiveMQ代理的AMQP客户端。您正在尝试使用ActiveMQ JCA资源适配器,该适配器旨在将OpenWire协议与ActiveMQ代理对话,以使用AMQP连接到Azure服务总线。这是行不通的,也从来没有设计过。

您需要使用可以说AMQP的JCA资源适配器(即不是ActiveMQ JCA RA)。也许看看这个通用的JMS JCA资源适配器。它被设计用于JBoss AS或Wildfly,但不应该有任何东西阻止它在TomEE中的使用。然后,您可以将Qpid JMS作为客户端插入其中。您可以在此处看到另一个组件的html" target="_blank">示例。

 类似资料:
  • 我正在尝试使用pact来验证spring boot微服务。我已经从consumer生成了pact文件,并在provider端使用pact Broker验证了它。 我有另一个用例,在根据实际的服务响应验证pact文件之前,我需要执行一些代码。我读过关于状态改变URL和状态改变与闭包来实现它,但没有得到一个如何实现这一点的例子。有人能帮忙吗? 如果这个客户不存在,那么我将需要通过读取pact文件中的更

  • 我在不安全的T3连接上使用外部JNDI提供程序来访问本地实例上的远程WebLogic资源。现在我必须切换到安全连接(T3S),并使用带有自签名证书的双向身份验证。到目前为止,我已经尝试了以下几点: 在远程管理服务器上启用SSL侦听端口 在客户端和远程服务器上使用Java keytool生成keypair 将两台服务器配置为使用keystore/key 将自签名证书导出到对手的信任存储区(cacer

  • 通过参考Pact Repo中给出的示例,我为MessageProvider编写了示例Pact测试。下面是使用者测试,它正在为预期来自提供者的消息生成PACT json文件。 公共类Inbound_Receiving_OpenMessageTest{private byte[]receivingopenloaddetailsmessage; }

  • 我正在使用Spring Security 4.0.1,并希望使用多个身份验证提供程序使用基于Java的配置进行身份验证。如何指定提供程序顺序? 我希望使用AuthenticationManagerBuilder,因为这就是<code>WebSecurityConfigurerAdapter。configureGlobal()公开,但我看不到任何指定顺序的方法。我需要手动创建ProviderMana

  • 有可能发球吗。只使用来自节点的http模块,而不使用任何其他框架?我是否拥有一个简单web应用程序所需的所有功能? 这就是我尝试过的: 是否有一些步骤我错过了,或者我需要阅读一些东西来了解文件是如何链接的?

  • 我已经创建了身份提供程序,并且从浏览器中它工作正常。 参考:密钥斗篷身份提供程序后代理登录抛出错误 从浏览器,我可以使用外部IDP登录,如果外部IDP用户不在keycloak中,它会在keyclock中创建,这绝对没问题,并重定向到仪表板。 但我的问题是,我们如何用keycloak rest api实现这个流程? 是否有任何api用于使用外部IDP登录,并将获得外部IDP的令牌以及密钥斗篷的令牌?