Я пытаюсь настроить небольшое ПО C, которое может продемонстрировать, что Apache Верблюд, использующий RabbitMQ, может обрабатывать асинхронную обработку. Мотивация для этого состоит в том, чтобы найти способ поддержки долгосрочных задач, которые лучше всего подходят для асинхронной обработки. Вот мой текущий код:
@Autowired
MySimpleTask task;
public void configure() throws Exception {
restConfiguration()
.component("servlet")
.bindingMode(RestBindingMode.json);
rest().get("/pipeline?route={route}").route()
.log(LoggingLevel.INFO, "/pipeline endpoint has been hit with route = " + header("route"))
.transform().simple("Here is some body text.")
// intentionally make three calls to test if async works
.to("rabbitmq://localhost/ex?routingKey=A")
.to("rabbitmq://localhost/ex?routingKey=A")
.to("rabbitmq://localhost/ex?routingKey=A");
from("rabbitmq://localhost/ex?routingKey=A&autoAck=true")
.log(LoggingLevel.INFO, "Incoming content from queue: ${body}")
.threads(20)
.bean(task, "doSomething");
}
Вот код моей задачи:
@Component
public class MySimpleTask {
public void doSomething(String msg) throws Exception {
System.out.println(Thread.currentThread().getId() + ": doSomething() has started with message: " + msg);
Thread.sleep(10000);
System.out.println(Thread.currentThread().getId() + ": doSomething() has finished: " + msg);
}
}
Фиктивная задача, которую я создал в MySimpleTask
, состоит в том, чтобы просто поспать 10 секунд, чтобы смоделируйте что-то более значимое, действительно происходящее позже (например, оптическое распознавание изображения). Что я надеялся увидеть из вышесказанного, так это то, что все три простые задачи начинаются одна за другой, после чего следует пауза в 10 секунд, а затем выполнение каждой из задач. Вместо этого я вижу одну задачу за другой, которая запускается и завершается синхронно.
Может кто-нибудь пролить свет на то, как включить асинхронную поддержку с Apache Camel, работающий с RabbitMQ в качестве реализации JMS?