2015-04-10 22 views
6

Tôi có một kịch bản mà tôi muốn xuất bản một số tin nhắn để trao đổi thỏmq bằng cách sử dụng một khóa định tuyến cụ thể cho ví dụ. abcRabbitMq: Tạo hàng đợi động

Sự cố có thể đã có bất kỳ hàng đợi nào đã được liên kết với khóa định tuyến "abc" hoặc có thể không. Hành vi cho các tình huống như vậy có vẻ là hoặc là thả tin nhắn đó hoặc nếu một trao đổi thư chết được cấu hình, nó sẽ được chuyển đến trao đổi thư chết.

Tôi muốn tự động tạo hàng đợi có cùng tên với khóa định tuyến tức là "abc" nếu không có hàng đợi cho khóa định tuyến thay vì thả hoặc gửi hàng đó đến DLX.

Có cách nào để thực hiện tương tự không?

+0

Trong JMS, tôi sẽ không biết - nếu là .NET, tôi khuyên bạn nên sử dụng gói HareDU làm điểm bắt đầu để kiểm tra xem hàng đợi đã có mặt chưa. https://github.com/ahives/HareDu – Paul

+0

Tôi không muốn thực hiện một nhấn API rõ ràng để kiểm tra xem hàng đợi tồn tại hay không nhưng tôi muốn kiểm tra xem có cách nào để sửa đổi hành vi mặc định của trao đổi để tạo ra một xếp hàng nếu chưa có. – Rahul

+0

@rahulroc, http://stackoverflow.com/questions/21265242/dynamic-queue-creation-with-rabbitmq điều này có thể giúp bạn –

Trả lời

1

Từ nghiên cứu của mình, tôi không biết cách cấu hình phía máy chủ để tạo hàng đợi động. Tuy nhiên, bạn có thể thực hiện việc này ở phía khách hàng để đạt được hiệu quả tương tự:

Thực hiện một số ReturnListener trên kênh để nghe các thư không đọc được. Nhìn vào "Xử lý tin nhắn Unroutable" phần trên trang này cho một ví dụ:

https://www.rabbitmq.com/api-guide.html

Sau đó, bạn có thể sử dụng routingKey đó là thông qua vào xử lý để tạo ra một hàng đợi có cùng tên, sử dụng queueDeclare()queueBind() phương pháp (xem "Sử dụng trao đổi và hàng đợi" trên cùng một liên kết cho một ví dụ).

+0

Đây là một lần nữa một cấu hình phía khách hàng mà tôi đã nhận thức được. Những gì tôi đang tìm kiếm là một số trao đổi/môi giới bên cấu hình – Rahul

1

Không có hành vi defai afaik cho trường hợp của bạn. Bạn có thể tạo một plugin hoặc bạn có thể dựa vào logic khách hàng là mục đích của câu trả lời của tôi.

Điều quan trọng để biết rằng hàng đợi RabbitMQ khai báo/ràng buộc là là một Declare đợi idempotent operation

, tạo nếu phương pháp needed.This tạo hoặc kiểm tra một hàng đợi. Khi tạo hàng đợi mới, máy khách có thể chỉ định các thuộc tính khác nhau kiểm soát độ bền của hàng đợi và nội dung của nó, và mức độ chia sẻ cho hàng đợi .

giả thuyết 1: hàng đợi không thể bị xóa hoặc hàng đợi có thể bị xóa nhưng khách hàng sẽ biết điều đó, các thiết lập hàng đợi có thể phù hợp trong bộ nhớ

Mỗi khách hàng duy trì một tập hợp các hàng đợi. Trước khi gửi thư, khách hàng sẽ kiểm tra xem tập hợp có chứa hàng đợi hay không. Nếu không khai báo và liên kết hàng đợi và đặt hàng đợi vào tập hợp.

Tại bootstrap, tập hàng đợi có thể được khởi tạo với các hàng đợi hiện sử dụng ví dụ như HTTP API (ví dụ. Một java client)

Làm thế nào để làm điều đó phụ thuộc vào khách hàng RabbitMQ của bạn. Ví dụ sử dụng spring-amqp, bạn có thể mở rộng và ghi đè RabbitTemplate#doSend

giả thuyết 2: hàng đợi có thể bị xóa và khách hàng sẽ không biết

Theo đề nghị của GeekChick bạn có thể đăng ký một ReturnListener.Tất cả các thông điệp phải được gửi với mandatory flag

giả thuyết 3: Tôi không nhớ chi phí khai báo hàng đợi/bind *

Bạn luôn, trước khi gửi một tin nhắn, kê khai và ràng buộc hàng đợi. AFAIK chi phí, một khi được tạo ra, nên ít nhiều bằng với dấu chân mạng + tra cứu bản đồ.

+0

Tất cả các phương pháp mà bạn chỉ ra liên quan đến logic phía khách hàng mà tạo ra một chi phí phụ. Tôi biết tạo hàng đợi là một hoạt động idempotent nơi một số thuộc tính cần phải được chỉ định trong khi tạo hàng đợi nhưng những gì tôi đang cố gắng tìm ra là một số cấu hình có thể chỉ định một số thuộc tính mặc định và hàng đợi được tạo tự động. – Rahul

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