如何使用MarshallingWebServiceInboundGateway(与Spring Integration DSL)公开SOAP Web服务

时间:2019-05-15 14:40:59

标签: spring-integration spring-integration-dsl

我正在努力使用Spring Integration

寻找MarshallingWebServiceInboundGateway的很好的例子

我整理了一个工作示例,该示例使用MarshallingWebServiceInboundGateway公开了Order服务,当调用该示例时,它使用MarshallingWebServiceOutboundGateway消耗了订单明细服务

https://github.com/yortch/spring-integration-demo/blob/outboundgateway/services/order-flow/src/main/java/com/demo/integration/order/OrderEndpoint.java

    @ServiceActivator(inputChannel= ChannelNames.ORDER_INVOCATION, outputChannel = ChannelNames.ORDER_DETAIL_REQUEST_BUILDER)
    OrderRequest getOrder(OrderRequest orderRequest) {
        return orderRequest;
    }

这在某种程度上是可行的,但是我对以下方法的期望是这应该是Web服务方法的签名,即返回OrderResponse类型。当我通过调用其他POJO手动构建OrderResponse时,这种方式最初是通过这种方式工作的,但是我无法弄清楚如何保留原始Web服务方法签名并在内部使用Spring Integration进行实现,即通过调用渠道进行转换,然后调用订单明细服务(使用MarshallingWebServiceOutboundGateway)。

如果您知道执行此操作的任何代码示例,请分享。我遇到了这个问题,但这是直接建立响应(不使用Spring Integration渠道):https://bitbucket.org/tomask79/spring-boot-webservice-integration/src/master/

1 个答案:

答案 0 :(得分:0)

听起来有些误解,什么是Spring Integration流及其端点如何工作。

  1. Spring Integration中的三个头等公民:MessageChannelEndpoint
  2. 端点通过通道连接
  3. 端点从其输入通道消费消息
  4. 端点可能会由于计算结果而在输出通道中产生消息。

因此,您要公开一个SOAP服务,该服务将在内部调用另一个SOAP服务。

您已经正确地开始使用MarshallingWebServiceInboundGateway。我猜想这会在其通道中产生一个OrderRequest对象。它期望OrderResponse中有一个replyChannel(标头中的显式或临时)。我不确定您的getOrder()会做什么,但是如果还存在一个变压器和MarshallingWebServiceOutboundGateway,则需要考虑将它们全部连接到流中。因此,我认为您的服务成果应转到作为变压器输入的通道。此变压器的输出应转到MarshallingWebServiceOutboundGateway。并且此网关的结果可能会转到其他一些转换器以构建OrderResponse,而该MarshallingWebServiceInboundGateway可能会进入migrants<-sqldf("select count(*),CONSOLIDATING_PLAN_CODE from data_01 where MIGRATION ='yes' group by CONSOLIDATING_PLAN_CODE") non_migrants_FL<-sqldf(sprintf("select * from data_01 where CONSOLIDATING_PLAN_CODE = 'FL' order by RANDOM() limit %d", round(nrow(data_01[which(data_01$CONSOLIDATING_PLAN_CODE=='FL' & data_01$MIGRATION=='no'),]) * 0.4, 0))) non_migrants_IL<-sqldf(sprintf("select * from data_01 where CONSOLIDATING_PLAN_CODE = 'IL' order by RANDOM() limit %d", round(nrow(data_01[which(data_01$CONSOLIDATING_PLAN_CODE=='IL' & data_01$MIGRATION=='no'),]) * 0.13, 0))) non_migrants_KA<-sqldf(sprintf("select * from data_01 where CONSOLIDATING_PLAN_CODE = 'KA' order by RANDOM() limit %d", round(nrow(data_01[which(data_01$CONSOLIDATING_PLAN_CODE=='KA' & data_01$MIGRATION=='no'),]) * 0.19, 0))) 的回复通道。

如果这不是您期望的解释,那么我将要求您重新表达您的问题...