Как передавать сообщения Camel VM между несколькими приложениями Spring Boot в Tomcat - PullRequest
1 голос
/ 06 августа 2020

У нас есть стек приложений, развернутый в Tomcat, который состоит из нескольких приложений Spring Boot. В рамках наших операций мы хотим отправить некоторые сообщения в конечную точку vm, где верблюжий маршрут будет принимать эти сообщения, а затем публиковать sh их в JMS topi c для любого другого интересующего приложения Spring Boot. в сообщениях на этом topi c.

Когда я запускаю стек приложений, есть три приложения для весенней загрузки, которые используют верблюда, и я вижу, что верблюд запускается правильно в журналах. Но когда одно из приложений отправляет сообщение в конечную точку vm, маршрут, который потребляет от этой конечной точки и направляет сообщения на jms topi c, похоже, не получает это сообщение. Я поместил банку camel-core в свой каталог lib tomcat. В конфигурации плагина весенней загрузки maven я указал исключение jar-файла camel-core. Как ни странно, эта банка все равно попала в число WEB-INF/lib войны! Итак, я остановил Tomcat, удалил эту банку из разорванной войны и перезапустил Tomcat, но это не меняет поведения обмена сообщениями.

Вот версии, которые мы используем:

  • Spring Boot 2.3.1
  • Camel 3.4.2
  • Tomcat 8.5.5

Первое приложение для весенней загрузки, которое связывает все вместе с верблюдом route, который потребляет от конечной точки vm и создает это сообщение на jms topi c, является нашим «механизмом маршрутизации». Он использует camel-spring-boot-starter, spring-boot-starter-artemis, camel-vm-starter, artemis-jms-server и camel-jms-starter. Его метод настройки RouteBuilder выглядит следующим образом:

from("vm:task")
    .log(LoggingLevel.WARN, "********** Received task message");
    .to("jms:topic:local.private.task")
    .routeId("taskToJms");

Приложение, которое создает сообщения для конечной точки vm, использует camel-spring-boot-starter и camel-vm-starter. В этом приложении у него есть класс @Service, который получает ProducerTemplate, который автоматически подключается в конструкторе. Когда приложение вызывает этот компонент для отправки сообщения, я вижу строку в журналах, в которой написано

o.a.c.impl.engine.DefaultProducerCache (169) - >>>> vm://task Exchange[]

, поэтому кажется, что сообщение создается и отправляется правильно в конечную точку vm. Однако я не вижу никаких указаний на то, что оно было получено / использовано в верблюжьем маршруте механизма маршрутизации, поскольку в строке журнала маршрута ничего не регистрируется, и поскольку я не вижу других признаков получения сообщения в журнале. Странно то, что я не получаю сообщение об отсутствии потребителей на конечной точке vm: task, которое я получал до того, как поместил jar-файл camel-core в каталог lib tomcat.

Я что-то делаю явно неправильно? Как я могу заставить плагин весенней загрузки maven действительно исключить camel-core? И почему сообщения (отправленные в конечную точку vm) не используются маршрутом в механизме маршрутизации? Заранее благодарим за любую помощь.

Изменить: мне удалось уберечь ядро ​​верблюда от файлов войны, добавив исключение в конфигурацию плагина войны, но я все еще не мог принять сообщение на конечной точке vm.

1 Ответ

0 голосов
/ 20 августа 2020

Я отправлю ответ, или, по крайней мере, «ответ» для всех, кто мог оказаться в загадочной ситуации, в которой оказался я.

Короче говоря, ответ таков: это лучший чтобы не пытаться отправлять сообщения виртуальной машины в разные контексты в одной большой JVM, такой как Tomcat. Вместо этого используйте что-то вроде JMS. Я использовал Artemis и включил встроенного брокера в одно из приложений весенней загрузки в Tomcat. В других приложениях (которые будут клиентами) мне нужно было подключиться к встроенному серверу artemis, что требует добавления класса @Configuration (в модуле, который поддерживает встроенный брокер), который реализует ArtemisConfigurationCustomizer:

@Configuration
public class ArtemisConfig implements ArtemisConfigurationCustomizer {
    @Override
    public void customize(final org.apache.activemq.artemis.core.config.Configuration configuration) {
        configuration.addConnectorConfiguration("nettyConnector", new TransportConnfiguration(NettyConnectorFactory.class.getName()));
        configuration.addAcceptorConfiguration(new TransportConfiguration(NettyAcceptorFactory.class.getName()));
    }
}

Это позволяет другим вашим устройствам подключаться к встроенному брокеру Artemis. Кроме того, вам не нужно беспокоиться об обновлении jar-файлов с ядром верблюда в общей папке lib в Tomcat при обновлении camel до другой версии. Хорошо, чтобы все было просто для технического обслуживания!

В любом случае, я надеюсь, что это поможет кому-то еще, кто может оказаться здесь когда-нибудь.

...