同じtomeeにデプロイされる2つのWebアプリケーションがあります。 webapp1は、webapp2が変更される静的オブジェクト(xと呼ぶことができます)に依存します。 Webapp1は最初から起動しますが、webapp2が起動を完了するのを待ちます。私はxに同期を使用しています。 Webapp1は、webapp1が待機するブロックxを同期させ、webapp2もwebapp2が通知するxのブロックを同期させます。2つのクラス間のオブジェクトの同期
しかし、起動中にwebapp1がjava.lang.IllegalMonitorStateExceptionをスローしています。理由は何か。
これは私が同期している私の独立したクラスです。
public class StaticObject {
private static StaticObject staticObject = new StaticObject();
private boolean initialized = false;
public boolean isInitialized() {
return initialized;
}
public void setInitialized(boolean initialized) {
this.initialized = initialized;
}
}
これは、web app1のアプリケーションリスナーです。
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("Starting webApp-1");
StaticObject obj = StaticObject.getStaticObject();
Initilize(obj);
}
private void Initilize(StaticObject obj) {
if (obj.isInitialized()) {
System.out.println("Object is initalized");
} else {
synchronized (obj) {
try {
System.out.println("waiting for obj to be initalized");
wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
System.out.println("obj is initalized after waiting");
}
}
これは私がのwebapp1の起動時にjava.lang.IllegalMonitorStateExceptionを取得しています起動中に、同じtomeeでのwebapp1とwebapp2を両方を展開した後、だから、webapp2を
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("Starting webApp-2");
StaticObject obj = StaticObject.getStaticObject();
initilizeit(obj);
}
private void initilizeit(StaticObject obj) {
obj.setInitialized(true);
synchronized (obj) {
System.out.println("BEFORE NOTIFY");
obj.notifyAll();
System.out.println("AFTER NOTIFY");
}
}
のための私のアプリケーションのリスナーです。
スタックトレース:助けを
java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:502)
at ca.app1.AppListener.Initilize(AppListener.java:38)
at ca.app1.AppListener.contextInitialized(AppListener.java:27)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4716)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5178)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:152)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1405)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1395)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
感謝。
待っているとwebapp2を、すべて –
うーんで起動していない上に維持のwebapp1私はその後、)(obj.waitを試してみました。その場合、2つのWebアプリケーションがStaticObjectの同じインスタンス上で動作していないと思われます。 http://stackoverflow.com/questions/17721263/singleton-across-jvm-or-application-instance-or-tomcat-instance/17721573#17721573 が該当する場合があります。 –