如何使用 Spring 集成处理外部系统的异步文件处理?
How to handle async file processing of external system with Spring Integration?
我有一个需要集成的系统,需要将文件放在一个文件夹中,然后将该文件复制到 "success" 文件夹或 "error" 文件夹,具体取决于是否正确处理.我目前有一个像这样在 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)
,其中返回的字符串如果成功则为订单号,如果失败则为空。我已经玩了几个小时了,我很困惑如何在不引入 AMQ 或其他东西的情况下实现这一点,但我觉得这应该是可能的。我什至不知道这是否是我最终使用它的方式,因为我可能会在以后处理异步响应并通过其他方式通知用户,但我很固执,想尽可能先尝试让它以这种方式工作.任何帮助表示赞赏。
您为第二个消费者订阅了转换器和文件适配器之间的通道...
.transform(...)
.publishSubscribeChannel(s -> s
.subscribe(f -> f.handle(...))
.subscribe(f -> f ...)); // produce a reply here
第二个订阅者将在成功写入文件后调用,第二个订阅者生成的任何内容都将作为方法结果returned 到@Gateway
。
@Gateway(requestChannel="orders.in")
public String submitOrder(Order order);
默认情况下,会向网关调用者抛出一个失败(异常)。要在失败后获得 null,您必须处理网关错误通道上的错误并且没有来自该流的 return 值。
我有一个需要集成的系统,需要将文件放在一个文件夹中,然后将该文件复制到 "success" 文件夹或 "error" 文件夹,具体取决于是否正确处理.我目前有一个像这样在 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)
,其中返回的字符串如果成功则为订单号,如果失败则为空。我已经玩了几个小时了,我很困惑如何在不引入 AMQ 或其他东西的情况下实现这一点,但我觉得这应该是可能的。我什至不知道这是否是我最终使用它的方式,因为我可能会在以后处理异步响应并通过其他方式通知用户,但我很固执,想尽可能先尝试让它以这种方式工作.任何帮助表示赞赏。
您为第二个消费者订阅了转换器和文件适配器之间的通道...
.transform(...)
.publishSubscribeChannel(s -> s
.subscribe(f -> f.handle(...))
.subscribe(f -> f ...)); // produce a reply here
第二个订阅者将在成功写入文件后调用,第二个订阅者生成的任何内容都将作为方法结果returned 到@Gateway
。
@Gateway(requestChannel="orders.in")
public String submitOrder(Order order);
默认情况下,会向网关调用者抛出一个失败(异常)。要在失败后获得 null,您必须处理网关错误通道上的错误并且没有来自该流的 return 值。