2016-11-19 1 views
-1

Ich habe zwei Webapps, die in demselben tomee bereitgestellt werden. webapp1 hat eine Abhängigkeit von einem statischen Objekt (lasst es x nennen) welches webapp2 sich ändert. Webapp1 wird zuerst gestartet, wartet aber darauf, dass webapp2 den Startvorgang beendet hat. Ich verwende Synchronisation auf x. Webapp1 hat einen Block von x synchronisiert, in dem webapp1 wartet, und webapp2 hat auch einen synchronisierten Block von x, in dem webapp2 benachrichtigt.Synchronisation eines Objekts zwischen zwei Klassen

Beim Starten wirft webapp1 jedoch java.lang.IllegalMonitorStateException. Was könnte der Grund sein?

Dies ist meine unabhängige Klasse, die ich synchronisiere.

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; 

    } 
} 

Dies ist mein Application Listener für 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"); 
    } 
} 

Dies ist meine Anwendung Listener für 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"); 
    } 
} 

So, nachdem beide WebApp1 und webapp2 in gleicher tomee bereitstellen, beim Starten erhalte ich java.lang.IllegalMonitorStateException während WebApp1 Starts.

Stacktrace:

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) 

Vielen Dank für Hilfe.

Antwort

1

Statt dessen:

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

hat meinen Sie das?

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

ich versuchte obj.wait(), dann hielt WebApp1 auf der Brust an und webapp2 bei allen –

+0

Hmm beginnt nicht. In diesem Fall vermute ich, dass Ihre beiden Webapps nicht auf derselben Instanz von StaticObject ausgeführt werden. Dies ist: http://stackoverflow.com/questions/17721263/singleton-across-jvm-or-application-instance-or-tomcat-instance/17721573#17721573 möglicherweise relevant. –

Verwandte Themen