JSP: Hoàn thiện Servlet

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Khi một bộ chứa servlet xác định rằng một servlet phải được gỡ bỏ khỏi dịch vụ (ví dụ, khi một container muốn lấy lại các tài nguyên bộ nhớ hoặc khi nó đang được đóng), container gọi phương thức destroy của giao diện Servlet . Trong phương pháp này, bạn giải phóng bất kỳ tài nguyên nào mà servlet đang sử dụng và lưu trữ trạng thái liên tục. Phương pháp phá hủy sau đây giải phóng đối tượng cơ sở dữ liệu được tạo ra trong phương thức init được mô tả trong Khởi tạo một Servlet :

Public void destroy () {
    BookDB = null;
}

Tất cả các phương thức dịch vụ của servlet phải được hoàn thành khi một servlet bị xóa. Máy chủ cố gắng đảm bảo điều này bằng cách gọi phương pháp phá hủy chỉ sau khi tất cả các yêu cầu dịch vụ đã trả về hoặc sau thời gian ân hạn của máy chủ cụ thể, tuỳ điều kiện nào đến trước. Nếu servlet của bạn có các hoạt động mất nhiều thời gian để chạy (có nghĩa là, các hoạt động có thể chạy lâu hơn thời gian ân huệ của máy chủ), các hoạt động vẫn có thể chạy khi hủy được gọi. Bạn phải đảm bảo rằng các chủ đề vẫn đang xử lý các yêu cầu của khách hàng hoàn chỉnh; Phần còn lại của phần này mô tả cách thực hiện như sau:

  • Theo dõi bao nhiêu luồng hiện đang chạy các phương pháp dịch vụ .

  • Cung cấp một tắt máy sạch bằng cách phá hủy phương pháp thông báo cho các chủ đề chạy lâu của việc tắt máy và chờ cho họ để hoàn thành.

  • Có các phương pháp dài hạn thăm dò ý kiến ​​theo định kỳ để kiểm tra việc tắt máy và, nếu cần thiết, ngừng làm việc, dọn dẹp và trả lại.

Theo dõi yêu cầu dịch vụ

Để theo dõi yêu cầu dịch vụ, đưa vào lớp servlet của bạn một trường đếm số phương thức dịch vụ đang chạy. Trường nên có phương pháp tiếp cận đồng bộ để tăng, giảm và trả lại giá trị của nó.

Lớp công khai ShutdownExample mở rộng HttpServlet {
    Private int serviceCounter = 0;
    ...
    // Các phương pháp truy cập dịch vụCookter
    Được bảo vệ đồng bộ void intoServiceMethod () {
        ServiceCounter ++;
    }
    Được bảo vệ đồng bộ void leaveServiceMethod () {
        dịch vụ truy cập--;
    }
    Được bảo vệ int numServices đồng bộ () {
        Dịch vụ trả lạiCounter;
    }
}

Các dịch vụ phương pháp nên tăng các dịch vụ truy cập mỗi lần phương pháp này đã được nhập và nên giảm các truy cập mỗi lần phương thức trả về. Đây là một trong số ít lần mà lớp con HttpServlet của bạn nên ghi đè lên phương thức dịch vụ . Phương pháp mới nên gọi super.service để bảo toàn các chức năng của phương thức dịch vụ ban đầu :

Bảo vệ dịch vụ void (HttpServletRequest req,
                    HttpServletResponse resp)
                    Ném ServletException, IOException {
    NhậpServiceMethod ();
    thử {
        Super.service (req, resp);
    } Cuối cùng {
        LeaveServiceMethod ();
    }
}

Thông báo các phương pháp để tắt

Để đảm bảo tắt máy sạch, phương pháp tiêu hủy của bạn không được giải phóng bất kỳ tài nguyên được chia sẻ nào cho đến khi tất cả yêu cầu dịch vụ đã hoàn thành. Một phần của việc này là để kiểm tra bộ đếm dịch vụ. Một phần khác là để thông báo cho các phương pháp chạy lâu rằng đó là thời gian để đóng cửa. Đối với thông báo này, trường khác là bắt buộc. Trường nên có các phương pháp truy cập thông thường:

Lớp công khai ShutdownExample mở rộng HttpServlet {
    Tư nhân boolean shutdownDown;
    ...
    // Phương thức truy cập cho shutdownDown
    Được bảo vệ đồng bộ void setShuttingDown (boolean flag) {
        ShuttingDown = cờ;
    }
    Được bảo vệ đồng bộ boolean isShuttingDown () {
        Đóng cửa trở lại;
    }
}

Dưới đây là một ví dụ về phương pháp phá hủy bằng cách sử dụng các trường này để cung cấp một tắt máy sạch:

Public void destroy () {
    / * Kiểm tra để xem có vẫn còn các phương pháp dịch vụ / *
    / * Chạy, và nếu có, yêu cầu họ dừng lại. * /
    If (numServices ()> 0) {
        SetShuttingDown (đúng);
    }

    / * Đợi cho các phương pháp dịch vụ dừng. * /
    Trong khi (numServices ()> 0) {
        thử {
            Thread.sleep (khoảng);
        } Catch (InterruptedException e) {
        }
    }
}

Tạo các phương pháp chạy dài lịch sự

Bước cuối cùng trong việc cung cấp tắt máy một cách sạch sẽ là làm cho bất kỳ phương pháp chạy lâu nào hoạt động lịch sự. Các phương pháp có thể chạy trong một thời gian dài nên kiểm tra giá trị của trường mà thông báo cho họ về tắt máy và nên làm gián đoạn công việc của họ, nếu cần.

Public void doPost (...) {
    ...
    Cho (i = 0; ((i <lotsOfStuffToDo) &&
         ! IsShuttingDown ()); I ++) {
        thử {
            PartOfLongRunningOperation (i);
        } Catch (InterruptedException e) {
            ...
        }
    }
}
» Tiếp: Trang JSP là gì?
« Trước: Truy cập web context và bảo trì tình trạng máy khách
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!