2010-04-07 24 views
12

Tôi đang sử dụng Spring 2.5 với lớp tùy chỉnh của mình triển khai MessageListener. Nếu một JmsException được ném vào phương thức onMessage() của tôi, điều gì sẽ xảy ra với trạng thái của hàng đợi?Điều gì xảy ra trên hàng đợi JMS khi onMessage() ném một JMSException?

Thư có được coi là "được phân phối" bởi hàng đợi vào thời điểm onMessage được gọi không? Hoặc không JmsException kích hoạt một số loại rollback và tin nhắn được nhập lại vào hàng đợi?

Cảm ơn trước!

Trả lời

13

Từ JMS 1.1 spec ...

4.5.2 Asynchronous Delivery

Một khách hàng có thể đăng ký một đối tượng mà thực hiện giao diện JMS MessageListener với một MessageConsumer. Khi thư đến cho người tiêu dùng, nhà cung cấp phân phối chúng bằng cách gọi phương thức onMessage của người nghe.

Người nghe có thể ném một RuntimeException; tuy nhiên, đây được coi là lỗi lập trình ứng dụng khách. Những người lắng nghe được xử lý tốt nên nắm bắt những ngoại lệ như vậy và cố gắng chuyển hướng các thông điệp khiến chúng trở thành một dạng đích 'thông điệp không xử lý được' dành riêng cho ứng dụng.

Kết quả của người nghe ném một RuntimeException phụ thuộc vào chế độ xác nhận của phiên.

  • AUTO_ACKNOWLEDGE hoặc DUPS_OK_ACKNOWLEDGE - thông điệp sẽ được redelivered ngay lập tức. Số số lần nhà cung cấp JMS sẽ gửi lại tin nhắn tương tự trước khi từ bỏ phụ thuộc vào nhà cung cấp. Trường tiêu đề tin nhắn JMSRedelivered sẽ được đặt cho một thư được phân phối lại trong những trường hợp này.
  • CLIENT_ACKNOWLEDGE - thông báo tiếp theo cho người nghe được phân phối. Nếu một khách hàng muốn có tin nhắn chưa được giải quyết trước đó được phân phối lại, , ứng dụng đó phải khôi phục phiên theo cách thủ công.
  • Phiên giao dịch - thông báo tiếp theo cho người nghe được phân phối. Khách hàng có thể cam kết hoặc quay lại phiên (nói cách khác, một RuntimeException không tự động quay lại phiên).

Nhà cung cấp JMS nên gắn cờ khách hàng với người nghe tin nhắn đang ném RuntimeExceptions có thể bị trục trặc.

+0

điều gì sẽ xảy ra nếu ngoại lệ không được giải quyết xảy ra bên trong onMessage và phương thức này không bao giờ trả về? Có khả năng tin nhắn đó không bị xóa khỏi hàng đợi không? Điều đó có nghĩa là (đối với một máy khách đồng bộ) onMessage phải trả về một sự thừa nhận sao cho thông điệp đó có thể được xóa khỏi hàng đợi? – bluelurker

+0

@bluelurker - Tôi đang bối rối bởi câu hỏi của bạn. Ngôn ngữ spec là về việc cho phép một RuntimeException truyền bá từ phương thức onMessage(). Nếu phương pháp của bạn hoàn thành bằng cách ném một ngoại lệ, đó là một thay thế cho trở lại "bình thường". Vì vậy, tôi không hiểu phần "không bao giờ trả về". Thay vì quay trở lại, nó hoàn thành bằng cách có một ngoại lệ lan truyền ra ngoài. –

+0

@JohnM Từ phương thức onMessage() nếu tôi ném RunTimeException thì thông báo đó sẽ vẫn còn trong hàng đợi và được gửi lại. Một lần nữa tin nhắn sẽ được ném. Nó sẽ được gửi lại. Và vân vân .... sự hiểu biết của tôi có đúng không?Đây là những gì tôi thấy xảy ra trong thử nghiệm của tôi. –

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