Java spring sftp入站适配器的问题

Java spring sftp入站适配器的问题,java,spring,sftp,spring-integration,Java,Spring,Sftp,Spring Integration,我需要从SFTP位置收集文件,并定期将其放入本地输入目录。传输文件后,将从SFTP位置删除该文件。对于触发器,我使用一个定制的Cron触发器,在该触发器中我动态地更改间隔。下面是context.xml中的条目和CustomCronTrigger类的代码 <bean id="sftpSessionFactory" class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory"> <

我需要从SFTP位置收集文件,并定期将其放入本地输入目录。传输文件后,将从SFTP位置删除该文件。对于触发器,我使用一个定制的Cron触发器,在该触发器中我动态地更改间隔。下面是context.xml中的条目和CustomCronTrigger类的代码

<bean id="sftpSessionFactory" class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory">
    <property name="host" value="127.0.0.1"/>
    <property name="port" value="22"/>
    <property name="user" value="user"/>
    <property name="password" value="passwd"/>
</bean>

<int-sftp:inbound-channel-adapter id="sftpInboundAdapter"
        channel="receiveChannel" 
        session-factory="sftpSessionFactory" 
        local-directory="/home/sftpUser"
        remote-directory="/home/input"
        delete-remote-files="true"
        auto-create-local-directory="true"
        filename-pattern="*.csv"
        >
    <int:poller trigger="customCronTrigger"/>

</int-sftp:inbound-channel-adapter>

<int:channel id="receiveChannel">
    <int:queue/>
</int:channel>
public class CustomCronTrigger implements Trigger{

    private CronSequenceGenerator sequenceGenerator;

    private String intervalInMin;

    public void setIntervalInMin(String intervalInMin) throws Exception
    {
        this.intervalInMin = intervalInMin;
        createCronExpression();
    }

    /** The logger instance */
    private Logger logger = LoggerFactory.getLogger(getClass());

    public CronSequenceGenerator getSequenceGenerator() {
        return sequenceGenerator;
    }

    public void createCronExpression() throws Exception {
        String cronExpression = getCronExpression(intervalInMin);
        logger.debug("CustomCronTrigger.setSequenceGeneratorStr()::cronExpression="+cronExpression);
        this.sequenceGenerator = new CronSequenceGenerator(cronExpression, TimeZone.getDefault());
    }

    public Date nextExecutionTime(TriggerContext triggerContext) {
        Date date = triggerContext.lastCompletionTime();
        if (date != null) {
            Date scheduled = triggerContext.lastScheduledExecutionTime();
            if (scheduled != null && date.before(scheduled)) {
                // Previous task apparently executed too early...
                // Let's simply use the last calculated execution time then,
                // in order to prevent accidental re-fires in the same second.
                date = scheduled;
            }
        }
        else {
            date = new Date();
        }
        return this.sequenceGenerator.next(date);
    }

    public String getCronExpression(String min) throws Exception
    {
        if(Integer.parseInt(min)<0 || Integer.parseInt(min)>59 )
        {
            throw new Exception(String.format("Minute %s not valid. Please enter minute between 0-59",min));
        }
        String cronExpression = "0 0/"+min+" * * * ?";
        return cronExpression;
    }


    @Override
    public boolean equals(Object obj) {
        return (this == obj || (obj instanceof CustomCronTrigger &&
                this.sequenceGenerator.equals(((CustomCronTrigger) obj).sequenceGenerator)));
    }

    @Override
    public int hashCode() {
        return this.sequenceGenerator.hashCode();
    }

    @Override
    public String toString() {
        return this.sequenceGenerator.toString();
    }
}

请建议替代方案,因为我对这个问题束手无策。

不清楚您所说的“在连续的时间间隔内,文件不会被传输,只有在一些时间间隔后才会被传输”是什么意思

public class CustomCronTrigger implements Trigger{

    private CronSequenceGenerator sequenceGenerator;

    private String intervalInMin;

    public void setIntervalInMin(String intervalInMin) throws Exception
    {
        this.intervalInMin = intervalInMin;
        createCronExpression();
    }

    /** The logger instance */
    private Logger logger = LoggerFactory.getLogger(getClass());

    public CronSequenceGenerator getSequenceGenerator() {
        return sequenceGenerator;
    }

