2012-05-01 29 views
6

Thông số nói rằng thùng chứa CDI loại bỏ SFSB khi bối cảnh của phạm vi sắp bị hủy. Làm thế nào để loại bỏ chính xác EJB? Nó dường như không gọi phương thức được chú thích bằng @Remove.CDI loại bỏ session đậu trạng thái như thế nào?

@Stateful 
public class CustomerDAOImpl implements CustomerDAO { 
    @PreDestroy 
    public void onDestroy() { 
     //This is getting called as expected 
    } 
    @Remove 
    public void deleteMyBean() { 
     //This is not getting called! 
    } 
} 

Vì vậy, CDI về mặt kỹ thuật đang làm những gì thông số nói. Câu hỏi đặt ra là làm thế nào nó quản lý để yêu cầu các container EJB để loại bỏ các trường hợp? Cảm ơn.

Trả lời

2

Khi giao ước nói điều này được thực hiện bằng cách sử dụng API EJB triển khai cụ thể, đó không phải là một phần của API chuẩn EJB.

Khi giao ước cho biết, gọi @Remove là KHÔNG đúng cách để tiếp tục. Các phương thức @Remove được gọi bằng mã người dùng và cho biết vùng chứa EJB để xóa EJB. Nếu bạn muốn gọi lại khi EJB bị xóa, hãy sử dụng @PreDestroy.

-1

Phương thức có chú thích @Remove phải được khách hàng gọi một cách rõ ràng, khi đó vùng chứa sẽ gọi phương thức được chú thích là @PreDestroy, nếu nó tồn tại. Sau đó, cá thể bean sẽ sẵn sàng cho việc thu gom rác.

Đây là phương pháp vòng đời duy nhất mà khách hàng có thể kiểm soát, tất cả các phương pháp khác được kiểm soát bởi vùng chứa.

+0

Vâng, đó là hành vi bình thường. Nhưng thùng chứa CDI loại bỏ EJB như thế nào? Có phải nó đang sử dụng một số loại API không có giấy tờ để yêu cầu thùng chứa EJB thực hiện việc loại bỏ không? – RajV

+0

@RajV Tôi không thể định vị nó trong đặc điểm kỹ thuật, nhưng bạn có thể tìm thấy thông tin hữu ích trong hướng dẫn Java EE, trong 'Vòng đời của một phiên Stateful Session Bean' tại http://docs.oracle.com/javaee/5 /tutorial/doc/bnbmt.html –

+0

@downvoter Chăm sóc để giải thích cho -1 –

3

Tôi nghĩ rằng thùng chứa CDI cần một móc vào thùng chứa EJB để yêu cầu nó "làm những gì bạn sẽ làm nếu một phương pháp @Remove vừa hoàn thành". Nhìn vào EJB spec, EJB 2.1 đã có một cơ chế cho điều này trong các giao diện bạn phải mở rộng.

Vì lý do rõ ràng, vùng chứa gọi phương thức chú thích @Remove tùy ý cho tác dụng phụ là khá đáng ngại.

+0

+1, nhưng như là một nit, container sở hữu việc thực hiện EJBObject (trong đó có .remove, mà về cơ bản là những gì CDI muốn sử dụng), nhưng đậu thực hiện SessionBean. –

+0

Đây không phải là câu trả lời mà là đầu cơ. Nếu thực sự có một móc như vậy, nó sẽ được đánh giá cao nhà cung cấp cụ thể. Làm thế nào có thể thực hiện như Weld làm điều đó một cách chung chung. – RajV

+0

Câu hỏi đặt ra không phải là mối quan hệ của mối hàn. Hàn đặc biệt yêu cầu container để cung cấp tất cả các loại triển khai các giao diện, bao gồm cả SessionObjectReference # remove – covener

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