如何使用Spring Integration处理外部系统的异步文件处理?

时间:2015-07-07 04:19:05

标签: java spring spring-integration dsl

我有一个系统,我需要与需要放在一个文件夹中的文件集成,并将该文件复制到"成功"文件夹或"错误"文件夹取决于是否正确处理。我目前在DSL中定义了一个流程,如此

return f -> f.channel("orders.in")
       .transform(Transformers.marshaller(marshaller(), resultTransformer(), true))
       .handle(Files.outboundAdapter(properties.getInputDirectory()));

网关定义为

@Gateway(requestChannel="orders.in")
public void submitOrder(Order order);

我想要的是一个响应而不是public String submitOrder(Order order),其中返回的String如果成功则是一个订单号,如果失败则返回null。我现在已经玩了几个小时了,如果没有引入AMQ或其他什么但我觉得它应该是可能的,我很难知道如何实现这个目标。我甚至不知道这是否是我最终会使用它的方式,因为我可能会稍后处理响应异步并通过其他方式通知用户,但我很顽固并希望尝试让它工作首先如果可能的话。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您将第二个使用者订阅到变换器和文件适配器之间的通道...

.transform(...)
.publishSubscribeChannel(s -> s
     .subscribe(f -> f.handle(...))
     .subscribe(f -> f ...)); // produce a reply here

在成功写入文件后将调用第二个订阅者,第二个订阅者生成的任何内容将作为方法结果返回到@Gateway

@Gateway(requestChannel="orders.in")
public String submitOrder(Order order);

默认情况下,将向网关调用方抛出失败(异常)。要在失败后获得null,您必须处理网关错误通道上的错误,并且没有来自该流的返回值。