2012-01-30 27 views
6

Các chương trình sau đây:Khi nào cá thể do máy chủ tạo ra?

public class SimpleCounter extends HttpServlet { 

    int counter=0; 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     response.setContentType("text/plain"); 
     PrintWriter writer = response.getWriter(); 
     counter++; 
     writer.println("accessed " + counter + " times"); 
    } 
} 

in giá trị tăng lên của truy cập mỗi khi tôi truy cập vào url của servlet này. Tôi đọc rằng máy chủ tạo ra một cá thể của servlet này và bất cứ khi nào có một yêu cầu cho servlet này, một luồng mới sẽ ánh xạ yêu cầu này tới cá thể đặc biệt được tạo ra bởi máy chủ.

Khi nào cá thể được tạo bởi máy chủ (thread nào ánh xạ yêu cầu) chết? Khi nào các chủ đề được tạo ra bởi một yêu cầu mới chết?

+1

Đây có phải là liên quan đến vùng chứa cụ thể không? Một số, như Google App Engine, tích cực đòi lại các ứng dụng chưa nhận được yêu cầu trong một khoảng thời gian. –

+0

@ Mike Samuel không thực sự. Nhưng có thể được đưa vào câu trả lời/thảo luận –

+0

Liên quan: http://stackoverflow.com/questions/3106452/how-do-servlets-work-instantiation-session-variables-and-multithreading – BalusC

Trả lời

4

Ví dụ servlet được tạo khi webapp của bạn khởi động hoặc khi nó được yêu cầu đầu tiên (nếu thiết lập lazy-init). Nó được xử lý khi webapp của bạn dừng lại, khi nó được GC. Trong một môi trường sản xuất bình thường, tôi dám khẳng định điều này không bao giờ thực sự xảy ra (không tính đến việc triển khai một phiên bản mới).

Hầu hết (nếu không phải tất cả) các thùng chứa servlet hoạt động với một nhóm luồng. Điều này có nghĩa là họ sử dụng lại các luồng để xử lý các yêu cầu. Cho nên những chủ đề này không bao giờ chết; họ trở lại hồ bơi khi họ hoàn thành việc thực hiện yêu cầu.

Dĩ nhiên, họ chết khi bạn tắt máy chủ :)

Từ quan điểm từ ứng dụng của bạn, bạn thực sự nên cố gắng làm cho servlet của bạn không quốc tịch, và bạn có thể an toàn cho rằng mỗi yêu cầu được thực hiện trong chủ đề riêng của nó.

+0

_ "bạn thực sự nên cố gắng thực hiện servlet của bạn không quốc tịch "_ bạn có thể giải thích điều này? –

+0

Có nghĩa là bạn không nên giữ bất kỳ trạng thái đơn đăng ký nào trong đó. Bằng cách đó bạn không phải quan tâm khi nó được tạo ra hoặc bị phá hủy. Lý tưởng nhất, bạn thậm chí không nên quan tâm bao nhiêu là instantiated (đó là hữu ích trong một môi trường clustered). –

+0

@SuhailGupta, nói một cách đơn giản, không sử dụng bất kỳ biến tĩnh nào trong Servlets. – kosa

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