2013-08-29 37 views
6

Tôi đang làm việc trên một ứng dụng bao gồm một số mô-đun. Trong một trong những mô-đun đó, một người nào đó đã tạo ra một nhà sản xuất chủ đề xuất bản các tin nhắn về một chủ đề, nhưng mô-đun này không có chủ đề tiêu dùng để loại bỏ các thông điệp. Nhà sản xuất chủ đề đặt thuộc tính thời gian hoạt động thành 300000 mili giây bằng cách sử dụng setTimeToLive().Thời gian chủ đề JMS để sống

Tôi hy vọng rằng nếu không có người tiêu dùng, các tin nhắn hết hạn trong vòng 300.000 mili giây và chúng được deallocated.

Ứng dụng được triển khai trên Tomcat 6.0.36 và ứng dụng này sử dụng máy chủ ActiveMQ bên ngoài để xử lý hàng đợi và chủ đề.

Giám sát ActiveMQ với Java VisualVM trong tab MBeans trong cài đặt chủ đề Tôi thấy rằng biến "Số đếm enqueue" tăng lên, nhưng tôi không hiểu liệu cài đặt thời gian có hiệu lực trên các thư này hay không. Tôi dự kiến ​​sẽ thấy bộ đếm "ExpiredCount" để tăng, nhưng nó vẫn cố định tới 0.

Có cách nào để hiểu xem những tin nhắn đó vẫn còn trong bộ nhớ hoặc nếu chúng được deallocated?

Cảm ơn bạn rất nhiều!

EDIT:

tôi đã một số xét nghiệm sử dụng ví dụ j2ee hướng dẫn về NetBeans 7.3 sử dụng nội glassfish 3.1 như máy chủ, theo dõi nó với jvisualvm và tất cả các công trình như api nói:

Các JMS API không cung cấp cơ chế duyệt chủ đề. Tin nhắn thường biến mất khỏi chủ đề ngay khi chúng xuất hiện: nếu không có người tiêu dùng tin nhắn nào để tiêu thụ chúng, nhà cung cấp JMS sẽ xóa chúng. Mặc dù các đăng ký bền cho phép các tin nhắn duy trì trên một chủ đề> trong khi người tiêu dùng tin nhắn không hoạt động, không có cơ sở nào tồn tại để kiểm tra chúng.

Tôi đọc rằng glassfish sử dụng bên trong activeMQ vì vậy tôi hy vọng rằng điều này cũng hợp lệ cho một máy chủ ActiveMQ độc lập.

END EDIT.

+0

Chủ đề có bền không? – Beryllium

+0

Tôi làm cách nào để xem cài đặt này? –

+0

Bạn đang sử dụng 'topicSession.createSubscriber (...)' hoặc 'topicSession.createDurableSubscriber (...)'? – Beryllium

Trả lời

4

Một trích dẫn từ Creating Robust JMS Applications:

5.1.4 Cho phép tin nhắn đến Hết Hạn
[...]
Khi được thông báo là bố, các quy định timeToLive được thêm vào hiện tại hãy dành thời gian hết hạn hết hạn. Mọi thư không được gửi trước thời gian hết hạn được chỉ định sẽ bị hủy.

Một trích dẫn từ nguồn của javax.jms.Message#getJMSExpiration():

Khi thời gian hết hạn của thông điệp được đạt tới, một nhà cung cấp nên bỏ nó. [...]
Khách hàng không được nhận thư đã hết hạn; tuy nhiên, API JMS thực hiện không đảm bảo rằng điều này sẽ không xảy ra.

Vì vậy, trong trường hợp thuê bao không bền:

  1. Các máy chủ sẽ gửi thông điệp cho mỗi thuê bao được kết nối. Giá trị hết hạn trong tin nhắn được đặt thành "thời gian hiện tại + TTL". Người đăng ký bị ngắt kết nối sẽ không nhận được gì.
  2. Một khách hàng được kết nối nhận được thông báo bình thường, nếu nó chưa hết hạn.
  3. Nếu khách hàng được kết nối mất quá nhiều thời gian trước khi nhận được tin nhắn (tin nhắn hết hạn), máy chủ có thể bị máy chủ loại bỏ (có thể trong trường hợp máy chủ chưa đưa nó vào bộ đệm của khách hàng) hoặc có thể nhận được (có thể trong trường hợp thông báo đã có trong bộ đệm của máy khách).

Vì vậy, trong trường hợp của bạn, nếu không có người tiêu dùng, thông báo có thể không được lưu trữ. Số lượng tăng thêm được tăng lên và Số tiền hết hạn vẫn ở mức 0. Số lượng hết hạn chỉ nên tăng trong trường hợp người đăng ký được kết nối (nhưng không sử dụng).

Một trích dẫn từ How do I find the Size of a Queue

Enqueue Đếm - tổng số tin nhắn được gửi vào hàng đợi kể từ khi khởi động lại cuối cùng
Đếm hết hạn - số tin nhắn mà không được cung cấp bởi vì họ đã hết hạn

Lưu ý: Thử nghiệm sử dụng JBoss 7 cho thấy trong trường hợp này thông báo không bật lên trong ứng dụng khách.

+0

Bạn có biết cách tôi có thể xác minh xem thư có thực sự không được lưu trữ không? –

+1

Bạn có thể thiết lập một chương trình thử nghiệm giúp gửi nhiều tin nhắn về một chủ đề (không có bất kỳ người tiêu dùng nào). Nhìn vào các quầy, và kích thước heap. Điều này vẫn không "đúng"; bằng không bạn phải nhìn vào mã. – Beryllium

+0

tôi đang nhận được các tin nhắn đã hết hạn. có thể giúp cơ thể nào? – anon

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