2013-08-30 34 views
5

RabbitMQ của ban cho chúng ta những lập luận sau:RabbitMQ: Cách xác định hàng đợi để xuất bản? phương pháp <code>Channel#basicConsume</code>

channel.basicConsume(queueName, autoAck, consumerTag, noLocal, 
    exclusive, arguments, callback); 

Cho chúng tôi khả năng nói RabbitMQ chính xác mà xếp hàng chúng tôi muốn tiêu thụ từ.

Nhưng Channel#basicPublish không có tương đương như:

channel.basicPublish(exchangeName, routingKey, mandatory, immediateFlag, 
    basicProperties, messageAsBytes); 

Tại sao tôi không thể xác định hàng đợi để công bố đến đây?!? Làm cách nào để có được xuất bản Channel, ví dụ: hàng đợi có tên logging? Cảm ơn bạn trước!

+1

Những gì bạn muốn làm có thể được thực hiện với hàng đợi độc quyền, trao đổi trực tiếp và tên hàng đợi đã biết và bằng cách nào đó với khóa tuyến đường cụ thể + trao đổi chủ đề. – pinepain

+0

Cảm ơn @ zaq178miami (+1) - bạn có thể cung cấp ví dụ về mã không? –

Trả lời

13

Hàng đợi cơ bản có thể được liên kết với một trao đổi dựa trên routingKeys.

Giả sử rằng bạn có 3 nhà xuất bản khác nhau.
Publisher1 gửi tin nhắn để trao đổi với routingKey "sự kiện"
Publisher2 nhắn gửi đến trao đổi với routingKey "nhiệm vụ"
Publisher3 nhắn gửi đến trao đổi với routingKey "công việc"

Bạn có thể có một người tiêu dùng mà chỉ tiêu thụ thông điệp với routhingKey cụ thể.
Ví dụ để có một người tiêu dùng cho "sự kiện" thông điệp bạn khai báo như thế này

channel.queueBind(queueName, exchangeName, "events"); 

Nếu bạn muốn tiêu thụ tất cả các thông điệp đến việc trao đổi bạn cung cấp cho định tuyến như '#'

Vì vậy, trong ngắn hạn những gì tôi có thể nói là,
1. Tin nhắn sẽ được công bố để trao đổi.
2. Hàng đợi sẽ bị ràng buộc để trao đổi dựa trên routingKeys.
3. RabbitMQ sẽ chuyển tiếp tin nhắn với các phím định tuyến phù hợp với các hàng đợi tương ứng.

Xin vui lòng xem hướng dẫn - http://www.rabbitmq.com/tutorials/tutorial-three-java.html

Ý tưởng cốt lõi trong mô hình tin nhắn trong RabbitMQ là nhà sản xuất không bao giờ gửi bất kỳ tin nhắn trực tiếp đến một hàng đợi. Trên thực tế, khá thường xuyên các nhà sản xuất thậm chí không biết nếu một tin nhắn sẽ được gửi đến bất kỳ hàng đợi ở tất cả. Thay vào đó, nhà sản xuất chỉ có thể gửi tin nhắn đến một cuộc trao đổi

+0

@John tuyệt vời (+1 và kiểm tra màu xanh lá cây) - cảm ơn câu trả lời hữu ích, toàn diện và đầy đủ thông tin! –

0

hãy thử này:

channel.basicPublish("", yourQueueName, null, 
     message.getBytes((Charset.forName("UTF-8")))); 

Nó làm việc cho dự án của tôi.

+1

Cảm ơn @tien nguyen (+1) - Tuy nhiên, có vẻ như bạn đang sử dụng ['basicPublish (trao đổi java.lang.String, java.lang.String routingKey, AMQP.BasicProperties props, byte [] body)'] (http://www.rabbitmq.com/releases/rabbitmq-java-client/v1.7.2/rabbitmq-java-client-javadoc-1.7.2/com/rabbitmq/client/Channel.html#basicPublish%28java.lang. Chuỗi,% 20java.lang.String,% 20com.rabbitmq.client.AMQP.BasicProperties,% 20byte []% 29) quá tải của 'basicPublish'. Trong tình trạng quá tải đó, tham số thứ 2 (mà bạn có tên là "yourQueueName" được gọi là "routingKey" .Đó là "routingKey" RabbitMQ lingo cho "tên hàng đợi"? –

+0

@TicketMonster routingKey không có nghĩa là hàng đợi. để trao đổi dựa trên routingKey và chỉ nhận được các tin nhắn có routingKey đó, hãy xem câu trả lời của tôi –

+0

chi tiết hơn một chút thông điệp được gửi đến trao đổi mặc định để khóa định tuyến có hiệu lực gửi đến hàng đợi. không tương đương với – robthewolf

10

Để mở rộng câu trả lời của @Tien Nguyen, có một "gian lận" trong RabbitMQ cho phép bạn xuất bản trực tiếp lên hàng đợi. Mỗi hàng đợi được tự động liên kết với trao đổi mặc định AMQP, với tên của hàng đợi làm khóa định tuyến. Trao đổi mặc định còn được gọi là "trao đổi không tên" - tức là tên của nó là chuỗi rỗng. Vì vậy, nếu bạn xuất bản để trao đổi có tên là "" với khóa định tuyến bằng tên hàng đợi của bạn, thông báo sẽ chuyển đến hàng đợi đó. Nó đang trải qua một cuộc trao đổi như @ John nói, nó không phải là thứ mà bạn cần phải khai báo hoặc ràng buộc bản thân.

Tôi không có ứng dụng Java tiện dụng để thử mã này, nhưng nó sẽ hoạt động.

channel.basicPublish("", myQueueName, false, false, null, myMessageAsBytes); 

Điều đó nói chung, điều này phần lớn là trái với tinh thần cách thức hoạt động của RabbitMQ. Đối với luồng ứng dụng thông thường, bạn nên khai báo và liên kết trao đổi. Nhưng đối với những trường hợp đặc biệt, "gian lận" có thể hữu ích. Ví dụ, tôi tin rằng đây là cách Bảng điều khiển dành cho quản trị viên Thỏ cho phép bạn xuất bản các thư một cách thủ công lên hàng đợi mà không cần tất cả các buổi tạo và trao đổi liên kết.

+0

Công việc gian lận này thậm chí nếu hàng đợi cũng bị ràng buộc với một cuộc trao đổi? –

+0

Có, chúng tôi sẽ có mã thực hiện điều này với các hàng đợi có liên quan đến các sàn giao dịch khác .. –

+0

Thật tuyệt vời những gì tôi cần để thử nghiệm tự động. –

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