2011-12-15 21 views
5

Nếu tôi có yêu cầu hạt CDI được nhúng vào @MessageDriven EJB sử dụng JMS, như dưới đây, tôi có thể giả định rằng bất kỳ trường hợp nào Foo chỉ được sử dụng bởi một lần gọi onMessage. ?@RequestSố CDI được nhúng vào hạt @MessageDriven

Nói cách khác, trong ví dụ dưới đây, tôi có thể sử dụng một cách an toàn biến thành viên trong đối tượng Foo để lưu trữ trạng thái trên các trình con, tương tự với một bean được quản lý JSF @RequestScoped?

Lưu ý rằng nó là ok nếu cùng một đối tượng Foo được tái chế theo tuần tự từ một onMessage cuộc gọi đến tiếp theo, miễn là mỗi MessageDrivenBean dụ có Foo dụ riêng của mình mà xử lý hai yêu cầu đồng thời sẽ bị cô lập.

@MessageDriven 
public class MessageDrivenBean implements MessageListener { 
    @Inject 
    private Foo foo; 

    public void onMessage(Message m) { 
     foo.doSomething(); 
    } 
} 

@Named 
@RequestScoped 
public class Foo { 
    private String property; 
    public void doSomething() { 
     property = ...; 
    } 
} 

Trả lời

10

WRT phạm vi/bối cảnh Yêu cầu, thông số CDI trong phần 6.7.1 nói rằng nó sẽ hoạt động đối với một thông điệp điều khiển bean thực hiện MessageListener. Nó cũng bị phá hủy sau khi gửi tin nhắn, vì vậy bạn sẽ có một phiên bản mới cho mỗi tin nhắn được gửi. Hơn nữa, phần 6.7.3 nói rằng ngữ cảnh ứng dụng cũng đang hoạt động (như là một trong những mong đợi). Phạm vi cuộc hội thoại và phiên không hoạt động.

+0

Tuyệt vời. Đó là chính xác những gì tôi đã hy vọng, và tôi xác nhận bằng cách đặt một truy cập thể hiện trên đối tượng tiêm. (Lúc đầu không thực hiện điều này và hóa ra tôi đã nhập chú thích '@ RequestScoped' từ javax.faces thay vì javax.enterprise đúng). – wrschneider

1

Tôi tự hỏi điều này có hiệu quả hay không. Bạn định sử dụng loại giao thức nào với MDB?

MDB gần như luôn được gọi không đồng bộ (ví dụ: thông qua JMS), vì vậy không có khái niệm về bất kỳ yêu cầu hoạt động nào khi onMessage() đang được gọi. Thông thường, MDB cũng được yêu cầu triển khai giao diện phù hợp với giao thức mà chúng đang nghe (ví dụ: đối với JMS, MDB cần triển khai javax.jms.MessageListener).

+0

vâng tôi đang sử dụng JMS. Làm rõ trong ví dụ trên. Trong bối cảnh này, bởi "phạm vi yêu cầu", tôi thực sự cố gắng nói "không singleton" - nói cách khác, một 'Foo' mới được tiêm vào mỗi cá thể MDB sao cho hai trình xử lý đồng thời' onMessage' không va chạm. – wrschneider

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