Citrus не может найти канал ответа при параллельном получении и отправке сообщений

#junit #apache-camel #citrus-framework

#junit #apache-camel #citrus-framework

Вопрос:

Я использую платформу Citrus для тестирования маршрутов Camel. Я отправляю запрос в приложение на базе Camel, которое, в свою очередь, отправляет несколько запросов параллельно на сервер SOAP. Я пытаюсь издеваться над SOAP-сервером с помощью Citrus, используя параллельный контейнер. Я использую селекторы для запуска правильных действий приема и отправки, аналогичных следующему примеру (реальный код немного сложнее):

 parallel().actions(
    sequential().actions(
        soap().server("soapService")
            .receive()
            .selector("xpath:local-name(/*)='exampleRequest1' AND xpath://ns1:id/text()='123'")
            .payload(new ClassPathResource("data/123/exampleRequest1.xml")),
        echo("Received exampleRequest1"),
        soap().server("soapService")
            .send()
            .payload(new ClassPathResource("data/123/exampleResponse1.xml")),
        echo("Sent exampleResponse1"),
    ),
    sequential().actions(
        soap().server("soapService")
            .receive()
            .selector("xpath:local-name(/*)='exampleRequest2' AND xpath://ns1:id/text()='456'")
            .payload(new ClassPathResource("data/456/exampleRequest2.xml")),
        echo("Received exampleRequest2"),
        soap().server("soapService")
            .send()
            .payload(new ClassPathResource("data/456/exampleResponse2.xml")),
        echo("Sent exampleResponse2"),
    ),
    ...
)
  

Citrus действительно получает сообщения, но не может ответить. Сообщение об ошибке каждого параллельного потока:

 13:35:36.121 [Thread-22] ERROR com.consol.citrus.container.Parallel - Parallel test action raised error
java.lang.IllegalArgumentException: Failed to find reply channel for message correlation key: citrus_message_id = 'c37eb703-4fb3-4c34-98f8-9cf8ee0414a1'
    at org.springframework.util.Assert.notNull(Assert.java:198)
    at com.consol.citrus.channel.ChannelSyncConsumer.send(ChannelSyncConsumer.java:73)
    at com.consol.citrus.actions.SendMessageAction.doExecute(SendMessageAction.java:125)
    …
  

Важно: citrus_message_id, который ищет каждый поток, всегда один и тот же, но должен отличаться. Поэтому, если одно из действий отправки действительно выполняется успешно, обычно оно отправляется с неправильным каналом ответа.

В чем здесь может быть проблема? Это ошибка или я что-то упускаю? Большое вам спасибо!

Ответ №1:

Проблемы здесь вызывает параллельный контейнер. Но вы можете безопасно удалить параллельный контейнер при использовании селекторов в действиях приема. Он должен работать нормально для вас, как только вы удалите параллели

Комментарии:

1. Я только что попробовал это, и это сработало как шарм. Большое вам спасибо! Это ошибка или это сделано специально? В документации есть пример последовательных контейнеров внутри параллельных контейнеров, и вы написали: «Фактическая мощность последовательных контейнеров проявляется только в сочетании с другими контейнерами, такими как итерации и параллели».