1

我想创建一个设置来评估使用 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 没有经验。这很令人沮丧,因为我已经为此烧掉了好几天。因此,欢迎对此提供任何帮助。

4

1 回答 1

1

现在回答我自己的问题。感觉我花了很长时间才弄清楚这一点,但我终于让它工作了。因此,asadmin 的正确配置如下:

deploy --type rar /home/tools/artemis-rar-2.11.0.rar

create-resource-adapter-config  --property ConnectorClassName='org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnectorFactory':ConnectionParameters='host=localhost;port=61616':UserName='admin':Password='admin' artemis-rar-2.11.0

create-connector-connection-pool --raname artemis-rar-2.11.0 --connectiondefinition org.apache.activemq.artemis.ra.ActiveMQRAConnectionFactory --ping true jms/ConnectionFactoryPool

create-connector-resource --poolname jms/ConnectionFactoryPool jms/myConnectionFactory

如您所见,管理对象没有配置。原因是,artemis rar 似乎没有提供任何管理对象。这样,您无法通过 jndi 查找目标(队列和主题),但需要使用目标物理名称通过 JMS 会话创建它们。现在,MDB的配置:

@MessageDriven(activationConfig = {
    @ActivationConfigProperty(propertyName = "destination", propertyValue = "Q1"),
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
    @ActivationConfigProperty(propertyName = "resourceAdapter", propertyValue = "artemis-rar-2.11.0")
})
public class MyMDB implements MessageListener {
    ...
}

但是有一个问题:您无法访问管理队列来控制代理。尽管您可以创建会话和目标,但消息必须属于某个类。但是,配置的连接工厂不会返回必要的类,从而导致运行时异常。因此,需要寻找其他方法来访问管理部分。

说了这么多之后,我想分享一些建设性的批评意见,因为我的 Artemis 的开发人员偶然发现了这一点。尽管文档解释了对于 Java EE 用户,artemis 有一个 JCA 架构,但没有说明如何设置/配置它。甚至没有指向 maven 上的 rar 文件的链接(顺便说一句,它有一个奇怪的 goup-id)。当然,Artemis 有很多示例,但据我所见,没有显示如何设置 rar。相反,它们是使用 client-jar 设置的,但我怀疑这种方法是否适用于 MDB。开始的一点是显示配置属性的 rar 示例,但没有显示它们的值(至少,不是 ConnectorClassName 属性)。那就只能看github上的源码,尝试改造其他用户用于其他应用服务器的配置。如果我的方法有问题,请告诉我,但是使用经典的 ActiveMQ 设置起来要简单得多。

于 2020-04-06T09:38:38.130 回答