当前位置: 首页 > 知识库问答 >
问题:

无法删除Spring集成流中的通知中的文件资源

钱俊楚
2023-03-14

我在一个文件中定义了3个流,以轮询tif文件并将其发送到一个通道。该通道链接到另一个流,该流在相同位置转换并复制成pdf文件。然后第三个流FTP是pdf文件。链接到ftp流的通知,其中tif和pdf文件都要在成功表达式后删除:

@Bean
public IntegrationFlow rtwInflow() {
    return IntegrationFlows
            .from(rtwTifFileSharePoller()
                    , e -> e.poller(Pollers.fixedDelay(15000)))
            .channel(tifToPdfConverterChannel())
            .get();
}

@Bean
public IntegrationFlow rtwTransformFlow() {
    return IntegrationFlows
            .from(tifToPdfConverterChannel())
            .transform(pdfTransfomer)
            .log()
            .get();
}

@Bean
public IntegrationFlow rtwFtpFlow() {
    return IntegrationFlows
            .from(rtwPdfFileSharePoller()
                    , e -> e.poller(Pollers.fixedDelay(15000)))
            .handle(ftpOutboundHandler(), out -> out.advice(after()))
            .get();
}

这个建议看起来像是:

@Bean
public ExpressionEvaluatingRequestHandlerAdvice after() {
    logger.debug("Evaluating expression advice. ");
    ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
    advice.setOnFailureExpressionString("#root");
    advice.setOnSuccessExpressionString("#root");
    advice.setSuccessChannel(rtwSourceDeletionChannel());
    advice.setFailureChannel(rtwFtpFailureHandleChannel());
    advice.setPropagateEvaluationFailures(true);
    return advice;
}

pdf文件ftp成功后的流转移到rtwSourceDeletionChannel(),后者执行以下操作:

@Bean
@SuppressWarnings("unchecked")
public IntegrationFlow rtwSourceDeleteAfterFtpFlow() {
    return IntegrationFlows
            .from(this.rtwSourceDeletionChannel())
            .handle(msg -> {
                    logger.info("Deleting files at source and transformed objects. ");

                    Message<File> requestedMsg = (Message<File>) msg.getPayload();
                    String fileName = (String) requestedMsg.getHeaders().get(FileHeaders.FILENAME); 
                    String fileNameWithoutExtn = fileName.substring(0, fileName.lastIndexOf(".")); 

                    logger.info("payload: " + msg.getPayload());
                    logger.info("fileNameWithoutExtn: " + fileNameWithoutExtn);

                    // delete both pdf and tif files. 
                    File tifFile = new File(rtwSharedPath + File.separator + fileNameWithoutExtn + ".tif");
                    File pdfFile = new File(rtwSharedPath + File.separator + fileNameWithoutExtn + ".pdf");

                    while (!tifFile.isDirectory() && tifFile.exists()) {
                        logger.info("Tif Delete status: " + tifFile.delete());
                        try {
                            Thread.sleep(5000);
                        } catch (InterruptedException e) {
                        } 
                    }
                    while (!pdfFile.isDirectory() && pdfFile.exists()) {
                        logger.info("PDF Delete status: " + pdfFile.delete());
                        try {
                            Thread.sleep(5000);
                        } catch (InterruptedException e) {
                        } 
                    }
            })
            .get();
}

我得到的输出如下,其中tif文件被锁定。使用files.delete()给我的例外情况是,另一个进程正在使用文件。

2019-02-14 21:06:48.882  INFO 972 --- [ask-scheduler-1] nsfomer$$EnhancerBySpringCGLIB$$c667e8e1 : transformed path: \\localhost\atala-capture-upload\45937.pdf
2019-02-14 21:06:48.898  INFO 972 --- [ask-scheduler-1] o.s.integration.handler.LoggingHandler   : GenericMessage [payload=145937.pdf, headers={file_originalFile=\\localhost\atala-capture-upload\145937.tif, id=077ad304-efe5-7af5-ed07-17f909f9b0e1, file_name=145937.tif, file_relativePath=145937.tif, timestamp=1550178408898}]
2019-02-14 21:06:53.765  INFO 972 --- [ask-scheduler-2] TWFlows$$EnhancerBySpringCGLIB$$4905989f : Tif Delete status: false
2019-02-14 21:06:58.774  INFO 972 --- [ask-scheduler-2] TWFlows$$EnhancerBySpringCGLIB$$4905989f : Tif Delete status: false
2019-02-14 21:07:03.782  INFO 972 --- [ask-scheduler-2] TWFlows$$EnhancerBySpringCGLIB$$4905989f : Tif Delete status: false
2019-02-14 21:07:08.791  INFO 972 --- [ask-scheduler-2] TWFlows$$EnhancerBySpringCGLIB$$4905989f : Tif Delete status: false
2019-02-14 21:07:13.800  INFO 972 --- [ask-scheduler-2] TWFlows$$EnhancerBySpringCGLIB$$4905989f : Tif Delete status: false

共有1个答案

仰翰采
2023-03-14

好吧,好像很奇怪。关于堆栈溢出的其他问题

在删除之前添加system.gc()可以解决此问题!

 类似资料:
  • 我有一个spring集成文件,使用入站适配器从本地目录读取一些文件,然后将其存储在CouchDB中。我最终会想删除它。在我的属性文件中,我使用了delete.source.files=true。然而,这似乎不起作用。我在其他stackflow问题中读到,我可以使用ExpressionEvaluatingRequestHandlerAdvice。我将它与inboundchanneladapter一起

  • 我想写一个DSL路由,当删除目录“src/main/resources”中任何扩展名为“.log”的文件时,我想通知Camel。 谢谢你的帮助!瑞达

  • 我需要一个http入站流通道,类似于ftp流适配器通道(http://docs.spring.io/spring-integration/docs/4.3.9.RELEASE/reference/html/ftp.html#ftp-流媒体)但我找不到,SI支持吗?如果不是,是否有可能解决问题? 我需要从http流通道接收soap消息,使用SAX转换消息,然后将其发送到http出站流通道

  • 无法从外壳中删除集合, 集合可用并且我的 php 脚本正在访问它的东西(选择|更新) 但当我使用: 它给了我一个错误:

  • 本文向大家介绍Linux中文件/文件夹无法删除的解决方案,包括了Linux中文件/文件夹无法删除的解决方案的使用技巧和注意事项,需要的朋友参考一下 前言 最近我们的服务器被黑客攻击,然后有些文件的属性被修改,导致我们无法删除病毒文件,同时采用 root 用户也无法删除,现在把解决方案记录下来。 普通删除 如果文件是当前用户的,那么使用 rm 命令就可以删除 如果无法删除,则尝试使用 root 用户

  • 我尝试在Spring集成中访问flux对象,而不将流声明拆分为两个函数。我想知道如何执行以下操作: 我不介意将我在评论中提到的通量操作转移到另一个类(可能是为了作为某种网关),但对我来说,从同一个函数启动和流显然非常重要,因此它将非常清晰易读,能够理解我在应用程序中所做的事情。我看到了Monos网关的文档,但示例代码甚至不可能(它们讨论的是函数中没有的通量,作为初学者,我很难理解那里发生了什么)。