IntegrationFlow HttpRequestHandlingMessagingGateway отвечает напрямую - PullRequest
0 голосов
/ 27 сентября 2019

Я новичок в Spring Integration и пытаюсь использовать HttpRequestExecutingMessageHandler и HttpRequestHandlingMessagingGateway.Обработчик отправляет запрос POST и ожидает ответа.Шлюз потребляет запрос.Он работает нормально, НО обработчик не получает ответ.Я не знаю, как настроить мой поток, чтобы я мог напрямую отправить ответ и продолжить мой поток.

@Bean
public HttpRequestExecutingMessageHandler httpOutbound() {
  HttpRequestExecutingMessageHandler handler = Http.outboundGateway(restUrl)
        .httpMethod(HttpMethod.POST)
        .messageConverters(new MappingJackson2HttpMessageConverter())
        .mappedRequestHeaders("Content-Type")
        .get();
  handler.setExpectReply(true);
  handler.setOutputChannel(httpResponseChannel());
  return handler;
}

@Bean
public HttpRequestHandlingMessagingGateway httpRequestGateway() {
  HttpRequestHandlingMessagingGateway gateway = new HttpRequestHandlingMessagingGateway(true);
  RequestMapping mapping = new RequestMapping();
  mapping.setMethods(HttpMethod.POST);
  mapping.setPathPatterns(httpRequestHandlingPathPattern);
  gateway.setRequestMapping(mapping);
  gateway.setErrorChannel(errorChannel());
  gateway.setReplyChannel(replyChannel());
  gateway.setRequestChannel(requestChannel());
  gateway.setRequestPayloadTypeClass(DocumentConverterInput.class);
  return gateway;
 }

@Bean
public IntegrationFlow documentConverterFlow() {
  return IntegrationFlows
        .from(requestChannel())
        .publishSubscribeChannel(publishSubscribeSpec ->
              publishSubscribeSpec.subscribe(flow -> flow
                          .enrichHeaders(headerEnricherSpec -> headerEnricherSpec.header("http_statusCode", HttpStatus.OK))
                          .channel(replyChannel())))
        .enrichHeaders(headerEnricherSpec ->
             headerEnricherSpec.headerExpression(Constants.DOCUMENT_CONVERTER_INPUT, "payload"))
        .handle(Jms.outboundAdapter(jmsTemplate(connectionFactory)))
        .get();
 }

Мой HttpRequestExecutingMessageHandler успешно публикует запрос.HttpRequestHandlingMessagingGateway успешно использует его.Сначала у меня была ошибка «Нет ответа в течение тайм-аута», поэтому я добавил publishSubscriberChannel.Я не знаю, если это правильный путь, но я не могу найти рабочие примеры, которые показывают, как правильно ответить.

Мой код выше работает, НО не отправляет ответ обратно HttpRequestExecutingMessageHandler!

Моя цель - получить сообщение с запросом и отправить обратно 200 OK.После этого я хочу продолжить процесс интеграции, сделать что-нибудь и отправить результат в очередь.

Есть предложения?

1 Ответ

1 голос
/ 27 сентября 2019

Для получения ответа 200 OK необходимо учитывать HttpRequestHandlingMessagingGateway с expectReply = false.Таким образом, он будет работать как адаптер входящего канала, но имея факт, что HTTP всегда является запросом-ответом, он просто сделает это setStatusCodeIfNeeded(response, httpEntity);, и ваш HttpRequestExecutingMessageHandler на стороне клиента получит пустое значение, но OK resposnse.

Не знаю, почему ваш channel(replyChannel()) работает не так, как ожидалось.Это может быть тот факт, что вы возвращаете запрос palyoad в ответное сообщение, которое в конечном итоге становится HTTP-ответом, но каким-то образом это не удается, может быть во время преобразования ...

...