2012-05-11 23 views
6

Tôi đang sử dụng Spring JMS để kết nối với máy chủ MQ của Websphere. Tôi đã triển khai giao diện SessionAwareListener để tạo một trình lắng nghe tùy chỉnh, sử dụng lại mã cũ cho logic nghiệp vụ.Làm cách nào để hạn chế số lần một JMS DefaultMessageListenerContainer sẽ thử lại một tin nhắn?

Trong khi thử nghiệm, trình lắng nghe ném một StringIndexOutOfBoundsException, mà tôi không bắt được. Tuy nhiên, tôi thấy trong nhật ký sau đây được in khoảng 32 lần, sau đó DMLC dừng lại.

WARN - Execution of JMS message listener failed 

Có cách nào kiểm soát tần suất DMLC sẽ thử lại thư và cách xử lý ngoại lệ không bị bắt buộc không?

+0

Vì vậy, bạn sử dụng bộ điều hợp IBM MQ JCA phải không? Ứng dụng Spring của bạn được triển khai ở đâu? – DaTroop

+0

Không, chúng tôi chỉ sử dụng Websphere MQ, không phải máy chủ ứng dụng. Ứng dụng Spring là một JVM độc lập. –

Trả lời

5

Bạn luôn có thể kiểm tra JMSDeliveryCount. Nếu số tiền đó lớn hơn số bạn cho là tối đa thì chỉ không xử lý tin nhắn và trả lại.

Bạn cũng có thể configure your Websphere để di chuyển thư xấu đến đích ngoại lệ sau một số lần thử.

+0

Cảm ơn bài viết. Điều đó đã giúp xem điều gì đã xảy ra trên chương trình phụ trợ. Tôi hiện đang sử dụng các thuộc tính JMSXDeliveryCount và JMSRedelivered JMS để xử lý thông báo. –

+0

Bạn có biết điều gì trong API Spring cũng có thể giúp xử lý lỗi không? –

+0

Thật không may tôi không biết nhiều về mùa xuân bạn của tôi. – DaTroop

5

Đặt lại thư vào hàng đợi sau khi một số lỗi được gọi là sao lưu trong thế giới Websphere MQ.

Có hai lựa chọn thay thế làm thế nào để xử lý nó:

  1. Trong quản lý hàng đợi: Bạn có thể cấu hình ngưỡng backoutbackout tên requeue thuộc tính cho hàng đợi nhất định. Sau khi đạt ngưỡng truy cập, trình quản lý hàng đợi sẽ đặt thông báo đó vào hàng đợi được chỉ định bởi tên yêu cầu dự phòng thay vì phân phối lại nó. Xem WebSphere MQ queue properties để biết thêm thông tin.

  2. Trong ứng dụng của bạn: Nếu bạn sử dụng API JMS, hãy kiểm tra thuộc tính JMSXDeliveryCount bằng cách gọi msessage.getIntProperty("JMSXDeliveryCount") trước khi bạn bắt đầu xử lý thư. Nếu nó đạt đến một số treshold, xử lý các tin nhắn như errorneous.

+0

Cảm ơn bạn đã phản hồi! Trân trọng với DaTroop đã giúp giải quyết vấn đề này. –

+0

Trên 1, các thuộc tính MQ là BOTHRESH cho giới hạn thử lại và BOQNAME cho hàng đợi nơi thông báo sẽ được chuyển tiếp khi đạt đến giới hạn thử lại. –