我想创建一个设置来评估JMS的消息传递。目标环境将是一个普通的Payara,但要有一个简单的设置,我想用Payara Micro(捆绑罐子)来测试一下。通过这种方式,我想创建一个可以轻松移植的设置。使用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类发生了冲突。由于我在使用经典的ActiveMQsrar和ActiveMQArtemis时有一种不好的感觉,我尝试切换到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属性试图模仿示例中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:15852522318812][levelValue:800]AMQ151007:资源适配器启动
坏消息是,它继续使用:
[2020-03-26T20:51:58.843+0100][][WARNUNG][][fish.payara.boot.runtime.BootCommand][tid:_ThreadID=1ThreadName=main][timeMillis:158552231843][levelValue:900]启动命令创建连接器连接池失败PlainTextActionReporterFAILURE连接定义无效。未找到具有连接定义javax.jms.ConnectionFactory的连接器模块。
和:
[2020-03-26T20:51:58.850+0100][][WARNUNG][][fish.payara.boot.runtime.BootCommand][tid:_ThreadID=1ThreadName=main][timeMillis:1585522318850][levelValue:900]启动命令创建连接器资源失败PlainTextActionReporterFAILUREAttribute值(池名称=jms/myConnectionPool)在连接器连接池列表中找不到。
和:
[2020-03-26T20:51:58.856+0100][][WARNUNG][][fish.payara.boot.runtime.BootCommand][tid:_ThreadID=1ThreadName=main][timeMillis:158552231856][levelValue:900]启动命令创建管理对象失败PlainTextActionReporterFAILUREResource适配器arteis-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
正如您所看到的,没有针对管理对象的配置。原因是,artemisrar似乎没有提供任何管理对象。这样,您就不能通过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 {
...
}
但是,有一个问题:您无法访问管理队列来控制代理。尽管您可以创建会话和目的地,但消息需要属于某个类。但是,所配置的连接工厂不会返回必要的类,从而导致运行时出现异常。因此,需要寻找其他方法来访问管理部分。
说了这么多,我想和大家分享一些建设性的批评,因为阿尔忒弥斯的开发者们偶然发现了这一点。尽管文档解释说,对于Java EE用户来说,artemis有一个JCA体系结构,但没有解释如何设置/配置它。甚至没有到maven上rar文件的链接(它有一个奇怪的goup-id-btw)。当然,阿尔忒弥斯有很多例子,但据我所见,没有一个例子表明如何设置rar。相反,它们是使用客户端jar来设置的,但我怀疑这种方法是否适用于MDB。首先,rar示例显示了配置属性,但没有显示它们的值(至少,没有显示ConnectorClassName属性)。然后,您只能查看github上的源代码,并尝试转换其他用户用于其他应用程序服务器的配置。如果我的方法有什么问题,请告诉我,但使用经典的ActiveMQ设置起来要简单得多。