我想创建一个用JMS评估消息传递的设置。目标环境将是一个正常的Payara,但要有一个简单的设置,我想测试的东西与Payara微(捆绑jar)。这样,我想要创建一个可以轻松移植的设置。使用JNDI查找,这方面的代码应该没有问题。而且,编码部分也不是很难。我想用这个设置测试的东西:-使用者使用消息驱动的beans生产者访问管理队列(因为我想测试如何启用蓝色/绿色部署)
使用经典ActiveMQ的rar,一切都相当简单。我设置了一个启动后命令the来部署和配置资源适配器,内容如下:
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微部署和配置rar在部署我的应用程序war文件之前。然后,可以使用以下配置编写消息驱动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客户端的代码,后者与经典的ConnectionFactory rar中的ActiveMQ类发生冲突。由于我对使用ActiveMQ Artemis的经典ActiveMQs有不好的感觉,所以我尝试切换到artemis。不幸的是,找到关于如何用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/myQueueJNDI-属性是试图从示例中模仿jndi.properties的内容。好的一点是,Payara微公司在创业时说:
2020-03-26T20:51:58.812+0100 INFO org.apache.activemq.artemis.ra timeMillis: 1585252318812 AMQ151007:资源适配器启动
坏消息是,这样做的结果是:
2020-03-26T20:51:58.843+0100 fish.payara.boot.runtime.BootCommand timeMillis: 1585252318843启动命令创建连接器连接池PlainTextActionReporterFAILUREInvalid连接定义失败。没有找到连接定义为javax.jms.ConnectionFactory的连接器模块。
和:
2020-03-26T20:51:58.850+0100 fish.payara.boot.runtime.BootCommand timeMillis: 1585252318850引导命令创建-连接器-资源失败PlainTextActionReporterFAILUREAttribute值(池名称= jms/myConnectionPool)在连接器连接池列表中找不到。
和:
2020-03-26T20:51:58.856+0100 fish.payara.boot.runtime.BootCommand timeMillis: 1585252318856引导命令创建-管理对象失败的PlainTextActionReporterFAILUREResource适配器-rar-2.11.0不包含任何管理对象的资源类型。请指定另一个res-适配器。
因此,它无法注册连接工厂和队列。因此,应用程序稍后在查找资源时抛出异常。
我必须承认,我对JMS和资源适配器/JCA缺乏经验。这件事让我很沮丧,因为我已经为这件事烧了好几天了。所以,这方面的任何帮助都是受欢迎的。
发布于 2020-04-06 09:38:38
现在回答我自己的问题。我觉得我花了很长时间才弄明白这件事,但我终于让它起作用了。因此,使用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似乎没有提供任何管理对象。这样,您就不能通过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用户来说,有一个用于artemis的JCA体系结构,但是却没有说明如何设置/配置它。甚至连到maven上的rar文件的链接都没有(它有一个奇怪的goup-id btw)。当然,Artemis也有很多例子,但据我所见,没有一个例子显示如何设置rar。相反,它们是使用client设置的,但我怀疑这种方法是否适用于MDB。首先,是一个rar-示例,它显示了配置属性,但没有显示它们的值(至少,对于ConnectorClassName属性不是这样)。然后,人们只能查看github上的源代码,并尝试转换其他应用程序服务器使用的其他用户的配置。如果我的方法有什么问题,请告诉我,但是用经典的ActiveMQ设置起来要简单得多。
https://stackoverflow.com/questions/60875308
复制相似问题