带有ActiveMQ Artemis嵌入式JBoss EAP 7.1之间的远程查找失败

时间:2018-10-03 12:33:37

标签: jms jndi jboss-eap-7 activemq-artemis

我在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为null,除非为MDB注释@ApplicationContext。
  • 由于查找失败(带有:无效的URL方案名称“ null”),queueRep注入不起作用
  • 使用remoteContext进行的手动查找失败,出现以下例外:
Caused by: java.lang.RuntimeException: javax.naming.InvalidNameException: WFNAM00007: Invalid URL scheme name
     

“空”       在org.jboss.as.naming.subsystem.NamingBindingAdd $ LookupManagedReferenceFactory.getReference(NamingBindingAdd.java:451)       在org.jboss.as.naming.subsystem.NamingBindingAdd $ MutableManagedReferenceFactory.getReference(NamingBindingAdd.java:354)处       在org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:143)       ...另外99个       原因:javax.naming.InvalidNameException:WFNAM00007:无效的URL方案名称“空”       在org.wildfly.naming.client.WildFlyRootContext.getProviderContext(WildFlyRootContext.java:808)       在org.wildfly.naming.client.WildFlyRootContext.lookup(WildFlyRootContext.java:155)       在javax.naming.InitialContext.lookup(InitialContext.java:421)

  • 问题1:有人可以告诉我我的代码/配置出了什么问题,为什么自动注入远程回复队列不起作用?或者,至少,为什么从远程上下文进行手动查找不起作用?这个方案错误意味着什么……
  • 问题2:如果未注释MDB @ApplicationScoped,则不会注入JMSContext(为空)。正常吗?如果是,以这种方式注释MDB是否有任何缺点?

谢谢

1 个答案:

答案 0 :(得分:0)

  1. 您是否在消息服务器上创建了具有来宾角色的应用程序用户(如果没有,请参阅此https://www.youtube.com/watch?v=Ef0HFbyaHFs 在我的情况下,我已经使用密码“ Welcome1!”创建了一个名为MSGTEST的用户。因此您在其他服务器上的输入应如下所示。

  2. 创建该用户后,需要添加池化连接工厂 带有属性 user =“ MSGTEST” password =“ Welcome1!”

  3. 的东西
MDB中的

<pooled-connection-factory name="remote-artemis" entries="java:/jms/remoteCF" connectors="remote-http-connector" transaction="xa" user="MSGTEST" password="Welcome1!" />

<pooled-connection-factory name="remote-artemis" entries="java:/jms/remoteCF" connectors="remote-http-connector" transaction="xa" user="MSGTEST" password="Welcome1!" />

来自正确的软件包 import org.jboss.ejb3.annotation.ResourceAdapter;

因为这不起作用==>导入org.jboss.annotation.ejb.ResourceAdapter;

希望这会有所帮助。我在machine1上创建消息服务器,并在Machine2上部署了MDB。奏效了。

在两种情况下都忘记提及我使用了standalone-full.xml,因为它具有用于活动MQ消息传递的所有子系统。仅使用standalone.xml将不起作用。小心!