2016-11-19 6 views
-1

同じ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) 

感謝。

答えて

1

の代わりにこの:

synchronized (obj) { 
    try { 
     System.out.println("waiting for obj to be initalized"); 
     wait(); 
    } 

あなたはこれを意味するのですか?

synchronized (obj) { 
    try { 
     System.out.println("waiting for obj to be initalized"); 
     obj.wait(); 
    } 
+0

待っているとwebapp2を、すべて –

+0

うーんで起動していない上に維持のwebapp1私はその後、)(obj.waitを試してみました。その場合、2つのWebアプリケーションがStaticObjectの同じインスタンス上で動作していないと思われます。 http://stackoverflow.com/questions/17721263/singleton-across-jvm-or-application-instance-or-tomcat-instance/17721573#17721573 が該当する場合があります。 –

関連する問題