1

您好我正在尝试使用 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 服务超时,没有回复。我需要将转换后的有效负载放入队列中,并将其发送到其余服务的响应中。我找不到任何可用的示例。

任何帮助表示赞赏。

4

1 回答 1

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()添加为 that 的最后一个(在我们的例子中是第二个)订阅者publishSubscribeChannel()

BridgeHandler将其回复发送到replyChannelHttp.inboundGateway().

于 2017-06-29T13:00:41.603 回答