Asyn c обработка с использованием Apache Camel с RabbitMQ - PullRequest
1 голос
/ 21 января 2020

Я пытаюсь настроить небольшое ПО 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?

1 Ответ

1 голос
/ 21 января 2020

Я предполагаю, что использование методов to без изменения шаблона обмена сообщениями (MEP) на вашем маршруте приводит к тому, что сообщения отправляются одно за другим (по умолчанию In In Out). Вы можете попробовать изменить свой шаблон обмена на In Only, чтобы увидеть, даст ли это желаемый эффект. Что-то вроде:

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
        // route to an intermediate route to allow changing the MEP (can't do this in the REST DSL yet afaik)
       .to("direct://intermediateRoute")
       .to("direct://intermediateRoute")
       .to("direct://intermediateRoute");

    // intermediate route to change MEP
    from("direct://intermediateRoute")
        .inOnly("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");
}

В качестве альтернативы, возможно, стоит рассмотреть что-то вроде шаблона multicast .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...