Успешный ответ Spring Integration DSL при успешной доставке в очередь - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь предоставить конечную точку HTTP, которая отбрасывает сообщение в очередь JMS. Я хочу ответить с помощью «Успешно», если доставка прошла успешно, и «СБОЙ», если сообщение не может быть доставлено.

 @Bean
    public IntegrationFlow systemTaskCall(MapToServiceTaskConfigTransformer mapTransformer, CachingConnectionFactory jmsConnectionFactory) {
        return IntegrationFlows.from(
                Http.inboundGateway("/spartaSystemTask")
                        .requestMapping(r -> r
                                .methods(HttpMethod.POST)
                                .consumes("application/json")
                        )
                        .requestPayloadType(Map.class)
                        .replyChannel(RESPONSE_CHANNEL)
                        .errorChannel("errorChannel")
        )
                .handle((payload, headers) -> mapTransformer.transform((Map<String, String>) payload))
                .enrichHeaders(Collections.singletonMap(DESTINATION_QUEUE, "request.queue"))
                .enrichHeaders(Collections.singletonMap(JMS_REPLY_TO, "response.queue"))
                .transform(Transformers.toJson())
                .handle(
                        Jms.outboundGateway(jmsConnectionFactory,)
                            .requestDestination(message -> message.getHeaders().get(DESTINATION_QUEUE))

                )
                .log(LoggingHandler.Level.ERROR)
                .enrichHeaders(
                        c -> c.header(org.springframework.integration.http.HttpHeaders.STATUS_CODE, HttpStatus.CREATED)
                )
                .transform(source -> "SUCCESS")
                .transform(Transformers.toJson())
                .channel(RESPONSE_CHANNEL)
                .get();
    }

 @Bean
    public IntegrationFlow errorFlow(){
        return IntegrationFlows.from("errorChannel")
                .transform(source -> "error")
                .transform(Transformers.toJson())
                .channel(RESPONSE_CHANNEL)
                .get();
    }

Когда я позвоните по этому URL, сообщение отброшено, но время ожидания HTTP-вызова истекло. Кажется, после отправки вызова исходящего шлюза JMS остальная часть кода не выполняется.

В случае сбоя при доставке сообщения я получаю правильный ответ.

1 Ответ

1 голос
/ 27 января 2020

У вас есть эта конфигурация:

.handle(
                    Jms.outboundGateway(jmsConnectionFactory,)
                        .requestDestination(message -> message.getHeaders().get(DESTINATION_QUEUE))

            )
  • и outboundGateway. Это означает, что вы отправляете запрос и ожидаете ответа от другой стороны, но похоже, что вы только отправляете сообщение JMS в очередь, и никто на другой стороне слушателя не отвечает вам чем-то в этот response.queue. Это причина того, что вы получаете время, необходимое для обычной публикации JMS.

Вы должны быть уверены, что logi c верен в вашем потоке и действительно действителен в вашем распределенном решении, что вы ожидаете некоторого ответ со стороны сервера.

В противном случае вам нужно подумать об изменении логики c на Jms.outboundAdapter(), который действительно является односторонним отправителем. Для ответа HTTP вы можете использовать publishSubscribeChannel() с этим Jms.outboundAdapter() в качестве первого подписчика, а остальную часть вашего потока - в качестве второго. Таким образом, второго абонента не будут вызывать до тех пор, пока первый абонент не завершит свою логику c должным образом. Для случаев ошибки вы можете заключить это Jms.outboundAdapter() в ExpressionEvaluatingRequestHandlerAdvice: https://docs.spring.io/spring-integration/docs/5.2.3.RELEASE/reference/html/messaging-endpoints.html#message -handler-advice-chain

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...