    public void createCronExpression() throws Exception {
        String cronExpression = getCronExpression(intervalInMin);
        logger.debug("CustomCronTrigger.setSequenceGeneratorStr()::cronExpression="+cronExpression);
        this.sequenceGenerator = new CronSequenceGenerator(cronExpression, TimeZone.getDefault());
    }

    public Date nextExecutionTime(TriggerContext triggerContext) {
        Date date = triggerContext.lastCompletionTime();
        if (date != null) {
            Date scheduled = triggerContext.lastScheduledExecutionTime();
            if (scheduled != null && date.before(scheduled)) {
                // Previous task apparently executed too early...
                // Let's simply use the last calculated execution time then,
                // in order to prevent accidental re-fires in the same second.
                date = scheduled;
            }
        }
        else {
            date = new Date();
        }
        return this.sequenceGenerator.next(date);
    }

    public String getCronExpression(String min) throws Exception
    {
        if(Integer.parseInt(min)<0 || Integer.parseInt(min)>59 )
        {
            throw new Exception(String.format("Minute %s not valid. Please enter minute between 0-59",min));
        }
        String cronExpression = "0 0/"+min+" * * * ?";
        return cronExpression;
    }


    @Override
    public boolean equals(Object obj) {
        return (this == obj || (obj instanceof CustomCronTrigger &&
                this.sequenceGenerator.equals(((CustomCronTrigger) obj).sequenceGenerator)));
    }

    @Override
    public int hashCode() {
        return this.sequenceGenerator.hashCode();
    }

    @Override
    public String toString() {
        return this.sequenceGenerator.toString();
    }
}

请注意,如果您希望传输具有相同名称的文件,它将无法工作,因为默认的本地筛选器将不允许为其生成消息。即将发布的3.0版本有一个新的
本地过滤器
属性来更改该行为,或者您可以使用网关,正如我在中所建议的那样。

“在连续的时间间隔上,文件不会被传输,并且仅在一些时间间隔后才被传输”。我的意思是,如果在第一个时间间隔内传输了5个文件,并且时间间隔为1分钟,那么下一组文件仅在4分钟后传输。这是一个意外的输出,因为它应在1分钟后传输下一组。
public class CustomCronTrigger implements Trigger{

    private CronSequenceGenerator sequenceGenerator;

    private String intervalInMin;

    public void setIntervalInMin(String intervalInMin) throws Exception
    {
        this.intervalInMin = intervalInMin;
        createCronExpression();
    }

    /** The logger instance */
    private Logger logger = LoggerFactory.getLogger(getClass());

    public CronSequenceGenerator getSequenceGenerator() {
        return sequenceGenerator;
    }

    public void createCronExpression() throws Exception {
        String cronExpression = getCronExpression(intervalInMin);
        logger.debug("CustomCronTrigger.setSequenceGeneratorStr()::cronExpression="+cronExpression);
        this.sequenceGenerator = new CronSequenceGenerator(cronExpression, TimeZone.getDefault());
    }

    public Date nextExecutionTime(TriggerContext triggerContext) {
        Date date = triggerContext.lastCompletionTime();
        if (date != null) {
            Date scheduled = triggerContext.lastScheduledExecutionTime();
            if (scheduled != null && date.before(scheduled)) {
                // Previous task apparently executed too early...
                // Let's simply use the last calculated execution time then,
                // in order to prevent accidental re-fires in the same second.
                date = scheduled;
            }
        }
        else {
            date = new Date();
        }
        return this.sequenceGenerator.next(date);
    }

    public String getCronExpression(String min) throws Exception
    {
        if(Integer.parseInt(min)<0 || Integer.parseInt(min)>59 )
        {
            throw new Exception(String.format("Minute %s not valid. Please enter minute between 0-59",min));
        }
        String cronExpression = "0 0/"+min+" * * * ?";
        return cronExpression;
    }


    @Override
    public boolean equals(Object obj) {
        return (this == obj || (obj instanceof CustomCronTrigger &&
                this.sequenceGenerator.equals(((CustomCronTrigger) obj).sequenceGenerator)));
    }

    @Override
    public int hashCode() {
        return this.sequenceGenerator.hashCode();
    }

    @Override
    public String toString() {
        return this.sequenceGenerator.toString();
    }
}