Параллелизм в одном экземпляре процессора и concurrentConsumers

Если у меня есть такой код:

Processor myProcessor = new MyProcessor();
CamelContext cContext = new DefaultCamelContext();
cContext.addComponent("jms", new MyJmsComponent());
cContext.addRoutes(new RouteBuilder() {
    @Override
    public void configure() throws Exception {
            from("jms://my-jms-endpoint?concurrentConsumers=5").process(myProcessor);
        }
    });

Этот код является параллельным? Я предполагаю, что сообщения потребляются одновременно конкурирующими потребителями, но что происходит в экземпляре myProcessor? Клонируется ли он автоматически Camel? Или myProcessor считается потокобезопасным, а сообщения обрабатываются одновременно одним экземпляром? Или сообщения синхронизируются для последовательного доступа к myProcessor в этом фрагменте? В последнем случае как добиться параллелизма?

Если верблюжий маршрут потребляет несколько сообщений одновременно, процессор считается потокобезопасным. Если вы чувствуете, что это слишком сильно повлияет на производительность, возможно, вы можете создать пул процессоров.

Anthony Raymond 10.12.2018 16:07

Спасибо, Энтони. Если предполагается, что процессор является потокобезопасным, как можно повысить производительность за счет создания пула процессоров?

Kamil Roman 10.12.2018 16:14

Потокобезопасный класс часто включает в себя какой-либо блокирующий механизм. При определенных обстоятельствах может помочь использование пула рабочих. Не все рабочие могут получить пользу (или даже работать) с пулом, все зависит от того, что делает процессор и какие вещи должны быть потокобезопасными.

Anthony Raymond 10.12.2018 16:17

Хорошо, поэтому я понимаю, что потенциальное влияние на производительность может возникнуть только от конкретной реализации процессора. Пожалуйста, оставьте свой комментарий в качестве ответа, и я приму его.

Kamil Roman 10.12.2018 16:30

Нет проблем;) рад, что помогло

Anthony Raymond 10.12.2018 16:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
150
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если верблюжий маршрут потребляет несколько сообщений одновременно, предполагается, что Processor является потокобезопасным, потому что несколько потребителей могут использовать его одновременно.

Если вы чувствуете, что это слишком сильно повлияет на производительность (из-за возможного механизма блокировки), возможно, вы можете создать пул процессоров. Хотя не все рабочие могут получить пользу (или даже работать) с пулом, все зависит от того, что делает процессор и какие вещи должны быть защищены потоками.

Другие вопросы по теме