Apache Camel: извлечь имя очереди из тела сообщения

У меня есть требование, когда я должен отправить сообщение в Microsoft Teams. Я пытаюсь извлечь информацию об имени канала «в» из сообщения, которое я получаю из очереди, и на основе имени канала я читаю его URL-адрес из файла свойств и отправляю сообщение. Ниже приведен код для этого.

    RouteDefinition from = from("jms:queue:teamsq?connectionFactory=artemis");
    from.setHeader("Exchange.CONTENT_TYPE", constant("application/json"));
    final StringBuffer channelName = new StringBuffer();
    from.process(exchange -> {
        String[] dataArray = exchange.getIn().getBody(String.class).split(",", 2);
        channelName.append(dataArray[0]);
        exchange.getIn().setBody("{\"text\" : \"" + dataArray[1].trim() + "\"}");
    })
    .log("Body is : " + channelName + " : ${body}");

Когда тело регистрируется, значение channelName равно null.

Любая помощь, как я могу получить значение channelName вне этого метода process()?

Сообщение, полученное из очереди,

channel1, This is test a message 5

Заранее спасибо.

Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Управление транзакциями JDBC - это мощная функция, которая позволяет рассматривать группу операций с базой данных как единую единицу работы. Оно...
Выполнение HTTP-запроса с помощью Spring WebClient: GET
Выполнение HTTP-запроса с помощью Spring WebClient: GET
WebClient - это реактивный веб-клиент, представленный в Spring 5. Это реактивное, неблокирующее решение, работающее по протоколу HTTP/1.1.
Gradle за прокси-сервером
Gradle за прокси-сервером
Создайте проект Gradle под сетевым прокси.
0
0
609
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете задать заголовок сообщения или свойство Exchange. Обе являются своего рода переменными сообщения для использования во время обработки маршрута.

.setHeader("channelName", channelName.toString())
.setProperty("channelName", channelName.toString())

Основное отличие состоит в том, что свойства Exchange хранятся на Camel Exchange, а заголовки сообщений являются частью самого сообщения.

Camel Exchange — это оболочка сообщения Camel. Он создается, когда сообщение входит в маршрут и отбрасывается в конце маршрута.

Свойства биржи:

  • доступны только во время обработки маршрута Camel
  • никогда не отправляются в другие системы
  • только в памяти

Заголовки сообщений:

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

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

Однако если вы направляетесь к прямой конечной точке (конечная точка Camel в памяти), весь Exchange передается, а свойства Exchange по-прежнему доступны.

Спасибо. Это помогло. Хотя нет прямого способа извлечь этот заголовок, например, getHeaer() или что-то в этом роде, но используя selection() и сравнение, я смог найти обходной путь.

Rafaqat Ali 22.12.2020 02:10

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