Интеграция Spring: интеграция REST с JMS дает ошибку тайм-аута

Привет, я пытаюсь реализовать следующий поток, используя Spring Integration. Откройте службу REST, управляйте полезной нагрузкой, запишите измененную полезную нагрузку в JMS и ответьте обратно службе REST.

@Bean
public IntegrationFlow httpInputFlow() {
    return IntegrationFlows
            .from(Http.inboundGateway(“/company”)
                     .requestMapping(r -> r
                             .methods(HttpMethod.POST))
                    .requestPayloadType(com.poc.model.Company.class))
            .transform(jsonToObjectTransformer())
            .channel(requestChannel())
            .get();
}

@Bean
@Transformer(inputChannel=“requestChannel”, outputChannel=“responseChannel”)
ObjectToJsonTransformer jsonToObjectTransformer() {
    return new ObjectToJsonTransformer();
}
@Bean
public DirectChannel requestChannel() {
    return MessageChannels.direct().get();
}
@Bean
public DirectChannel responseChannel() {
    return MessageChannels.direct().get();
}
@Bean
IntegrationFlow outboundFlow() throws Exception {
    return IntegrationFlows.from(responseChannel()) .handle(Jms.outboundAdapter(connectionFactory()).destination(“samplequeue”))
            .get();
}

Полезные данные запроса достигают очереди. Однако время ожидания службы REST без ответа. Мне нужно, чтобы преобразованная полезная нагрузка была помещена в очередь, а также отправлена ​​в ответ для остальной службы. Я не нашел доступных примеров.

Любая помощь приветствуется.


person jack    schedule 29.06.2017    source источник


Ответы (1)


responseChannel должен быть publishSubscribe, и у вас должен быть еще один bridge subscrbiber для отправки ответа на входящий HTTP-шлюз. Jms.outboundAdapter() является односторонним компонентом и не дает никаких ответов. Вот так ваш поток останавливается и не реагирует на точку входа.

Ваш вариант использования можно записать так:

@Bean
public IntegrationFlow httpInputFlow() {
    return IntegrationFlows
            .from(Http.inboundGateway("/company")
                    .requestMapping(r -> r
                            .methods(HttpMethod.POST))
                    .reqestPayloadType(com.poc.model.Company.class))
            .transform(jsonToObjectTransformer())
            .publishSubscribeChannel(subscribers ->
                    subscribers.subscribe(f -> f
                        .handle(Jms.outboundAdapter(connectionFactory()).destination("samplequeue"))))
            .bridge(null)
            .get();
}

publishSubscribeChannel() обеспечивает необходимый канал. subscribers.subscribe() добавьте этого Jms.outboundAdapter() в качестве первого подписчика. .bridge() добавляется в качестве последнего (в нашем случае второго) подписчика к этому publishSubscribeChannel().

Идея, лежащая в основе BridgeHandler, состоит в том, чтобы отправить свой ответ на заголовок replyChannel, который заполняется Http.inboundGateway().

person Artem Bilan    schedule 29.06.2017
comment
подскажите, как передать обработчик моста в .bridge ()? Метод моста ожидает Consumer ‹GenericEndpointSpec ‹BridgeHandler›› в качестве аргумента. И образцы находятся в xml, а не в java dsl. - person jack; 29.06.2017
comment
Должен быть .brdige(null). Мы добавили .bridge() без аргументов после переноса Java DSL в Spring Integration Core в 5.0. - person Artem Bilan; 29.06.2017