2011-11-29 31 views
5

Tôi đang sử dụng ActiveMQ 5.4 với KahaDB làm kho lưu trữ thư. Trong khi xuất bản tin nhắn (với Persistence đúng) để một chủ đề, trong đó có thuê bao bền, các cửa hàng kiên trì đang gia tăng ngay cả những tin nhắn được gửi đến thuê bao. Vì vậy, điều này gây ra sự cố khi cửa hàng thư đang đầy và không chấp nhận bất kỳ thư nào nữa.ActiveMQ KahaDB Persistence Store Full

Vì vậy, câu hỏi của tôi là tại sao cửa hàng Persistence không loại bỏ các thông điệp trong KahaDB, ngay cả những thông điệp được gửi đi?

Kính trọng,

Srinivas

Trả lời

8

gì bạn đang nhìn thấy là một sự tương tác giữa ActiveMQ message store hành vi và đối với durable subscriptions on topics.

Khi bạn có đăng ký bền, chủ đề được xử lý như một hàng đợi cho mỗi clientId của người đăng ký (được đặt trên Connection). Logic là khách hàng không muốn bỏ lỡ bất kỳ tin nhắn nào khi họ ngắt kết nối. Vì vậy, nếu họ ngắt kết nối, các thuê bao bền treo xung quanh và giữ các tin nhắn còn sống.

Cửa hàng tin nhắn AMQ sử dụng nhật ký dữ liệu cho nhật ký thư của nó. Đây là những văn bản tuần tự, và không bao giờ thực sự loại bỏ (mà sẽ yêu cầu truy cập ngẫu nhiên). Có một tập tin thứ hai mà theo dõi các tin nhắn đã được tiêu thụ. Khi tất cả các tin nhắn trong một tập tin dữ liệu đã được tiêu thụ, tập tin đó sẽ bị xóa.

Vì vậy, những gì bạn đang thấy là một số thư trong tệp dữ liệu không bị các đăng ký lâu bền này sử dụng và chỉ bị treo xung quanh. ClientIds cho các thuê bao bền không được sử dụng nhất quán sẽ gây ra vấn đề này. Có khả năng là có điều gì đó sai với cách tính năng đang được sử dụng, nếu bạn sử dụng JMX để kiểm tra các đăng ký trên nhà môi giới sẽ giúp bạn theo dõi nguyên nhân gốc rễ.

Như một quy tắc chung, bất cứ khi nào bạn nghĩ rằng bạn có thể muốn sử dụng đăng ký bền, hãy sử dụng virtual topics thay thế - chúng dễ dàng hơn để lý luận, kiểm tra và tải số dư. Mặt khác, nếu bạn chỉ muốn nhận được một vài tin nhắn cuối cùng khi bạn kết nối lại người đăng ký chủ đề thay vì tất cả các tin nhắn bạn có thể đã bỏ lỡ, hãy sử dụng retroactive consumers.

Cách dễ dàng để giải quyết vấn đề này là luôn luôn use a time to live khi bạn gửi thư - hầu hết mọi trường hợp sử dụng đều có giới hạn thời gian khi thư phải được sử dụng. ActiveMQ sẽ hết hạn các tin nhắn ngoài thời điểm này, và giải phóng các tin nhắn trong các tập tin dữ liệu để xóa.