2013-03-08 35 views
6

Cách tốt nhất để giữ hàng đợi bền vững và sự ràng buộc của nó là gì nhưng tạm ngừng người tiêu dùng?RabbitMQ tạm ngừng tiêu thụ hàng đợi

Trường hợp sử dụng là: Tôi muốn "cho phép sự cố" và ngừng xử lý thư nếu chúng tôi tiếp tục nhận được một loạt thư mà chúng tôi không thể xử lý (ví dụ: cơ sở dữ liệu bị lỗi hoặc vấn đề giản đồ) tiếp tục tổng hợp vào hàng đợi. Đó là cho phép xuất bản nhưng đình chỉ tiêu thụ.

tôi có thể nghĩ đến ba giải pháp:

  1. tôi có thể có tất cả những người tiêu dùng buộc phải xếp hàng liên tục từ chối các tin nhắn và tái đợi nhưng đây là loại tài nguyên lãng phí chưa kể tôi đã lập trình làm trên logic.
  2. tôi có thể gọi basic.cancelConsumer trên tất cả người tiêu dùng (xem dưới đây)
  3. Hoặc về Tôi đoán tôi có thể gọi shutdown trên tất cả các SimpleMessageListenerContainers rằng đang bị ràng buộc vào hàng đợi.

#1 chúng tôi đã làm khi thư bị từ chối. Vấn đề là điều này kết thúc giống như một vòng lặp vô hạn trong khi thất bại và nếu bạn đăng nhập thất bại, thậm chí nhiều tài nguyên hơn sẽ bị lãng phí.

#3 có vẻ lý tưởng nhưng tôi phải biết một số cách biết về tất cả người nghe tin nhắn và sau đó thông báo cho họ tắt máy. Tôi cho rằng tôi có thể sử dụng trao đổi fanout để thông báo rằng hàng đợi cần được tạm ngưng. Tôi cảm thấy như RabbitMQ phải có một cái gì đó tích hợp cho logic này. Vấn đề khác là bạn có thể liên kết nhiều hàng đợi với một thùng chứa thư (không phải tất cả các hàng đợi có thể cần phải bị tạm ngưng).

Đối #2 Tôi biết tôi có thể cancel the consumer với nó consumerTag nhưng câu hỏi (giả định đó là đúng cách để làm các việc trên) là nơi để tôi có được danh sách các consumerTag s đến một hàng đợi?

Trả lời

1

Nếu bạn cần dừng người tiêu dùng thì chỉ cần gọi hủy cơ bản, đó là cách thực hiện.

Có hàng đợi lâu là vấn đề bạn giải quyết khi bạn khai báo hàng đợi: durable=trueauto_delete=false.

Có thông điệp dai dẳng được xác định khi bạn xuất bản chúng: delivery_mode=2.

Mỗi người tiêu dùng có nó của thẻ tiêu dùng riêng. Bất cứ khi nào bạn nhận được một tin nhắn ra khỏi hàng đợi, phong bì nên có thẻ người tiêu dùng và bạn nên gọi cơ bản hủy bỏ với thẻ đó.

AFAIK, bạn không thể có người tiêu dùng A trong conn 1 và gọi hủy cơ bản cho người tiêu dùng đó trên một kết nối khác. Tôi có thể sai về điều này.

+0

Cảm ơn. Tôi biết cách tuyên bố hàng đợi trong thỏ như trên.Có vẻ như tôi sẽ phải tự quản lý người tiêu dùng của mình, đó là con đường tôi đã đi xuống. Sẽ tốt hơn nếu thỏ có quyền quản trị tùy chọn khôn ngoan để đình chỉ tiêu thụ hàng đợi. –

+0

Điều duy nhất bạn có thể thực hiện từ kết nối là buộc đóng nó từ quản trị viên không thực sự là những gì bạn đang tìm kiếm –

1

Giải pháp này là cụ thể. Về cơ bản, #3 từ câu trả lời của tôi.

Tôi duy trì một dịch vụ có Map<String,CustomSimpleMessageListenerContainer> tên hàng đợi để mở rộng tùy chỉnh SimpleMessageListenerContainer.

Sau một số trường hợp ngoại lệ nhất định, tôi gửi một thông báo "hoảng loạn" đi đến hàng đợi đặc biệt mà dịch vụ nhận được để tắt người tiêu dùng.

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