繁体   English   中英

使用 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”有内部依赖性,并且它也被捆绑为我的工件的一部分。

https://docs.spring.io/spring-integration/api/org/springframework/integration/sftp/session/DefaultSftpSessionFactory.html

我正在使用 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$000(AbstractPollingEndpoint.java:55)
        at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:149)
        at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:146)
        at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller$1.run(AbstractPollingEndpoint.java:298)
        at org.springframework.integration.util.ErrorHandlingTaskExecutor$1.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.access$201(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$1.doInSession(AbstractInboundFileSynchronizer.java:173)
        at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizer$1.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 应该已经实现了更好的错误消息 :) 。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM