是的,DefaultConsumer
使用一個可以更改的內部線程池。 使用ExecutorService
爲:
ExecutorService es = Executors.newFixedThreadPool(20);
Connection conn = factory.newConnection(es);
閱讀http://www.rabbitmq.com/api-guide.html「高級連接選項」。
你可以從「QueueingConsumer」 doc閱讀:
因此,它現在可以安全地直接實現消費者或延長DefaultConsumer。
我從來沒有使用過QueueingConsumer,因爲它沒有正確的事件驅動。
正如你可以在這裏看到:
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume(QUEUE_NAME, true, consumer);
while (true) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
/// here you are blocked, waiting the next message.
String message = new String(delivery.getBody());
}
在這種情況下,一個典型的問題是如何關閉訂閱,一個共同的解決辦法是在本地主機發送一個標記接近的消息。其實我不喜歡這麼多。
如果擴展DefaultConsumer
相反,你可以正確地關閉申購和通道:
public class MyConsumer extends DefaultConsumer {...}
然後
public static void main(String[] args) {
MyConsumer consumer = new MyConsumer (channel);
String consumerTag = channel.basicConsume(Constants.queue, false, consumer);
System.out.println("press any key to terminate");
System.in.read();
channel.basicCancel(consumerTag);
channel.close();
....
總之,你不應該擔心的消息順序,因爲如果所有的消息順序是正確的,但我認爲你不能假設它,因爲如果有問題,你可能會失去消息順序。如果您絕對需要維護消息順序,則應該包含順序標籤以在消費方重新構建消息順序。
而且你應該擴展DefaultConsumer。
你的意思是「它會攪亂我的訂單嗎?」 ? 主題順序或消息順序? – Gabriele