我想创建一个设置来评估使用 JMS 的消息传递。目标环境将是一个普通的 Payara,但要进行简单的设置,我想用 Payara Micro(捆绑的 jar)进行测试。这样,我想创建一个可以轻松移植的设置。使用 JNDI 查找,这方面的代码应该没有问题。此外,编码部分并不难。我想用这个设置测试的东西: - 使用消息驱动 bean 的消费者 - 生产者 - 访问管理队列(因为我想测试如何启用蓝/绿部署)
使用经典 ActiveMQ 的 rar,事情变得非常简单。我设置了一个 post-boot-commands.txt 来部署和配置资源适配器,内容如下:
create-resource-adapter-config --property ServerUrl='tcp://localhost:61616':UserName='admin':Password='admin' activemq-rar-5.15.11
create-connector-connection-pool --raname activemq-rar-5.15.11 --connectiondefinition javax.jms.ConnectionFactory --ping true --isconnectvalidatereq true jms/myConnectionPool
create-connector-resource --poolname jms/myConnectionPool jms/myConnectionFactory
create-admin-object --raname activemq-rar-5.15.11 --restype javax.jms.Queue --property PhysicalName=Q1 jms/myQueue
这让 Payara Micro 在部署我的应用程序战争文件之前部署和配置 rar。然后可以使用以下配置编写消息驱动 bean:
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destination", propertyValue = "Q1"),
@ActivationConfigProperty(propertyName = "resourceAdapter", propertyValue = "activemq-rar-5.15.11"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class MyMDB implements MessageListener {
...
}
由于制作人很简单,我将在此处跳过该部分。在我开始使用管理队列之前,一切都很顺利。按照代理附带的管理示例(它使用了一些不推荐使用的代码:(),我遇到了冲突,因为解决方案使用了来自 artemis 客户端的代码,然后与经典 ActiveMQ rar 中的 ConnectionFactory 类发生冲突。因为我有一种不好的感觉使用经典的 ActiveMQs rar 和 ActiveMQ Artemis,我尝试切换到 artemis rar。不幸的是,找到有关如何使用 Payara 配置资源适配器的信息,原来是人间地狱。
通过查看 ActiveMQResourceAdapter 类的来源,我发现了以下配置:
deploy --type rar /home/tools/artemis-rar-2.11.0.rar
create-resource-adapter-config --property connectionParameters='host=localhost;port=61616':JndiParams='java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory;connectionFactory.ConnectionFactory=tcp://localhost:61616;queue.jms/myQueue=Q1':useJndi='true':entries='ConnectionFactory':userName='admin':password='admin' artemis-rar-2.11.0
create-connector-connection-pool --raname artemis-rar-2.11.0 --connectiondefinition javax.jms.ConnectionFactory --ping true --isconnectvalidatereq true jms/ConnectionFactoryPool
create-connector-resource --poolname jms/myConnectionPool jms/myConnectionFactory
create-admin-object --raname artemis-rar-2.11.0 --restype javax.jms.Queue --property PhysicalName=Q1 jms/myQueue
JNDI-properties 试图模仿示例中 jndi.properties 的内容。好的部分是,在启动 Payara Micro 时说:
[2020-03-26T20:51:58.812+0100] [] [INFO] [] [org.apache.activemq.artemis.ra] [tid: _ThreadID=48 _ThreadName=pool-18-thread-1] [timeMillis: 1585252318812] [levelValue: 800] AMQ151007:资源适配器已启动
坏消息是它会继续:
[2020-03-26T20:51:58.843+0100] [] [警告] [] [fish.payara.boot.runtime.BootCommand] [tid: _ThreadID=1 _ThreadName=main] [timeMillis: 1585252318843] [levelValue: 900 ] 引导命令 create-connector-connection-pool 失败 PlainTextActionReporterFAILURE 连接定义无效。未找到具有连接定义 javax.jms.ConnectionFactory 的连接器模块。
和:
[2020-03-26T20:51:58.850+0100] [] [警告] [] [fish.payara.boot.runtime.BootCommand] [tid: _ThreadID=1 _ThreadName=main] [timeMillis: 1585252318850] [levelValue: 900 ] 引导命令 create-connector-resource failed PlainTextActionReporterFAILUREAttribute 值 (pool-name = jms/myConnectionPool) 在连接器连接池列表中找不到。
和:
[2020-03-26T20:51:58.856+0100] [] [警告] [] [fish.payara.boot.runtime.BootCommand] [tid: _ThreadID=1 _ThreadName=main] [timeMillis: 1585252318856] [levelValue: 900 ] 引导命令 create-admin-object failed PlainTextActionReporterFAILUREResource Adapter artemis-rar-2.11.0 不包含 admin-object 的任何资源类型。请指定另一个 res-adapter。
因此,它无法注册连接工厂和队列。因此,应用程序稍后在查找资源时会引发异常。
我不得不承认我对 JMS 和资源适配器/JCA 没有经验。这很令人沮丧,因为我已经为此烧掉了好几天。因此,欢迎对此提供任何帮助。