Tak, DefaultConsumer
używa wewnętrznej puli wątków, którą można zmienić. Korzystanie ExecutorService
jak:
ExecutorService es = Executors.newFixedThreadPool(20);
Connection conn = factory.newConnection(es);
Czytaj http://www.rabbitmq.com/api-guide.html „Zaawansowane opcje połączenia”.
Jak można odczytać z „QueueingConsumer” doc:
jako takie, to jest teraz bezpiecznie realizować bezpośrednio konsumentowi lub przedłużyć DefaultConsumer.
Nigdy nie użyłem QueueingConsumer, ponieważ nie jest on prawidłowo sterowany zdarzeniami.
Jak widać tutaj:
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());
}
Typowym problemem w tym przypadku jest to, jak zamknąć subskrypcji oraz wspólne obejście jest wysłanie oznaczony ścisły post w lokalnym komputerze. Właściwie to nie lubię tego tak bardzo.
Jeśli przedłużyć DefaultConsumer
zamiast można prawidłowo zamknąć subskrypcji i kanał:
public class MyConsumer extends DefaultConsumer {...}
następnie
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();
....
Podsumowując, nie należy się martwić o kolejności wiadomość, bo jeśli wszystko działa poprawnie, kolejność wiadomości jest poprawna, ale myślę, że nie możesz jej założyć, ponieważ jeśli wystąpi jakiś problem, możesz utracić kolejność wiadomości. Jeśli absolutnie potrzebujesz zachować kolejność wiadomości, powinieneś dołączyć sekwencyjny znacznik, aby zrekonstruować kolejność komunikatów po stronie konsumenta.
Powinieneś także rozszerzyć DefaultConsumer.
Co masz na myśli mówiąc "czy to zepsuje mój porządek?" ? Kolejność nanoszenia zamówień lub wiadomości? – Gabriele