处理后的Spring集成移动文件

Posted

技术标签:

【中文标题】处理后的Spring集成移动文件【英文标题】:Spring integration move file after processing 【发布时间】:2016-11-16 05:57:47 【问题描述】:

处理文件后如何在spring集成中处理后移动文件..? 我已经按照http://xpadro.blogspot.com/2016/07/spring-integration-polling-file.html实现了文件轮询,但是需要添加onSuccess和OnError跨国事件(不带XML配置)

【问题讨论】:

【参考方案1】:

我不确定您所说的“事务”是什么意思,文件系统通常不是事务性的,但是您可以在流程中向最终消费者添加建议...

@SpringBootApplication
public class So40625031Application 

    public static void main(String[] args) 
        SpringApplication.run(So40625031Application.class, args);
    

    @Bean
    public IntegrationFlow flow() 
        return IntegrationFlows.from(
                    Files.inboundAdapter(new File("/tmp/foo")), e -> e.poller(Pollers.fixedDelay(1000)))
                .transform(Transformers.fileToString())
                .handle("processor", "process", e -> e.advice(advice()))
                .get();
    

    @Bean
    public Processor processor() 
        return new Processor();
    

    @Bean
    public AbstractRequestHandlerAdvice advice() 
        return new AbstractRequestHandlerAdvice() 

            @Override
            protected Object doInvoke(ExecutionCallback callback, Object target, Message<?> message) throws Exception 
                File file = message.getHeaders().get(FileHeaders.ORIGINAL_FILE, File.class);
                try 
                    Object result = callback.execute();
                    file.renameTo(new File("/tmp/bar", file.getName()));
                    System.out.println("File renamed after success");
                    return result;
                
                catch (Exception e) 
                    file.renameTo(new File("/tmp/baz", file.getName()));
                    System.out.println("File renamed after failure");
                    throw e;
                
            
        ;
    

    public static class Processor 

        public void process(String in) 
            System.out.println(in);
        

    


【讨论】:

这正是我要找的。感谢您的解决方案。 当我将 Transformers.fileToString() 替换为 Transformers.fromJson(My.class) 以便直接从文件中读取 JSON 对象时,它不起作用。 JSON 转换器丢失了文件名标头。在from(Files...) 之后添加.enrichHeaders(h -&gt; h.headerExpression(FileHeaders.ORIGINAL_FILE, "payload")) 以使其正常工作。 这太棒了。谢谢

以上是关于处理后的Spring集成移动文件的主要内容,如果未能解决你的问题,请参考以下文章

Spring批处理集成

批量把子文件夹的文件移动至上一层文件夹

在 Spring Batch 步骤中移动 HashMap

移动硬盘恢复数据后的后遗症

将应用程序移动到嵌套文件夹后的 ImportError

如何将 png/jpeg 文件集成到统一移动应用程序项目中