我在 2 台 JBoss EAP 7.1 服务器(嵌入了 ActiveMQ Artemis(之间使用远程 JMS 通信时遇到了一些问题。 部署在第二台服务器上的 EJB MDB 尝试访问部署在第一台服务器(同一台机器,但不同端口(上的 Artemis 队列。 MDB 客户端(XA 用例(:
1(使用来自第一个服务器导出的请求队列的消息 2( 处理消息内容,包括数据库更新 3( 向同一远程服务器公开的回复队列发送响应
因此,第一个服务器导出 3 个(Artemis(队列: - TestQueueReq,用于第二个应用服务器使用的请求 - TestQueueRep,用于由第二个应用服务器发送的回复 - DLQTestQueue,用于死信队列
从第一个服务器配置中提取:
<subsystem xmlns="urn:jboss:domain:messaging-activemq:2.0">
<server name="default">
<security enabled="false"/>
<address-setting name="jms.queue.TestQueue#" dead-letter-address="jms.queue.DLQTestQueue" expiry-address="jms.queue.ExpiryQueue" redelivery-delay="500" redelivery-multiplier="2.0" max-delivery-attempts="3" max-size-bytes="10485760" page-size-bytes="2097152" message-counter-history-day-limit="10"/>
( …/…)
<jms-queue name="DLQTestQueue" entries="java:/jms/queue/DLQTestQueue"/>
<jms-queue name="TestQueueReq" entries="java:/jms/queue/TestQueueReq java:jboss/exported/jms/queue/TestQueueReq" durable="true"/>
<jms-queue name="TestQueueRep" entries="java:/jms/queue/TestQueueRep java:jboss/exported/jms/queue/TestQueueRep" durable="true"/>
<connection-factory name="RemoteConnectionFactory" entries="java:jboss/exported/jms/RemoteConnectionFactory" connectors="http-connector"/>
</server>
</subsystem>
第二台服务器的配置如 https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.1/html/configuring_messaging/resource_adapters#use_provided_amq_adapter 中所述
<subsystem xmlns="urn:jboss:domain:messaging-activemq:2.0">
<server name="default">
<security enabled="false"/>
:…/…)
<http-connector name="remote-http-connector" socket-binding="remote-server" endpoint="http-acceptor"/>
<http-acceptor name="http-acceptor" http-listener="default"/>
<pooled-connection-factory name="activemq-ra" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" connectors="in-vm" transaction="xa"/>
<pooled-connection-factory name="remote-artemis" entries="java:/jms/remoteCF" connectors="remote-http-connector"/>
</server>
</subsystem>
外部上下文绑定也根据以下官方文档在第二台服务器上配置: https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.0/html/configuration_guide/configuring_the_naming_subsystem
发送到 TestQueueReq 的消息被 MDB 正确使用。
@ResourceAdapter("remote-artemis")
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "TestQueueReq")
}, messageListenerInterface = MessageListener.class)
@ApplicationScoped
public class ExampleSFBean implements ExampleSF, MessageListener {
@Override
public void onMessage(final Message message) {
…
当我们尝试在 MDB 中向回复队列发送消息时,就会出现问题。 我在MDB中尝试了许多不同的资源注入策略:
@Inject
@JMSConnectionFactory("java:/jms/remoteCF")
private JMSContext jmsContext;
@Resource (lookup = "java:global/remoteContext")
private Context remoteContext;
@Resource (lookup="java:global/TestQueueRep")
private Queue queueRep;
但是由于注入/查找问题,我们在尝试发送响应时不断收到异常。
- jmsContext 为空,除非 MDB @ApplicationContext注释。
- queueRep 注入不起作用,因为查找失败(使用 : 无效的 URL 方案名称"null"(
- 使用 remoteContext 的手动查找失败,出现与上一个相同的以下异常:
问题Caused by: java.lang.RuntimeException: javax.naming.InvalidNameException: WFNAM00007: Invalid URL scheme name
"空" at org.jboss.as.naming.subsystem.NamingBindingAdd$LookupManagedReferenceFactory.getReference(NamingBindingAdd.java:451( at org.jboss.as.naming.subsystem.NamingBindingAdd$MutableManagedReferenceFactory.getReference(NamingBindingAdd.java:354( at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:143( ...还有 99 个 由以下原因引起:javax.naming.InvalidName异常: WFNAM00007:URL 方案名称"null"无效 at org.wildfly.naming.client.WildFlyRootContext.getProviderContext(WildFlyRootContext.java:808( at org.wildfly.naming.client.WildFlyRootContext.lookup(WildFlyRootContext.java:155( at javax.naming.InitialContext.lookup(InitialContext.java:421(
- 1:有人可以告诉我我的代码/配置出了什么问题,为什么自动注入远程回复队列不起作用?或者,至少,为什么从远程上下文手动查找不起作用?这个方案错误意味着什么...
- 问题2:如果MDB没有@ApplicationScoped注释,则不会注入JMSContext(空(。正常吗?如果是,以这种方式注释MDB有什么缺点吗?
谢谢
消息服务器上创建了一个具有来宾角色的应用程序用户,如果没有,请参阅此 https://www.youtube.com/watch?v=Ef0HFbyaHFs 就我而言,我已将用户创建为MSGTEST,密码为"Welcome1! 因此,您在其他服务器上的条目应如下所示。
创建该用户后,您需要添加池连接工厂 类似这样的东西,属性用户=">MSGTEST"密码="欢迎1!
<pooled-connection-factory name="remote-artemis" entries="java:/jms/remoteCF" connectors="remote-http-connector" transaction="xa" user="MSGTEST" password="Welcome1!" />
3.确保 MDB 中的@ResourceAdapter("remote-artemis"(来自正确的软件包导入 org.jboss.ejb3.annotation.ResourceAdapter;
由于这不起作用==>导入org.jboss.annotation.ejb.ResourceAdapter;
希望这有帮助。我在机器 1 上创建消息服务器,并在机器 2 上部署了 MDB。成功了。
忘了在这两种情况下都提到我使用了独立完整.xml因为它具有用于活动 MQ 消息的所有子系统。仅使用独立.xml是行不通的。小心!