2013-03-14 24 views
5

İki bağlamda çalışan 2 webapps var: c1, c2 (her ikisi de kökten hemen sonra). Bir değişkeni paylaşmak için c1'e bir startupListener koydum ve onu almak için bir tane daha c2'ye koydum.aynı tomcat arasındaki webapps arasındaki paylaşılan nesneler

c1 Benim startuplistener geçerli:

c2 uygulamasında
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); 
      } 

    } 

, bu şu şekildedir:

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

     } 
c2'nin startupListener bağlam hep null

, ben 'denedim/c1 ',' c1 '. Neyi kaçırıyorum? (Tomcat6 kullanıyorum, önemliyse) Teşekkürler

+0

Onun null alınan değer değil sanırım bağlamda? –

+0

no, bağlam null, sonraki satır NPE'yi tetikler. –

cevap

2

crossContext = birden hizmetlerini başlatmak karar verebilir doğru. erkek kedi Dokümanlar: true

Set Eğer ServletContext.getContext bu uygulama içinde aramaları isterseniz() başarıyla bu sanal ana bilgisayarda çalışan diğer web uygulamaları için bir istek memuru dönmek için. Güvenlik bilinçli ortamlarda false (varsayılan) olarak ayarlamak için getContext() her zaman null değerini döndürür.

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

+0

Ayrıca bu soruya bakın http://stackoverflow.com/questions/661978/what-does-the-crosscontext-attribute-do-in-tomcat-does-it-enable-session-sharin – brad

+0

hey Brad, CrossContext'i ayarladık c1 uygulamasında true. –

+0

eğer başka bir şey yapmıyorsa: Brad'in cevabı doğrudur, fakat crossContext = true, tomcat klasörünüzün config/context.xml dosyasında belirtilmiştir. –

-1

Bir seçenek daha serileştirme kullanıyor. Verileri bir uygulamada dizileyin ve diğerinde de okuyun.

+0

OP'nin aynı JVM'de 2 webapps sorması, bu yüzden serileştirme gereksizdir – brad

0

Sorun:

Uyg1 önce Uyg2 başlatıldı edilebilir uygulama başlatma uyumsuzluk var.

potansiyel bir "geçici çözüm" vardır: aslında birbirlerine bağlı uygulamaları iki (veya daha fazla) varsa, siz server.xml: Sen ayarlamanız gerekir

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

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

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

Merhaba, c2'den sonra c1'in her zaman başlatıldığını teyit edebilirim, bunları sırasıyla manuel olarak başlattım. –