问题描述
我们有一个旧的struts应用程序,我们做了很少的改动
- 将其升级为使用JDK11
- 将其移动到适用于不同环境的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。下图清楚地表明了我打算在这里说的话。
我长期困扰这个问题,请帮忙。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)