Jms 如何使用Payara(Micro)设置ActiveMQ Artemis

Jms 如何使用Payara(Micro)设置ActiveMQ Artemis,jms,activemq-artemis,payara,payara-micro,Jms,Activemq Artemis,Payara,Payara Micro,我想创建一个设置来评估JMS的消息传递。目标环境将是一个普通的Payara,但要有一个简单的设置,我想用Payara Micro(捆绑jar)进行测试。这样,我想创建一个可以轻松移植的设置。使用JNDI查找,代码在这方面应该没有问题。另外,编码部分也不是很难。我想使用此设置测试的内容: -使用消息驱动bean的消费者 -制作人 -访问管理队列(因为我想测试如何启用蓝色/绿色部署) 使用经典ActiveMQ的rar,事情就比较容易了。我设置了一个post-boot-commands.txt,用以下

我想创建一个设置来评估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可以在部署我的应用程序war文件之前部署和配置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 {
   ...
}
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
由于制作人很简单,我将跳过这一部分。在我开始使用管理队列之前,一切都很顺利。下面是代理附带的管理示例(它使用一些不推荐使用的代码:(),我遇到了冲突,因为解决方案使用了来自artemis客户端的代码,然后与经典ActiveMQ rar中的ConnectionFactory类发生冲突。由于我对将经典ActiveMQs rar与ActiveMQ artemis一起使用感觉不好,我尝试切换到artemis rar。不幸的是,找到了有关如何配置资源的信息佩特和帕亚拉的意思是地球上的地狱

通过查看ActiveMQResourceAdapter类的源代码,我了解了以下配置:

@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 {
   ...
}
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属性试图模仿示例中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:158525318812][levelValue:800]AMQ151007:资源适配器已启动

坏消息是它接着会继续:

[2020-03-26T20:51:58.843+0100][[WARNUNG][[fish.payara.boot.runtime.BootCommand][tid:_ThreadID=1 _ThreadName=main][timeMillis:158525318843][levelValue:900]启动命令创建连接器连接池失败PlainTextActionReporterFailure连接定义无效。找不到连接定义为javax.jms.ConnectionFactory的连接器模块

以及:

[2020-03-26T20:51:58.850+0100][[WARNUNG][[fish.payara.boot.runtime.BootCommand][tid:_ThreadID=1 _ThreadName=main][timeMillis:158525318850][levelValue:900]启动命令创建连接器资源失败的明文操作报告故障属性值(池名=jms/myConnectionPool)在连接器连接池列表中找不到

以及:

[2020-03-26T20:51:58.856+0100][[WARNUNG][[fish.payara.boot.runtime.BootCommand][tid:_ThreadID=1 _ThreadName=main][timeMillis:158525318856][levelValue:900]启动命令创建管理对象失败PlainTextActionReporterFAILUREResource适配器artemis-rar-2.11.0不包含管理对象的任何资源类型。请指定另一个res适配器

因此,它无法注册连接工厂和队列。因此,应用程序在以后查找资源时会抛出异常


我必须承认,我对JMS和资源适配器/JCA没有经验。这让我很沮丧,因为我已经为此耗费了好几天的时间。因此,欢迎在这方面提供任何帮助。

现在回答我自己的问题。我觉得我花了很多时间才弄明白这一点,但我终于让它工作起来了。因此,使用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 my的开发人员偶然发现了这一点。尽管文档解释了Java EE用户有一个针对Artemis的JCA体系结构,但却没有解释如何设置/配置它。maven上甚至没有指向rar文件的链接(顺便说一句,它有一个奇怪的goup id)当然,Artemis提供了很多示例,但从我所看到的来看,没有任何示例显示如何设置rar。相反,它们是使用客户端jar设置的,但我怀疑这种方法是否适用于MDB。首先,rar示例显示了配置属性,但没有显示它们的值(至少,不适用于ConnectorClassName属性)。然后,您只能查看github上的源代码,并尝试转换其他用户用于其他应用程序服务器的配置。如果我的方法有问题,请告诉我,但使用经典ActiveMQ进行设置要简单得多