Splitter完成后的后处理

时间:2017-03-08 01:29:48

标签: spring-integration

我正在尝试创建一个集成流程,其中将执行以下操作:

  1. 根据cron表达式调用http rest端点,以获取文件列表和相关属性(如时间戳等)的json响应。
  2. 使用自定义对象映射器将响应转换为Java模型(FileInfo(包含FileProperties列表))。
  3. 使用服务激活器查找带有今天时间戳的FileProperties,如果没有这样的文件,则流程停在这里。
  4. 以上输出用于构建一个http出站网关,进行另一次http休息调用以获取文本文件内容。
  5. 将内容输入拆分器以将内容拆分为行。
  6. 然后使用另一个变换器将每一行转换为Java模型。
  7. 然后使用JPA出站网关将其持久保存到DB中。
  8. 最后需要进行另一次http休息调用以从服务器中删除该文件。
  9. 我已经设计了一个粗略的整合流程,直到第7步:

    <bean id="jsonToFilenamesMapper"/>
    <bean id="sampleFileSplitter"/>
    <bean id="dateBasedFilter"/>
    <bean id="customMapper"/>
    <bean id="em"/>
    <bean id="randomCronTrigger"/>
    <bean id="sampleFileNameSplitter"/>
    <bean id="sampleFileActivator"/>
    
    <int:channel id="input"/>
    <int:channel id="output"/>
    <int:channel id="filenames"/>
    <int:channel id="reply"/>
    <int:channel id="csvout"/>
    <int:channel id="line"/>
    <int:channel id="extractModel"/>
    <int:channel id="afterSaving"/>
    <int:channel id="filename"/>
    
    <int-http:outbound-gateway request-channel="input"
                               reply-channel="output"
                               url=" https://download.com/files/"
                               http-method="GET"
                               expected-response-type="java.lang.String">
    </int-http:outbound-gateway>
    
    <int:inbound-channel-adapter channel="input" expression="''">
        <int:poller trigger="randomCronTrigger">
        </int:poller>
    </int:inbound-channel-adapter>
    
    <int:json-to-object-transformer input-channel="output"
                                    output-channel="filenames"
                                    type="sample.integration.FileInfo"
                                    object-mapper="jsonToFileInfoMapper">
    </int:json-to-object-transformer>
    
    <int:service-activator ref="sampleFileActivator"
                           input-channel="filenames"
                           output-channel="filename">
    </int:service-activator>
    
    <int-http:outbound-gateway request-channel="reply"
                               reply-channel="csvout"
                               url=" https://download.com/files/{filename}"
                               http-method="GET"
                               expected-response-type="java.lang.String">
        <int-http:uri-variable name="filename" expression="payload.filename"/>
    </int-http:outbound-gateway>
    
    <int:splitter input-channel="csvout"
                  output-channel="line"
                  ref="sampleFileSplitter">
    </int:splitter>
    
    <int:json-to-object-transformer input-channel="line"
                                    output-channel="extractModel"
                                    object-mapper="customMapper">
    </int:json-to-object-transformer>
    
    <int-jpa:updating-outbound-gateway request-channel="extractModel"
                                       reply-channel="afterSaving"
                                       persist-mode="PERSIST"
                                       entity-manager="em">
    </int-jpa:updating-outbound-gateway>
    

    所以我的问题是:

    1. 我应该如何实现第8步,我需要知道在调用http端点删除文件之前所有行都保存到DB。
    2. 以上流程是否适合要求或有机会简化?
    3. 使用Java配置/ DSL如何查看上述流程?

1 个答案:

答案 0 :(得分:0)

一切都很好看。你走对了路。

我将分割器的输出通道设为ExecutorChannel,以便让分割的项目并行处理。

您的JPA网关应该向聚合器发送回复。只有聚合器才能执行文件删除。由于之前有分割器,因此只需依赖聚合器的默认值即可。

我认为通过Java DSL表示您的流程没有任何障碍。优点是代码更少,没有额外的渠道。虽然使用此xml配置,但您可以使用<chain>进行简化。