2008-10-07 13 views
72

Trong sự hiểu biết của tôi về Servlet, Servlet sẽ được instantiated bởi Container, phương thức init() của nó sẽ được gọi một lần, và servlet sẽ sống như một singleton cho đến khi JVM tắt.Tại sao HttpServlet triển khai Serializable?

Tôi không mong đợi servlet của mình được tuần tự hóa, vì nó sẽ được xây dựng mới khi máy chủ ứng dụng khôi phục hoặc khởi động bình thường. Servlet sẽ không chứa các thành viên cụ thể của phiên làm việc, do đó, nó không có ý nghĩa cho nó được ghi vào đĩa và được tái khởi tạo. Có sử dụng thực tế cho việc này không?

Mối quan tâm của tôi là, tôi đặt một số trường không thể tuần tự hóa trong đó và sau đó ứng dụng của tôi sẽ thất bại một cách bí ẩn trong môi trường sản xuất, nơi một bản sao phiên khác sẽ diễn ra.

+0

Tương tự: [Mục đích serialization trong ứng dụng web] (https://stackoverflow.com/q/1746550/642706) –

Trả lời

56

Về mặt kỹ thuật, tôi tin rằng thùng chứa servlet được phép "thụ động" đối tượng servlet vào đĩa, theo cách tương tự như các hạt phiên EJB có thể. Vì vậy, bạn chính xác đặt câu hỏi nếu ứng dụng của bạn không thành công do các trường không thể tuần tự hóa.

Trong thực tế, tôi chưa bao giờ nghe nói về một container làm điều này, vì vậy nó thực sự chỉ là hành lý cũ từ những ngày cũ tồi tệ của J2EE sớm. Tôi không lo lắng về điều đó.

+1

Nhưng ai cần passivate một servlet, khi nó được an toàn thread và không có trạng thái trò chuyện ? –

+1

Để làm cho các máy chủ cụm không bị lỗi và phiên bản đồ trong trường hợp o thất bại, lỗi tương tự sẽ xác minh nó, https://issues.apache.org/bugzilla/show_bug.cgi?id=30809 – dev

+2

@dev lỗi là về các thuộc tính session không thể tuần tự hóa, KHÔNG phải về bất kỳ serialization nào của servlet. –

1

Google dường như đề xuất rằng điều này đã được thực hiện để tác giả thùng chứa có thể có tùy chọn, nếu họ muốn.

Bạn đúng là servlet không nên giữ thành viên cụ thể theo phiên, trên thực tế tôi nghĩ bạn sẽ muốn trạng thái ít nhất có thể. Nếu bạn lưu trữ mọi thứ trong một trong hai phiên hoặc ServletConfig, tôi nghĩ bạn có thể tồn tại tuần tự hóa.

+2

Cũng phiên có nhiều khả năng được tuần tự hóa hơn so với servlet, do đó, lưu trữ nó ở đó sẽ không giảm thiểu vấn đề. – skaffman

+1

@matt b: mối quan tâm không phải là quá nhiều trạng thái phiên cụ thể như phụ thuộc của servlet (ví dụ: các đối tượng lớp dịch vụ) –

0

Cũng giống như các đối tượng Session được tuần tự hóa để tồn tại cache cho những servletcontainer này cho tùy chọn cluster, có thể có một tùy chọn cho một container để chuyển một cá thể Servlet cũng như một nút cluster khác? Tôi chỉ đoán ở đây

10

HttpServlet nên được tuần tự hóa thành đĩa và tiếp tục khởi động lại vùng chứa servlet. Ví dụ tomcat cho phép bạn thiết lập cờ cho phép loại tồn tại. Tùy chọn tiếp theo là chuyển bằng JNDI. Đây không phải là rác, nó chỉ được sử dụng trong các trường hợp sử dụng cực đoan.

+0

JNDI là cách đúng để thiết lập các trường không nối tiếp được? Nó thật khủng khiếp. :( – Trejkaz

-3

Serializable được sử dụng làm giao diện điểm đánh dấu cho thuộc tính của phiên trong môi trường phân phối.

SRV.7.7.2 Distributed môi trường (JSR-154)

Trong một ứng dụng đánh dấu là chia, tất cả các yêu cầu mà là một phần của phiên phải được xử lý bởi một Java Virtual Máy (“JVM”) tại một thời điểm. Container phải có khả năng xử lý tất cả các đối tượng được đặt vào các cá thể của lớp HttpSession bằng cách sử dụng các phương thức setAttribute hoặc putValue một cách thích hợp. Những hạn chế sau đây được áp đặt để đáp ứng các điều kiện:

  • Container phải chấp nhận các đối tượng thực hiện các giao diện Serializable.
  • Di chuyển phiên sẽ được xử lý bởi các cơ sở cụ thể theo vùng chứa.

container servlet phân phối phải ném một IllegalArgumentException cho các đối tượng nơi container không có thể hỗ trợ các cơ chế cần thiết cho việc di chuyển của phiên lưu trữ họ.

Vùng chứa servlet được phân phối phải hỗ trợ cơ chế cần thiết cho đối tượng di chuyển triển khai Serial.

(...)

Nhà cung cấp container có thể đảm bảo khả năng mở rộng và chất lượng dịch vụ các tính năng như cân bằng tải và chuyển đổi dự phòng bởi có khả năng di chuyển một đối tượng session, và nội dung của nó, từ bất kỳ hoạt động nút của hệ thống phân phối đến một nút khác của hệ thống. Nếu phân phối container tồn tại hoặc di chuyển phiên để cung cấp chất lượng tính năng dịch vụ, họ không bị giới hạn sử dụng cơ chế serialization mẹ đẻ JVM cho serializing HttpSessions và thuộc tính của chúng. Các nhà phát triển không được đảm bảo rằng các vùng chứa sẽ gọi các phương thức readObject và writeObject trên các thuộc tính phiên nếu chúng triển khai chúng, nhưng được đảm bảo rằng các thuộc tính của chúng sẽ được giữ nguyên.

+3

Đây là một câu trả lời gây hiểu lầm. Một cá thể servlet thường không được lưu trữ trong phiên. – BalusC