我正在经历一些在我们的环境中无法重现的场景。
我们的一位客户尝试连接到我们的服务器时,在该工作环境中发生随机崩溃。 我只是向您提供他们所面临问题的相关代码。
请先查看以下代码。
readSelector = Selector.open();
writeSelector = Selector.open();
final Thread reader = new Thread("transport_rx") { //frozen
@Override
public void run() {
try {
if(readSelector.isOpen()) {
transport_rx(readSelector);
}
} catch (Throwable ex) {
try {
log.log(Level.SEVERE, "transport_rx thread exception", ex); //frozen
} finally {
System.exit(3);
}
}
}
};
reader.setDaemon(true);
reader.start();
public void transport_rx(final Selector selector) throws IOException {
// Some code
synchronized (readInfos) {
if (!readInfos.isEmpty()) {
for (final ChannelInfo info : readInfos) {
final SelectionKey clientKey = info.tp.clientChannel.register(selector, SelectionKey.OP_READ);
clientKey.attach(info);
info.setSelectionKey(clientKey);
}
readInfos.clear();
}
}
// some code
}
客户抱怨由于CloseChannelException导致系统退出,这可能是由于行"info.tp.clientChannel.register(selector, SelectionKey.OP_READ);"
但是崩溃不是很频繁,但是有时会在2-3天后发生。
因此,为了解决此问题,我们提供了try-catch子句来处理此问题。
请在下面找到修改后的代码。
synchronized (readInfos) {
if (!readInfos.isEmpty()) {
for (final ChannelInfo info : readInfos) {
/*
* final SelectionKey clientKey = info.tp.clientChannel.register(selector,
* SelectionKey.OP_READ); clientKey.attach(info);
*
* info.setSelectionKey(clientKey);
*/
try {
final SelectionKey clientKey = info.tp.clientChannel.register(selector, SelectionKey.OP_READ);
clientKey.attach(info);
info.setSelectionKey(clientKey);
} catch (final ClosedChannelException cce) {
info.tp.me_transport_close();// for closing the connection and restablishing it in few mins
//log.warning("Trying to read from a closed channel"); //frozen
//log.log(Level.FINEST, "Data read from a closed channel", cce); //frozen
}
}
readInfos.clear();
}
}
此后,没有崩溃问题,但他们抱怨客户在5到6天后变得无响应。 我们尽了一切努力来理解原因,但是由于在我们的环境中它是不可复制的,因此我们无法弄清。 但是我们的资源之一声称有时会丢失连接,我们可以看到有时会出现一些捷径,例如1或2次ping无法通过FileServer。
有人可以帮助我知道这是否是没有反应的原因吗?
是否可以通过上面的代码来处理或确认它?