2011-02-11 39 views
14

Tôi đang gặp sự cố với thiết lập sau:Cách giới hạn số lượng các cá thể MDB đang nghe một hàng Jboss JMS

Ứng dụng Java gửi email đến hàng đợi JMS, sau đó một MDB lắng nghe hàng đợi nhận được thông báo bằng email với phương thức onMessage, nó mở một kết nối trên Gmail SMTP, gửi email đến SMTP và đóng kết nối. Làm điều này trên tất cả các tin nhắn trong hàng đợi JMS.

Nó hoạt động tốt khi tôi có tối đa 5 thư trong hàng đợi cùng một lúc. Tất cả các tin nhắn được chọn trong cùng một thời điểm bởi 5 trường hợp khác nhau của MDB, vì vậy tôi có 5 kết nối đồng thời với máy chủ SMTP của Gmail. Nhưng khi có nhiều thông báo hơn trong hàng đợi JMS, tôi gặp lỗi kết nối từ máy chủ SMTP của Gmail. 5 thư đầu tiên được gửi chính xác, nhưng không phải là phần còn lại của nhóm, vì vậy các thư khác bị mất vì chúng không còn trong hàng đợi nữa.

Vì vậy, câu hỏi của tôi là, có thể giới hạn số lượng cá thể MDB sẽ lắng nghe hàng đợi JMS không? Nếu tôi có tối đa 5 MDB, thì ngay cả khi tôi có 1000 thư trong hàng đợi, nó sẽ mất nhiều thời gian hơn để trống hàng đợi, nhưng ít nhất tôi sẽ không mất bất kỳ thư nào.

Bất kỳ đề xuất nào khác để giải quyết vấn đề này sẽ được đánh giá rất nhiều.

Dưới đây là phiên bản Jboss:

[Server] Phát hành ID: JBoss [Trinity] 4.2.3.GA (xây dựng: SVNTag = JBoss_4_2_3_GA date = 200807181417)

và cấu hình của MDB như sau:

@MessageDriven(activationConfig = { 
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
    @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/emailQueue") 
}) 

Bạn có cần thêm không?

Cảm ơn

EDIT 2011/02/14
Có lẽ tôi là tất cả các sai muốn hạn chế số lượng MDB dụ. Tôi đã thấy một cấu hình về số lượng các chủ đề JMS. Nếu tôi giới hạn số lượng chuỗi sẽ đăng lên MDB, có thể nó sẽ giải quyết vấn đề của tôi? JMS sẽ đợi cho đến khi MDB có sẵn trước khi gửi lại tin nhắn? Có tác dụng phụ nào không? Mặc dù của bạn xin vui lòng. Cảm ơn
END EDIT

+0

Phiên bản JBoss nào? Cấu hình MDB của bạn trông như thế nào? – skaffman

+0

@skaffman: Phiên bản Jboss là: [Server] ID phát hành: JBoss [Trinity] 4.2.3.GA (phiên bản: SVNTag = JBoss_4_2_3_GA date = 200807181417) và cấu hình của MDB như sau: @MessageDriven ( activationConfig = { @ActivationConfigProperty ( propertyName = "destinationType", propertyValue = "javax.jms.Queue" ), @ActivationConfigProperty ( propertyName = "điểm đến", propertyValue = "hàng đợi/emailQueue") } ) Bạn có cần nhiều hơn? Cảm ơn – Alain

+0

Thêm thông tin cho câu hỏi, đó là không thể đọc được khi đăng tải như – skaffman

Trả lời

14

Thử tài sản acitivation cấu hình bổ sung:

@ActivationConfigProperty(propertyName = "maxSession", propertyValue = "someNumber") 

nơi someNumber là số lượng tối đa trường hợp bạn muốn.

+0

Tôi nghĩ rằng nó nên được maxSessions thay vì maxSession.Tôi đã thử cả hai với giá trị của 1 và gửi nhiều hơn một cùng một lúc tại cùng một thời điểm –

+3

@LoJuego Tất cả các thuộc tính cấu hình kích hoạt được hỗ trợ được liệt kê trong hướng dẫn này: http: //docs.jboss.or g/ejb3/docs/tutorial/mdb/mdb.html. maxSession là tên thuộc tính chính xác. –

+0

Tôi có thể áp dụng thuộc tính tương tự trên WebLogic không? –

0

Nếu JBoss 4 có tùy chọn giới hạn các phiên bản của bean phiên không trạng thái, một tùy chọn có thể là chuyển mã xử lý tin nhắn sang bean này và chuyển các tin nhắn JMS đến đó. (IIRC bất kỳ lỗi nào trong bean cũng sẽ khiến cho thông báo JMS không được thông báo để nó sẽ tự động thử lại).

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