2013-03-14 14 views
5

Ho due webapp in esecuzione in due contesti: c1, c2 (entrambi immediatamente dopo la radice). Ho messo un startupListener in c1 per condividere una variabile, e un altro in c2 per recuperarlo.oggetti condivisi tra webapps dello stesso tomcat

mio startuplistener in C1 è:

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 App c2, è in questo modo:

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

     } 

Il contesto nel startupListener di c2 è sempre nullo, ho provato '/ c1 ',' c1 '. Cosa mi manca? (Sto usando tomcat6, se è importante) Grazie

+0

Suo il valore recuperato, che è nullo e non il contesto immagino? –

+0

no, il contesto è nullo, che attiva una NPE nella riga successiva. –

risposta

2

È necessario impostare crossContext = vero. Dalla documentazione Tomcat:

Impostare su true se si desidera che le chiamate all'interno di questa applicazione per ServletContext.getContext() per restituire con successo un dispatcher richiesta per altre applicazioni web in esecuzione su questo host virtuale. Impostato su falso (impostazione predefinita) in ambienti di sicurezza, per rendere getContext() restituisce sempre null.

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

+0

Vedi anche questa domanda http://stackoverflow.com/questions/661978/what-does-the-crosscontext-attribute-do-in-tomcat-does-it-enable-session-sharin – brad

+0

hey Brad, ho impostato crossContext true in app c1. –

+0

se è utile s/o altro: la risposta di Brad è corretta, ma si noti che crossContext = true è impostato nel config/context.xml della cartella tomcat. –

-1

Un'altra opzione è l'uso della serializzazione. Serializzare i dati in un'unica app e leggere la stessa nell'altra.

+0

l'OP chiede circa 2 webapp nella stessa JVM, quindi la serializzazione non è necessaria – brad

0

Problema:

C'è mancata corrispondenza tra l'inizializzazione app possono essere app2 viene inizializzato prima app1.

V'è un potenziale "soluzione": se hai in realta 'due (o più) le app a seconda di ogni altro, si può decidere di avviare più servizi in voi 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

Ciao, posso confermare che c2 è sempre avviato dopo c1, li ho avviati manualmente in ordine. –

Problemi correlati