客户端测试jndi远程连接出现的异常:Root exception is java.rmi.ConnectIOException解决!

本文介绍了一种常见的WebLogic环境下使用JRMP连接时出现的CommunicationException问题及其解决方案。通过调整classpath中weblogic.jar的位置至最前,有效解决了连接异常的情况。

Exception in thread "main" javax.naming.CommunicationException [Root exception is java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is:
java.io.EOFException]
at weblogic.jrmp.Context.lookup(Context.java:189)
at weblogic.jrmp.Context.lookup(Context.java:195)
at javax.naming.InitialContext.lookup(InitialContext.java:351)
at secondEjb3Client.main(secondEjb3Client.java:21)
Caused by: java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is:
java.io.EOFException
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:274)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:306)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at weblogic.jrmp.Context.lookup(Context.java:185)
... 3 more
Caused by: java.io.EOFException
at java.io.DataInputStream.readByte(DataInputStream.java:243)

 

看到网上很多人提出这个问题,就说是把weblogic.jar放在最前面可以解决,我是在eclipse里面配置的!也不太了解他们说的这个最前面是什么意思,自己稍微详细一点记录:

最前面就是指放在classpath的最前面,其实只要保证在所有关联的WebLogic提供的jar包的最前面就可以了!而我是在eclipse里面自己创建了一个User library(这里面包含了WebLogic中所有的jar包,modules里面的和server/lib里面的),我就把weblogic.jar调整到
User library的最开始的位置(就是最上面),再来测试,bingo!

测试代码如下:(我是用WebLogic建立的远端jndi,所以要使用WebLogic的jars)

package common;

import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class MyJNDITest {
 /***   J N D I   ***/

//这里的链接必须是"t3://ip:port"格式,针对WebLogic使用
 private static final String DEFAULT_WLS_URL = "t3://10.193.10.136:7001";
 private static final String DEFAULT_JNDI_FACTORY =
  "weblogic.jndi.WLInitialContextFactory";
 private static final String DEFAULT_USERNAME = "admin";//远端jndi服务器的用户名(不是电脑的,是WebLogic的)
 private static final String DEFAULT_PASSWORD = "12345678";//这是对应的密码

//下面这个东西在tomcat里面用的好好的,但是在WebLogic里面不能用,看看WebLogic的jndi树就明白了
 private static final String CATALOG_HOME = "java:comp/env";
 private static final String DATASOURCE   = "jdbc/myjndi";
 private static DataSource pool;
 public static void main(String...s){
  Context ctx = null;
  try {
//   env = (Context) new InitialContext().lookup("java:comp/env");
   ctx = (Context)(getWebLogicJNDIContext());
   pool = (DataSource)ctx.lookup(DATASOURCE);
   System.out.println(pool);//打印出来看看是不是这个对象
   if(pool==null)
    System.err.println("'DBPool' is an unknown DataSource");
  } catch(NamingException ne) {
   ne.printStackTrace();
  }
 }
 public static Context getWebLogicJNDIContext(){
  Context ctx = null;
  Hashtable ht = new Hashtable();
  ht.put(Context.INITIAL_CONTEXT_FACTORY, DEFAULT_JNDI_FACTORY);
  ht.put(Context.PROVIDER_URL, DEFAULT_WLS_URL);
  ht.put(Context.SECURITY_PRINCIPAL, DEFAULT_USERNAME);
  ht.put(Context.SECURITY_CREDENTIALS, DEFAULT_PASSWORD);
  try {
   ctx = new InitialContext(ht);
  }catch (NamingException e) {
   System.out.println(e);
  }
  return ctx;
 }
}

 

### 可能的原因分析 Application Server连接失败并抛出`java.io.IOException`异常通常是由网络通信问题引起的。具体来说,这种错误可能涉及以下几个方面: - **RMI Stub获取失败**:当客户端尝试通过远程方法调用(RMI)访问服务端时,如果无法正确建立连接,则会引发`javax.naming.CommunicationException`和嵌套的`java.rmi.ConnectIOException`。 - **Socket连接重置**:底层TCP/IP协议中的socket被意外关闭或中断可能导致`java.net.SocketException: Connection reset`。 这些问题是由于IDE配置差异、防火墙设置不当或者JNDI/LDAP路径不匹配等原因造成的[^1]。 --- ### 配置检查与解决方案 #### 1. 检查Tomcat运行环境 确保Tomcat服务器已正确定义在IntelliJ IDEA中,并验证其版本是否兼容当前项目需求。可以通过以下方式确认: - 打开项目的Run/Debug Configurations窗口; - 确认所选的应用程序服务器指向正确的Tomcat实例位置; - 如果存在多个模块,请保证主类入口点无误[^2]。 #### 2. 调整IDEA插件参数 有时默认生成的服务地址不符合实际部署情况,需手动指定主机名及端口号。例如,在pom.xml文件里加入如下片段来覆盖原有属性值(适用于Maven构建工具场景下): ```xml <properties> <cargo.hostname>localhost</cargo.hostname> <cargo.port>8080</cargo.port> </properties> ``` 对于Gradle用户而言,相似逻辑可通过build.gradle脚本实现[^3]: ```groovy tasks.withType(TomcatRunWar).configureEach { httpPort = 8080 } ``` 上述更改有助于避免因监听IP冲突而产生的connection refused现象。 #### 3. 排除网络安全策略干扰 企业内部环境中常见的安全措施可能会阻碍正常的数据交换过程。建议临时禁用本地机器上的杀毒软件实时防护功能;另外还需审查操作系统的内置防火墙规则集是否存在针对特定范围内的入站请求拦截行为。 #### 4. 修改注册表绑定机制 部分情况下,默认采用的Sun Microsystems提供的标准实现未必适合所有操作系统平台特性。可以考虑切换到第三方库比如Apache Geronimo gbean-rmi-naming组件作为替代品之一: ```bash mvn dependency:add -DgroupId=org.apache.geronimo.specs \ -DartifactId=geronimo-jms_1.1_spec \ -Dversion=1.1.1 ``` 完成依赖项引入之后重新执行打包命令即可应用新改动效果。 #### 5. 日志级别调整辅助诊断 为了更清晰地了解整个握手阶段到底哪里出了差错,适当提升日志记录详尽程度往往很有帮助。编辑logback.xml或者其他形式的日志框架配置文档,将目标包设为DEBUG模式以便捕获更多细节信息供后续排查使用. --- ### 总结说明 综上所述,解决此类跨进程间通讯障碍的关键在于逐一排除潜在隐患因素直至恢复正常运作状态为止。以上列举了几种常见处理手段及其对应原理阐述,希望能对你有所帮助!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值