Sftp入站适配器的LastModifiedFileListFilter

问题描述

我正在尝试实现LastModifiedFileListFilter,因为似乎没有类似的过滤器适用于spring-integration-sftp,但对于5.3.2版本,我试图从spring-integration-s复制LastModifiedFileListFilter文件,但放弃回调无效。这是我的实现:

@Slf4j
@Data
public class LastModifiedLsEntryFileListFilter implements discardAwareFileListFilter<ChannelSftp.LsEntry> {

  private static final long ONE_SECOND = 1000;

  private static final long DEFAULT_AGE = 30;

  private volatile long age = DEFAULT_AGE;

  @Nullable
  private Consumer<ChannelSftp.LsEntry> discardCallback;

  public LastModifiedLsEntryFileListFilter(final long age) {
    this.age = age;
  }

  @Override
  public List<ChannelSftp.LsEntry> filterFiles(final ChannelSftp.LsEntry[] files) {

    final List<ChannelSftp.LsEntry> list = new ArrayList<>();
    final long Now = System.currentTimeMillis() / ONE_SECOND;

    for (final ChannelSftp.LsEntry file : files) {

      if (this.fileIsAged(file,Now)) {
        log.info("File [{}] is aged...",file.getFilename());

        list.add(file);
      } else if (this.discardCallback != null) {
        log.info("File [{}] is still being uploaded...",file.getFilename());
        this.discardCallback.accept(file);
      }
    }
    return list;
  }

  @Override
  public boolean accept(final ChannelSftp.LsEntry file) {
    if (this.fileIsAged(file,System.currentTimeMillis() / ONE_SECOND)) {
      return true;
    }
    else if (this.discardCallback != null) {
      this.discardCallback.accept(file);
    }
    return false;
  }

  private boolean fileIsAged(final ChannelSftp.LsEntry file,final long Now) {
    return file.getAttrs().getMTime() + this.age <= Now;
  }

  @Override
  public void adddiscardCallback(@Nullable final Consumer<ChannelSftp.LsEntry> discardCallbackToSet) {
    this.discardCallback = discardCallbackToSet;
  }
}

过滤器能够正确识别文件的生存期并丢弃它,但是该文件未重试,我认为这是丢弃回调的一部分。 我想我的问题是如何设置丢弃回调以继续重试丢弃的文件,直到文件ages。谢谢

解决方法

未重试,我认为这是丢弃回调的一部分。

我想知道是什么让你这样想...

FileReadingMessageSource及其WatchService选项具有如下逻辑:

if (filter instanceof DiscardAwareFileListFilter) {
            ((DiscardAwareFileListFilter<File>) filter).addDiscardCallback(this.filesToPoll::add);
        }

并不意味着SFTP实现类似。

仍然可以重试:在下一次轮询中,将再次检查未接受的文件。

您可能不显示其他使用的过滤器,并且文件在此LastModifiedLsEntryFileListFilter之前被过滤掉,例如SftpPersistentAcceptOnceFileListFilter。您需要考虑将“最后修改的”作为链中的第一个。

如果您不打算从外部支持丢弃回调,则可能根本不需要实现DiscardAwareFileListFilter

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...