Spring集成:REST到JMS集成,给出超时错误

时间:2017-06-29 12:04:53

标签: rest spring-integration spring-jms spring-integration-dsl

您好我正在尝试使用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 个答案:

答案 0 :(得分:2)

responseChannel必须为publishSubscribe,您还应该有一个bridge子标记,以便将回复发送回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()标题。