2013-03-14 14 views
5

Mam 2 aplikacje działające w dwóch kontekstach: c1, c2 (oba zaraz po root). Wstawiłem startupListener w c1, aby udostępnić zmienną, a drugą w c2, aby ją pobrać.Udostępnione obiekty między webappami tego samego kocurka

Moja startuplistener w C1 jest:

public void contextInitialized(ServletContextEvent sce) { 
      HashMap <String,Object> database ; 
      //some code to init database 
      ServletContext context = sce.getServletContext().getContext("/c1"); 
      if (context!=null) 
      { 
       context.setAttribute("crossContext", true); 
       context.setAttribute("cache", database); 
      } 

    } 

In C2 aplikacji, to jest tak:

 public void contextInitialized(ServletContextEvent sce) { 
      ServletContext context = sce.getServletContext().getContext("/c1"); 
      HashMap<String,Object> database = (HashMap) context.getAttribute("cache"); 

     } 

Kontekst w startupListener C2 zawsze jest null, próbowałem „/ c1 ',' c1 '. czego mi brakuje? (Używam tomcat6, jeśli to ma znaczenie) Dzięki

+0

Jego wartość pobrana który jest zerowy, a nie kontekst Chyba? –

+0

nie, kontekst jest pusty, co powoduje NPE w następnej linii. –

Odpowiedz

2

Musisz ustawić crossContext = prawdziwe. Od docs tomcat:

ustawiona na wartość true, jeśli chcesz połączeń w obrębie tej aplikacji do ServletContext.getContext(), aby skutecznie zwrócić prośba dyspozytora dla innych aplikacji internetowych działających na tym wirtualnym hoście. Ustaw na wartość false (domyślnie) w środowiskach świadomych zabezpieczeń, aby getContext() zawsze zwracało wartość null.

http://tomcat.apache.org/tomcat-7.0-doc/config/context.html

+0

Zobacz także to pytanie http://stackoverflow.com/questions/661978/what-does-the-crosscontext-attribute-do-in-tomcat-does-it-enable-session-sharin – brad

+0

hej Brad, Zrobiłem crossContext to prawda w aplikacji c1. –

+0

jeśli jest to pomocne dla s/o else: Odpowiedź Brada jest poprawna, ale zauważ, że crossContext = true jest ustawione w pliku config/context.xml twojego tomcat. –

-1

Jeszcze jedna opcja to serializacja. Serializuj dane w jednej aplikacji i czytaj to samo w drugiej.

+0

OP pyta o 2 webappy w tej samej maszynie JVM, więc serializacja jest zbędna. – brad

0

Problem:

Istnieje rozbieżność w app inicjalizacji można APP2 jest zainicjowana przed APP1.

Istnieje potencjalne „obejście”: Jeśli rzeczywiście mają dwa (lub więcej) aplikacje w zależności od siebie, można zdecydować się na rozpoczęcie wielu usług w ty server.xml:

<Service name="app1"> 
    <Connector .../> 

    <Engine ...> 
    <Host appbase="app1" ...> 
     ...   
    </Host> 
    </Engine> 
</Service> 
<Service name="app2"> 
    <Connector .../> 

    <Engine ...> 
    <Host appbase="app2" ...> 
     ...   
    </Host> 
    </Engine> 
</Service> 
+0

Witam, mogę potwierdzić, że c2 jest zawsze uruchamiany po c1, ręcznie uruchomiłem je w kolejności. –

Powiązane problemy