解决:
先采用Google和百度,搜索了很多帖子,但回答的很少。有的说是内存太少,有的说是64位,这些都是不太有力的解决方案,也无法解决问题。只好看源代码:
在ServerThread.processInvocation(SocketWrapper socketWrapper)方法中有这样一段:
InputStream inputStream = socketWrapper.getInputStream();
if(performVersioning){
version = readVersion(inputStream);
if(version == -1)
throw new EOFException();
}
这里就是扔出EOFException的元凶,当readVersion(inputStream) 返回-1的时候,就认为运行环境不对了。
再看ServerThread.readVersion(InputStream inputStream)在做些啥子动作:
private int readVersion(InputStream inputStream) throws IOException{
if(trace)
log.trace("blocking to read version from input stream");
int version = inputStream.read();
if(trace)
log.trace("read version " + version + " from input stream");
return version;
}
这里仅仅是一个简单的读操作,也就是从InputStream里面读不到流。而InputStream是从SocketWrapper 中直接通过SocketWrapper.getInputStream()来获取的。那这SocketWrapper又是如何创建的呢?
在ServerThread.doRun()代码里面有如下动作:
socketWrapper = createServerSocketWrapper(socket, timeout, invoker.getLocator().getParameters());
ServerThread.createServerSocketWrapper(Socket socket, int timeout, Map metadata)代码段:
if(serverSocketClass == null)
serverSocketClass = ClassLoaderUtility.loadClass(serverSocketClassName, getClass());
try{
serverSocketConstructor = serverSocketClass.getConstructor(new Class[] {
java.net.Socket.class, java.util.Map.class, java.lang.Integer.class
});
}catch(NoSuchMethodException e){
serverSocketConstructor = serverSocketClass.getConstructor(new Class[] {
java.net.Socket.class
});
}
ServerSocketWrapper的这两个构造方法都定义在父类ClientSocketWrapper中:
public ClientSocketWrapper(Socket socket) throws IOException{
super(socket);
createStreams(socket, null);
}
public ClientSocketWrapper(Socket socket, Map metadata, Integer timeout) throws Exception{
super(socket, timeout);
createStreams(socket, metadata);
}
这个InputStream就是从createStreams所创建的。
ClientSocketWrapper.createStreams(Socket socket, Map metadata)方法中代码段:
private InputStream in;
in = createInputStream(serializationType, socket, unmarshaller);
继续往下看ClientSocketWrapper.createInputStream(String serializationType, Socket socket, UnMarshaller unmarshaller):
InputStream is = socket.getInputStream();
if(unmarshaller instanceof PreferredStreamUnMarshaller){
PreferredStreamUnMarshaller psum = (PreferredStreamUnMarshaller)unmarshaller;
is = psum.getMarshallingStream(is);
}
return is;
到这里大家应该都明白了这InputStream是如何创建的了,那么为啥这InputStream.read()返回-1呢, 这就 要 研究这个一直出现在代码中的Socket了,Socket是在ServerThread的构造方法中传递过来的, 实际上这个Socket就是JBoss到tomcat的一个连接。那么既然Socket初始化能成功,说明连接没有问题, 就只能从Socket返回的流上面来查找问题。那是否是Tomcat宕机了,从Socket无法返回流,而Socket连接却是正常的。打开Tomcat的 logs,确实,Tomcat宕机了,再对比Tomcat宕机时间和JBoss出现Exception的时间,前后一致,原来如此。只要Tomcat不宕机,JBoss就不会出这个Exception。
相关推荐
通过这种结合使用的方式,不仅可以大大提高系统的并发处理能力,还能有效降低单点故障的风险,确保业务连续性。 ### 总结 本文详细介绍了JBoss负载均衡与MySQL主从备份的相关技术细节,包括实现原理、配置步骤及...
本指南适用于公司负责所有建设项目的系统试运行、正式运行和软件质保阶段,以及公司负责的所有维护项目的合同期。 本指南涵盖了对软件系统资料整理、日常运维工作(巡检)和系统故障处置等方面的要求。同时,指南也...
1. 更换下载时间:避开网络高峰期,或者在服务器所在地区的工作时间内尝试下载。 2. 使用镜像站点:许多国家和地区都有Apache软件基金会的镜像站点,这些站点通常提供更快的下载速度。你可以查找离你更近的镜像站点...
JAVA是一种面向对象的编程语言,以其“一次编写,到处运行”的特性广受青睐。它拥有丰富的类库和强大的内存管理机制,使得开发复杂的网络应用如网上选课系统成为可能。JAVA的多线程支持和安全性设计也是其在网络应用...
- **稳定性与容灾**:通过冗余设计和故障转移策略,保障系统稳定运行。 - **成本控制与自动化**:通过自动化运维和资源优化,降低运营成本。 - **数据迁移到MySQL**:回归开源数据库,优化成本结构。 ### 需求与...