大規模なアプリケーションを実行しているTomcatサーバーがあります。この例に似た2つのクラスがあります。
public abstract class ClassA {
private static final Logger LOGGER = Logger.getLogger(ClassA.class);
// ...
public File methodA(ICancellable cancel) {
URL request = new URL("an URL");
LOGGER.debug("Calling ClassB.methodB(type)");
File f = classB.methodB(request, "type", cancel);
LOGGER.debug("The call to ClassB.methodB(type)"
+ " returned the File==" + f);
// ...
}
}
public class ClassB {
private static final Logger LOGGER = Logger.getLogger(ClassB.class);
// ...
public static synchronized File methodB(URL url, String type,
ICancellable cancel)
{
final String thisMethodsName = "ClassB.methodB(url: " + url
+ ", type:" + type + ", cancel: " + cancel + ")";
LOGGER.debug("Entering method: " + thisMethodsName);
// ...
return f;
}
}
ログファイルで確認できるように、アプリケーションは正常に動作し、ClassA.methodA()
最初はに正常に呼び出します。ClassB.methodB()
[...]
14/02/2013 12:34:56 DEBUG ClassA:123 - Calling ClassB.methodB(type)
14/02/2013 12:34:56 DEBUG ClassB:456 - Entering method: ClassB.methodB(url: anURL, type: type, cancel: @1234);
[...]
14/02/2013 12:34:56 DEBUG ClassA:125 - The call to ClassB.methodB(type) returned the File=="aFile".
[...]
私の問題は、サーバーがしばらく動作した後、呼び出しを停止することClassB.methodB()
です。アプリケーションがハングし、これをログに書き込むだけです。
[...]
14/02/2013 12:34:56 DEBUG ClassA:123 - Calling ClassB.methodB(type)
これがログファイルの最後の行です。ClassB.methodB()
実際には呼び出されません。
開かれたリソースが閉じられていないことが原因である可能性があると思われましたが、それを行ったすべてのコードを見つけようとしています。それを修正した後も、それは発生します。
これを引き起こしているのは何ですか?どうすれば原因を探し続けることができますか?
JVMバージョン:1.6.0_13 Tomcatバージョン:6.0.18