2013-03-14 31 views
5

Tôi có 2 ứng dụng web chạy ở hai ngữ cảnh: c1, c2 (cả hai ngay sau gốc). Tôi đặt một startupListener trong c1 để chia sẻ một biến, và một cái khác trong c2 để lấy nó.đối tượng chia sẻ giữa các ứng dụng web của cùng một tomcat

startuplistener của tôi trong c1 là:

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); 
      } 

    } 

Trong ứng dụng c2, nó là như thế này:

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

     } 

Bối cảnh trong startupListener của c2 luôn là null, tôi đã cố gắng '/ c1 ',' c1 '. Tôi đang thiếu gì? (Tôi đang sử dụng tomcat6, nếu điều đó quan trọng) Cảm ơn

+0

của nó giá trị lấy đó là null và không phải là bối cảnh tôi đoán? –

+0

không, ngữ cảnh là null, kích hoạt NPE dòng tiếp theo. –

Trả lời

2

Bạn cần phải thiết lập crossContext = thật. Từ các tài liệu tomcat:

Set true nếu bạn muốn cuộc gọi trong ứng dụng này để ServletContext.getContext() để trở thành một điều phối yêu cầu cho các ứng dụng web khác chạy trên máy chủ ảo này. Đặt thành false (mặc định) trong môi trường bảo mật có ý thức, để làm cho getContext() luôn trả về giá trị rỗng.

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

+0

Đồng thời xem câu hỏi này http://stackoverflow.com/questions/661978/what-does-the-crosscontext-attribute-do-in-tomcat-does-it-enable-session-sharin – brad

+0

hey Brad, tôi đã thiết lập crossContext đúng trong ứng dụng c1. –

+0

nếu nó hữu ích để s/o khác: câu trả lời của Brad là chính xác, nhưng lưu ý crossContext = true được đặt trong config/context.xml của thư mục tomcat của bạn. –

-1

Một tùy chọn khác là sử dụng tuần tự hóa. Tuần tự hóa dữ liệu trong một ứng dụng và đọc cùng một dữ liệu trong một ứng dụng khác.

+0

câu hỏi của OP về 2 ứng dụng web trong cùng một JVM, vì vậy việc tuần tự hóa không cần thiết – brad

0

Sự cố:

Có sự không khớp trong khởi tạo ứng dụng có thể là app2 được khởi tạo trước app1.

Có một tiềm năng "workaround": Nếu bạn thực sự có hai (hoặc nhiều hơn) các ứng dụng phụ thuộc vào nhau, bạn có thể quyết định để bắt đầu nhiều dịch vụ trong bạn 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

Xin chào, tôi có thể xác nhận rằng c2 luôn bắt đầu sau c1, tôi bắt đầu theo cách thủ công theo thứ tự. –

Các vấn đề liên quan