Tôi đang lập kế hoạch sử dụng EJBContext
để chuyển một số thuộc tính xung quanh từ tầng ứng dụng (cụ thể, một bean điều khiển tin nhắn) đến cuộc gọi lại vòng đời kiên trì không thể trực tiếp được đưa vào hoặc truyền tham số (trình nghe phiên trong EclipseLink, gọi lại vòng đời thực thể, v.v. .), và gọi lại đó là nhận được EJBContext
qua JNDI.Sử dụng EJBCtext getContextData - điều này có an toàn không?
Điều này có vẻ hoạt động nhưng có bất kỳ dấu hiệu bị ẩn nào, như độ an toàn của chủ đề hoặc tuổi thọ đối tượng mà tôi đang thiếu không? (Giả sử giá trị tài sản được thông qua là bất di bất dịch như String hay Long.)
mẫu đậu đang
@MessageDriven
public class MDB implements MessageListener {
private @Resource MessageDrivenContext context;
public void onMessage(Message m) {
context.getContextData().put("property", "value");
}
}
Sau đó gọi lại mà tiêu thụ các EJBContext
public void callback() {
InitialContext ic = new InitialContext();
EJBContext context = (EJBContext) ic.lookup("java:comp/EJBContext");
String value = (String) context.getContextData().get("property");
}
Những gì tôi đang tự hỏi là, tôi có thể chắc chắn rằng nội dung bản đồ contextData
chỉ hiển thị với lời gọi/chuỗi hiện tại không? Nói cách khác, nếu hai luồng đang chạy đồng thời phương thức callback
và cả hai đều tra cứu một số EJBContext
từ JNDI, chúng thực sự nhận được nội dung bản đồ khác nhau contextData
?
Và, làm thế nào để thực sự làm việc - là EJBContext
trả về từ tra cứu JNDI thực sự là một đối tượng bao quanh một cấu trúc giống như ThreadLocal
cuối cùng?
Đề xuất tốt. Mẫu tôi đang sử dụng cho 'EJBContext' gần như giống hệt nhau - tiêm' @ Resource' ở một nơi, đặt các đối tượng vào bản đồ, và sau đó tìm kiếm trong JNDI ở một nơi khác. Vì vậy, câu hỏi đặt ra là liệu đối tượng 'EJBContext' cũng không độc lập như' TransactionSynchronizationRegistry' – wrschneider
TransactionSynchronizationRegistry có một giới hạn: nó luôn cần giao dịch, nhưng trong một số trường hợp là cần thiết để truyền thông tin mà không cần giao dịch – obe6