我是 Spring Integration 包的新手,發現了有關如何解決該問題的不同建議。到目前為止,我只找到了一個有效的方法,但我不確定它是否正確或為什么它會產生一個已記錄的錯誤(即使檔案已按我的預期被提取和重命名)。
這個用例是我的系統需要一個“temp_”前綴來忽略部分下載的檔案。我發現即使可以更改默認的“.writing”,它也只能用作后綴。
這是我使用的配置:
SftpInboundChannelAdapterSpec integrationFlow = Sftp.inboundAdapter(sftpSessionFactory)
.filter(chainFilter)
.localFilename(temp_::concat)
.remoteDirectory(remoteDirectory)
.deleteRemoteFiles(false)
.preserveTimestamp(true)
.localDirectory(new File(localDirectory));
return IntegrationFlows
.from(integrationFlow, pc -> pc.poller(pm -> pm.cron(cron).maxMessagesPerPoll(1).errorHandler(new SftpUtils.SftpErrorHandler())))
.transform((File f) -> f.getName().contains(temp_) ?
f.renameTo(new File(f.getParent(), f.getName().replace(temp_, ""))) :
null)
.handle((transformResult, messageHeaders) -> {
log.info("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ({}): {}", localDirectory, transformResult);
return null;
})
.get();
并產生錯誤:
SftpErrorHandler: Error occured in SFTP ingestion flow, exception: nested exception is org.springframework.integration.handler.ReplyRequiredException: No reply produced by handler 'leapInboundFlow.org.springframework.integration.config.ConsumerEndpointFactoryBean#0', and its 'requiresReply' property is set to true., failedMessage=GenericMessage [payload=src\main\resources\input\genericfile.name, headers={file_originalFile=src\main\resources\input\genericfile.name, id=293a3e85-cd62-37f7-b701-bbacbf27a83f, file_name=genericfile.name, file_relativePath=genericfile.name, timestamp=1668518160014}]
uj5u.com熱心網友回復:
你的問題在這里:
.transform((File f) -> f.getName().contains(temp_) ?
f.renameTo(new File(f.getParent(), f.getName().replace(temp_, ""))) :
null)
這transformer是一個請求-回復端點,它不允許null作為回復。
您在這里的邏輯并不完全清楚。讓我們忘記你不能回來null!這絕對是錯誤的,必須以這種或其他方式解決。
你到底想從這個變壓器回傳什么?可能您的愿望只是重命名該檔案,然后使用該重命名的檔案繼續下游?
可能你想要這樣的東西:
.transform((File f) ->
{
if (f.getName().contains(temp_)) {
f.renameTo(new File(f.getParent(), f.getName().replace(temp_, "")));
}
return f;
})
?
抱歉,從您的問題內容中不清楚什么是業務任務,但我希望我解釋了為什么會出現您的錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/534305.html
上一篇:將型別“java.lang.String”的屬性值轉換為屬性“onFailureExpression”所需的型別“org.springframework.expression.Expression”
下一篇:在測驗用例運行中禁用SQS偵聽器
