使用 spring 集成从 SFTP 服务器读取 excel 文件时出现问题
Issue in reading a excel file from SFTP server using spring integration
我是 Spring 集成方面的新手,所以对于专家来说这可能很愚蠢。
我想每天早上读取 SFTP 服务器上的一个 excel 文件(现在我设置为每分钟读取一次,如下所示)。我已经编写了所有接收 excel 输入流并使用 POI 遍历它的代码。
如果我像从 JSP 上传的那样手动提供文件,那么没问题,一切正常。
但是当我使用下面的代码启用 spring 集成时,它会给我错误。
我发现 "DefaultSftpSessionFactory" 对 "jsch-0.1.51.jar" 具有内在依赖性,并且它也作为我的 artifcact 的一部分进行了捆绑。
我正在使用 spring 4.0.9.
仅供参考,控制在我的 "processFTPFile" 方法之前不会出现。
<bean id="ultiProSftpSessionFactory" class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory">
<property name="host" value="serverhost" />
<property name="user" value="user" />
<property name="password" value="password" />
</bean>
<int-ftp:inbound-channel-adapter id="ftpInboundChannelAdapter" session-factory="ultiProSftpSessionFactory" channel="fileAvailableChannel"
filename-pattern="* Consolidated Report.xlsx"
remote-directory="/folder1/folder2"
preserve-timestamp="true"
local-directory="."
auto-create-local-directory="true"
delete-remote-files="false"
auto-startup="true">
<int:poller cron="0 0/1 * * * *">
</int:poller>
</int-ftp:inbound-channel-adapter>
<int:service-activator id="serviceUpdateTrackingItem" method="processFTPFile" ref="cAPunchDataAdapter" input-channel="fileAvailableChannel" />
<int:publish-subscribe-channel id="fileAvailableChannel"/>
我想在每个文件上执行的代码
@Component("cAPunchDataAdapter")
public class CAPunchDataAdapter {
public void processFTPFile(FTPFile file) {
//Code goes here to get inputstream of file.
}
}
下面是错误日志。
[3/4/19 18:20:00:731 EST] 00002560 SystemErr R [ERROR] LoggingHandler - -org.springframework.messaging.MessagingException: Problem occurred while synchronizing remote to local directory
at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizer.synchronizeToLocalDirectory(AbstractInboundFileSynchronizer.java:209)
at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizingMessageSource.receive(AbstractInboundFileSynchronizingMessageSource.java:167)
at org.springframework.integration.endpoint.SourcePollingChannelAdapter.receiveMessage(SourcePollingChannelAdapter.java:144)
at org.springframework.integration.endpoint.AbstractPollingEndpoint.doPoll(AbstractPollingEndpoint.java:192)
at org.springframework.integration.endpoint.AbstractPollingEndpoint.access[=14=]0(AbstractPollingEndpoint.java:55)
at org.springframework.integration.endpoint.AbstractPollingEndpoint.call(AbstractPollingEndpoint.java:149)
at org.springframework.integration.endpoint.AbstractPollingEndpoint.call(AbstractPollingEndpoint.java:146)
at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller.run(AbstractPollingEndpoint.java:298)
at org.springframework.integration.util.ErrorHandlingTaskExecutor.run(ErrorHandlingTaskExecutor.java:52)
at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
at org.springframework.integration.util.ErrorHandlingTaskExecutor.execute(ErrorHandlingTaskExecutor.java:49)
at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller.run(AbstractPollingEndpoint.java:292)
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:522)
at java.util.concurrent.FutureTask.run(FutureTask.java:277)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access1(ScheduledThreadPoolExecutor.java:191)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1153)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.lang.Thread.run(Thread.java:785)
Caused by: org.springframework.messaging.MessagingException: Failed to execute on session
at org.springframework.integration.file.remote.RemoteFileTemplate.execute(RemoteFileTemplate.java:321)
at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizer.synchronizeToLocalDirectory(AbstractInboundFileSynchronizer.java:167)
... 20 more
Caused by: java.lang.ClassCastException: com.jcraft.jsch.ChannelSftp$LsEntry incompatible with org.apache.commons.net.ftp.FTPFile
at org.springframework.integration.ftp.filters.FtpSimplePatternFileListFilter.getFilename(FtpSimplePatternFileListFilter.java:29)
at org.springframework.integration.file.filters.AbstractSimplePatternFileListFilter.accept(AbstractSimplePatternFileListFilter.java:49)
at org.springframework.integration.file.filters.AbstractFileListFilter.filterFiles(AbstractFileListFilter.java:40)
at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizer.filterFiles(AbstractInboundFileSynchronizer.java:157)
at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizer.doInSession(AbstractInboundFileSynchronizer.java:173)
at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizer.doInSession(AbstractInboundFileSynchronizer.java:167)
at org.springframework.integration.file.remote.RemoteFileTemplate.execute(RemoteFileTemplate.java:312)
... 21 more
JSch 用于 sftp,您正在使用 ftp.
你需要
<int-sftp:inbound-channel-adapter id="ftpInboundChannelAdapter" session-factory="ultiProSftpSessionFactory" channel="fileAvailableCh
(int-sftp:
, 不是 int-ftp:
)
已找到修复程序,没想到会是这样。
已替换
<int-ftp:inbound-channel-adapter
和
<int-sftp:inbound-channel-adapter
Spring 应该实施更好的错误消息 :) .
我是 Spring 集成方面的新手,所以对于专家来说这可能很愚蠢。
我想每天早上读取 SFTP 服务器上的一个 excel 文件(现在我设置为每分钟读取一次,如下所示)。我已经编写了所有接收 excel 输入流并使用 POI 遍历它的代码。
如果我像从 JSP 上传的那样手动提供文件,那么没问题,一切正常。
但是当我使用下面的代码启用 spring 集成时,它会给我错误。
我发现 "DefaultSftpSessionFactory" 对 "jsch-0.1.51.jar" 具有内在依赖性,并且它也作为我的 artifcact 的一部分进行了捆绑。
我正在使用 spring 4.0.9.
仅供参考,控制在我的 "processFTPFile" 方法之前不会出现。
<bean id="ultiProSftpSessionFactory" class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory">
<property name="host" value="serverhost" />
<property name="user" value="user" />
<property name="password" value="password" />
</bean>
<int-ftp:inbound-channel-adapter id="ftpInboundChannelAdapter" session-factory="ultiProSftpSessionFactory" channel="fileAvailableChannel"
filename-pattern="* Consolidated Report.xlsx"
remote-directory="/folder1/folder2"
preserve-timestamp="true"
local-directory="."
auto-create-local-directory="true"
delete-remote-files="false"
auto-startup="true">
<int:poller cron="0 0/1 * * * *">
</int:poller>
</int-ftp:inbound-channel-adapter>
<int:service-activator id="serviceUpdateTrackingItem" method="processFTPFile" ref="cAPunchDataAdapter" input-channel="fileAvailableChannel" />
<int:publish-subscribe-channel id="fileAvailableChannel"/>
我想在每个文件上执行的代码
@Component("cAPunchDataAdapter")
public class CAPunchDataAdapter {
public void processFTPFile(FTPFile file) {
//Code goes here to get inputstream of file.
}
}
下面是错误日志。
[3/4/19 18:20:00:731 EST] 00002560 SystemErr R [ERROR] LoggingHandler - -org.springframework.messaging.MessagingException: Problem occurred while synchronizing remote to local directory
at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizer.synchronizeToLocalDirectory(AbstractInboundFileSynchronizer.java:209)
at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizingMessageSource.receive(AbstractInboundFileSynchronizingMessageSource.java:167)
at org.springframework.integration.endpoint.SourcePollingChannelAdapter.receiveMessage(SourcePollingChannelAdapter.java:144)
at org.springframework.integration.endpoint.AbstractPollingEndpoint.doPoll(AbstractPollingEndpoint.java:192)
at org.springframework.integration.endpoint.AbstractPollingEndpoint.access[=14=]0(AbstractPollingEndpoint.java:55)
at org.springframework.integration.endpoint.AbstractPollingEndpoint.call(AbstractPollingEndpoint.java:149)
at org.springframework.integration.endpoint.AbstractPollingEndpoint.call(AbstractPollingEndpoint.java:146)
at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller.run(AbstractPollingEndpoint.java:298)
at org.springframework.integration.util.ErrorHandlingTaskExecutor.run(ErrorHandlingTaskExecutor.java:52)
at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
at org.springframework.integration.util.ErrorHandlingTaskExecutor.execute(ErrorHandlingTaskExecutor.java:49)
at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller.run(AbstractPollingEndpoint.java:292)
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:522)
at java.util.concurrent.FutureTask.run(FutureTask.java:277)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access1(ScheduledThreadPoolExecutor.java:191)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1153)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.lang.Thread.run(Thread.java:785)
Caused by: org.springframework.messaging.MessagingException: Failed to execute on session
at org.springframework.integration.file.remote.RemoteFileTemplate.execute(RemoteFileTemplate.java:321)
at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizer.synchronizeToLocalDirectory(AbstractInboundFileSynchronizer.java:167)
... 20 more
Caused by: java.lang.ClassCastException: com.jcraft.jsch.ChannelSftp$LsEntry incompatible with org.apache.commons.net.ftp.FTPFile
at org.springframework.integration.ftp.filters.FtpSimplePatternFileListFilter.getFilename(FtpSimplePatternFileListFilter.java:29)
at org.springframework.integration.file.filters.AbstractSimplePatternFileListFilter.accept(AbstractSimplePatternFileListFilter.java:49)
at org.springframework.integration.file.filters.AbstractFileListFilter.filterFiles(AbstractFileListFilter.java:40)
at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizer.filterFiles(AbstractInboundFileSynchronizer.java:157)
at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizer.doInSession(AbstractInboundFileSynchronizer.java:173)
at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizer.doInSession(AbstractInboundFileSynchronizer.java:167)
at org.springframework.integration.file.remote.RemoteFileTemplate.execute(RemoteFileTemplate.java:312)
... 21 more
JSch 用于 sftp,您正在使用 ftp.
你需要
<int-sftp:inbound-channel-adapter id="ftpInboundChannelAdapter" session-factory="ultiProSftpSessionFactory" channel="fileAvailableCh
(int-sftp:
, 不是 int-ftp:
)
已找到修复程序,没想到会是这样。
已替换
<int-ftp:inbound-channel-adapter
和
<int-sftp:inbound-channel-adapter
Spring 应该实施更好的错误消息 :) .