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

Spring Integration : REST to JMS integration giving timeout error

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

感谢任何帮助。

responseChannel 必须是 publishSubscribe 并且您应该再有一个 bridge 订阅者以便将回复发送回 HTTP 入站网关。 one-way 组件中的 Jms.outboundAdapter() 不产生任何回复。这就是您的流程停止并且不响应入口点的方式。

你的use-case可以这样写:

@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 header,Http.inboundGateway()