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