Spring Integration: интеграция 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 без ответа. Мне нужно, чтобы преобразованная полезная нагрузка была помещена в очередь, а также отправлена ​​в ответ для остальной службы. Я не смог найти доступных примеров.

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

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(),

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