我在一个文件中定义了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
好吧,好像很奇怪。关于堆栈溢出的其他问题
在删除之前添加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网关的文档,但示例代码甚至不可能(它们讨论的是函数中没有的通量,作为初学者,我很难理解那里发生了什么)。