2013-06-27 50 views
10

Tôi mới đến JMS. Theo tôi hiểu Consumers có khả năng chọn tin nhắn từ hàng đợi/chủ đề. Vậy tại sao bạn cần một số MessageListenerConsumers sẽ biết khi nào họ đã nhận tin nhắn? Việc sử dụng thực tế của MessageListener là gì?Sự khác biệt giữa MessageListener và Người tiêu dùng trong JMS là gì?

Edit: Từ Javadoc of MessageListener:

Một MessageListener đối tượng được sử dụng để nhận được đồng bộ giao tin nhắn.

Mỗi phiên phải đảm bảo rằng phiên này chuyển các thư một cách thẳng thắn cho người nghe . Điều này có nghĩa là người nghe được chỉ định cho một hoặc nhiều người tiêu dùng của cùng một phiên có thể giả định rằng phương thức onMessage không được gọi là với thông báo tiếp theo cho đến khi phiên kết thúc cuộc gọi cuối cùng.

Vì vậy, tôi đang bối rối giữa việc sử dụng các điều khoản không đồng bộserially với nhau. Hai thuật ngữ này liên quan như thế nào trong mô tả tính năng của MessageListener?

Trả lời

17

Sự khác biệt là MessageConsumer được sử dụng để nhận tin nhắn đồng bộ:

MessageConsumer mc = s.createConsumer(queue); 
Message msg = mc.receive(); 

Đối với giao không đồng bộ, chúng ta có thể đăng ký một đối tượng MessageListener với một người tiêu dùng thông điệp:

mc.setMessageListener(new MessageListener() { 
    public void onMessage(Message msg) { 
     ... 
    } 
}); 
+0

Vui lòng xem chỉnh sửa. – Geek

+0

@Evgeniy \t Trong chế độ AUTO_ACKNOWLEDGEMENT (không giao dịch) Nếu xảy ra lỗi khi thực hiện phương thức receive() [synchronous] hoặc phương thức onMessage() [aysnc], thông báo sẽ tự động được gửi lại? Liên kết: http://stackoverflow.com/questions/18712399/auto-acknowledgement-modenon-transactional-receive-vs-onmessage –

9

từ docs:

Đối đồng bộ nhận, một khách hàng có thể yêu cầu được thông báo tiếp theo từ một người tiêu dùng thông điệp sử dụng một trong các phương pháp nhận nó.

Đối với không đồng bộ giao hàng, khách hàng có thể đăng ký Đối tượng tin nhắn đối tượng với người tiêu dùng tin nhắn.

+0

+1 Dành cho liên kết. – Santosh

2

Một sự khác biệt lớn theo kiến ​​thức của tôi không được nêu trong các câu trả lời khác là MessageConsumer có thể sử dụng MessageSelectors và do đó có khả năng tiêu thụ các thông điệp mà nó quan tâm, ở đâu như MessageListener sẽ nghe tất cả tin nhắn.

Từ J2EE hướng dẫn doc http://docs.oracle.com/javaee/5/tutorial/doc/bnceh.html

JMS tin nhắn Selectors
Nếu ứng dụng nhắn tin của bạn cần phải lọc các thông điệp mà nó nhận được, bạn có thể sử dụng một JMS selector nhắn API, cho phép một người tiêu dùng thông điệp tới chỉ định các thông điệp mà nó quan tâm. Bộ chọn tin nhắn gán công việc lọc thư cho nhà cung cấp JMS thay vì cho ứng dụng.