是的,DefaultConsumer使用可以更改的内部线程池.
使用ExecutorService作为:
ExecutorService es = Executors.newFixedThreadPool(20);
Connection conn = factory.newConnection(es);
正如您可以从“QueueingConsumer”doc中读到:
As such, it is now safe to implement Consumer directly or to extend 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.