从EJB客户端连接到远程JMS服务器时查找失败:javax.naming.CommunicationException-不一致

问题描述

我们有一个旧的struts应用程序,我们做了很少的改动

  1. 将其升级为使用JDK11
  2. 将其移动到适用于不同环境的AWS-> DEV和Test(通过rancher eks)

此应用程序通过远程连接到端口4447上的jmsdevserver和jmstestserver(jboss服务器),与中央JMS服务器进行通信

当我们升级到JDK11时,由于JDK中的更改以及某些字段的访问方式,JMS失败。因此,我将jboss-eap-client的pom版本升级为使用最新版本, EAP6.2.1的7.3.1.GA,并根据我在升级后得到的错误添加了其他必需的依赖项。

因此,我对JMS的最后一个pom具有以下实体:

                <dependency>            
                  <groupId>org.jboss.bom</groupId>
                  <artifactId>jboss-eap-client</artifactId>
                  <version>7.3.1.GA</version>           
                  <scope>compile</scope>
                  <type>pom</type>      
                </dependency> 
                <dependency>
                  <groupId>javax.jms</groupId>
                  <artifactId>javax.jms-api</artifactId>            
                  <version>2.0.1</version>
                </dependency>       <!--
     https://mvnrepository.com/artifact/org.jboss.netty/netty -->
                <dependency>            
                  <groupId>org.jboss.netty</groupId>
                  <artifactId>netty</artifactId>            
                  <version>3.2.9.Final</version>
                </dependency> 
          <dependency>  
                  <groupId>org.wildfly</groupId>
                  <artifactId>wildfly-jms-client-bom</artifactId> 
                  <version>10.0.0.Final</version>           
                   <type>pom</type>         
                 </dependency>
            <dependency>            
                <groupId>org.hornetq</groupId>
                <artifactId>hornetq-core-client</artifactId>
                <version>2.4.7.Final</version>      
          </dependency>         <!--
     https://mvnrepository.com/artifact/org.hornetq/hornetq-jms-client -->
            <dependency>            
              <groupId>org.hornetq</groupId>
              <artifactId>hornetq-jms-client</artifactId>
              <version>2.4.7.Final</version>        
           </dependency>

在上述依赖关系中,远程服务器位于jboss上,仅使用wildfly-jms-client-bom来缓解错误

JMS Publisher类中的代码如下:

用于设置初始上下文:

Hashtable<String,String> env = new Hashtable<String,String>();
        {
            env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jboss.naming.remote.client.InitialContextFactory");
            env.put(Context.PROVIDER_URL,JMS_PROVIDER_URL);
            env.put(Context.Security_PRINCIPAL,PRINCIPAL);
            env.put(Context.Security_CREDENTIALS,"cred");
            env.put(Context.Security_AUTHENTICATION,"simple");
            env.put(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming");
            env.put("org.jboss.ejb.client.scoped.context","true");
            env.put("jboss.naming.client.connect.timeout","45000");
        }

用于发布消息:

logger.info("publishMessage : " +"Starting publishing message");
            ctx = new InitialContext(env);
            tcf = (TopicConnectionFactory) ctx.lookup("cn=" + JMS_DOMAIN + ".CommonTopicConnectionFactory");
            // t = (Topic) ctx.lookup("cn=DEV.NOTIFY.ORDER.STATUS.");
            t = (Topic) ctx.lookup("cn=" + JMS_LOOKUP);
            tc = tcf.createtopicConnection(JMS_USER,JMS_PWD);
            tc.setClientID("JMS");
            logger.info("publishMessage : " + "Created Connection to topic");
            ts = tc.createtopicSession(false,Session.AUTO_ACKNowLEDGE);
            logger.info("publishMessage : " + "Created Session");
            tp = (Topicpublisher) ts.createPublisher(t);
            logger.info("publishMessage : " + "Created Publisher");
            tm = ts.createTextMessage(message);
            tm.setStringProperty("CLIENTID","JMS");
            tm.setStringProperty("OrderStateCd","EXECUTE");
            tp.publish(tm);
            logger.info("publishMessage : " + "Published message,id = [ " + tm.getJMSMessageID() + "]");
        

在本地计算机上尝试此代码时,不会出现任何问题。它连接到JMS服务器(在同一网络中),并发布消息。 但是,当从AWS尝试同样的方法时,我会得到不一致的行为。有时,JMS发布会失败,并出现以下来自测试服务器的错误跟踪->

publishMessage:查找失败:javax.naming.CommunicationException: 无法连接到任何服务器。服务器尝试: [remote://jmsdev-1.abc.com:4447(操作失败,状态为WAITING 45000 MILLISECONDS之后),远程://jmsdevenv2.abc.com:4447(操作 在45000 MILLISECONDS之后失败,状态为WAITING)] [根异常 是java.net.ConnectException:操作失败,状态为WAITING 45000 MILLISECONDS之后] javax.naming.CommunicationException: 无法连接到任何服务器。服务器尝试: [remote://jmsdev-1.abc.com:4447(操作失败,状态为WAITING 45000 MILLISECONDS之后),远程://jmsdevenv2.abc.com:4447(操作 在45000 MILLISECONDS之后失败,状态为WAITING)] [根异常 是java.net.ConnectException:操作失败,状态为WAITING 45000 MILLISECONDS之后] org.jboss.naming.remote.client.HaRemoteNamingStore.failoverSequence(HaRemoteNamingStore.java:240) 在 org.jboss.naming.remote.client.HaRemoteNamingStore.namingStore(HaRemoteNamingStore.java:149) 在 org.jboss.naming.remote.client.HaRemoteNamingStore.namingOperation(HaRemoteNamingStore.java:130) ......原因:java.net.ConnectException:操作因 状态在45000 MILLISECONDS之后等待 org.jboss.naming.remote.protocol.IoFutureHelper.get(IoFutureHelper.java:97) ...... javax.naming.NamingException:发行交易:publishMessage: NamingException javax.naming.CommunicationException:连接失败 到任何服务器。服务器尝试: [remote://jmsdevenv1.abc.com:4447(操作失败,状态为WAITING 45000 MILLISECONDS之后),远程://jmsdevenv2.abc.com:4447(操作 在45000 MILLISECONDS之后失败,状态为WAITING)] [根异常 是java.net.ConnectException:操作失败,状态为WAITING 在45000 MILLISECONDS之后]

尽管它可以在前一天从同一服务器发布消息。此外,如果我尝试从AWS Dev环境并行发布消息以测试JMS服务器,那还是可以的。 目前,测试服务器还可以发布到dev JMS服务器。我不知道什么时候这种行为会改变-有时dev服务器无法发布到具有上述相同异常的dev jms。下图清楚地表明了我打算在这里说的话。

enter image description here

我长期困扰这个问题,请帮忙。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)