0

我花了很多时间弄清楚我的问题出在哪里。我可以在本地运行,我已经在本地构建.jar并运行了它。

我的集成流程设置如下

@Bean
IntegrationFlow integrationFlow(final DataSource datasource) {
return IntegrationFlows.from(
    Ftp.inboundStreamingAdapter(template())
        .remoteDirectory("/folder/")
        .patternFilter("file_name.txt")
        .filter(
            new FtpPersistentAcceptOnceFileListFilter(metadataStore(datasource), "")),
    spec -> spec.poller(Pollers.fixedDelay(5, TimeUnit.SECONDS)))
    .transform(streamToBytes())
    .handle(handler())
    .get()
}

@Bean
FtpRemoteFileTemplate template() {
  return new FtpRemoteFileTemplate(ftpSessionFactory());
}

@Bean
public StreamTransformer streamToBytes() {
  return new StreamTransformer(); // transforms to byte[]
}

@Bean
public ConcurrentMetadataStore metadataStore(final DataSource dataSource) {
  return new JdbcMetadataStore(dataSource);
}

@Bean
public SessionFactory<FTPFile> ftpSessionFactory() {
  DefaultFtpSessionFactory sf = new DefaultFtpSessionFactory();
  sf.setHost(host);
  sf.setPort(port);
  sf.setUsername(userName);
  sf.setPassword(password);
  return sf;
}

我在 application.yml 中设置了数据源和 ftp 信息

当我在本地运行它时,我没有问题。当我使用几个不同的 openjdk 版本(8u181、8u191、11.04)运行gradle build和运行时,我没有任何问题。.jar

当我使用我的文件在 docker 容器内运行时.jar,问题就出现了。

我的码头文件

FROM openjdk:8u212-jdk-alpine
WORKDIR /app

COPY build/libs/app-1.0.jar .

RUN apk add --update ttf-dejavu && rm -rf /var/cache/apk/*

ENTRYPOINT ["java", "-jar", "app-1.0.jar"]

我打开DEBUG并观看输出。

在本地运行并运行 built .jar,我可以看到轮询器正在工作,它会触发对已在我的远程数据库 (postgresql) 中创建的 metadataStore 表的 SQL 查询。

在 docker 容器中运行,我没有看到正在运行的 sql 查询。这告诉我其中的某个地方存在问题。

无论在本地运行、运行 build 还是在 docker 容器中运行,控制台中的调试日志都是相同INFO的 s 和s。有此信息消息可能会有所帮助WARN.jar

Bean with key 'metadataStore' has been registered as an MBean but has no exposed attributes or operations

SessionFactory我通过尝试连接到无效主机来检查是否存在隐藏的连接问题,但我确实在我的 docker 容器中遇到了无效主机的异常。所以我可以自信地说 FTP 连接是有效的并且使用正确的主机和端口运行。

我认为这与轮询器或我的数据源有关。

在这个应用程序内部,我还使用 JDBC 和 JPA 运行 Spring Data Rest,跨不同库使用数据源 bean 会有什么问题吗?

任何帮助或指导将不胜感激。

4

1 回答 1

0

所以默认客户端模式DefaultFtpSessionFactory是“ACTIVE”,但在我的情况下,在 docker 容器内,客户端模式必须设置为“PASSIVE”

为此,我需要添加一行代码,DefaultFtpSessionFactory 您必须将客户端模式设置为2 ...sf.setClientMode(2); 下面是最终的DefaultFtpSessionFactorybean。

@Bean
public SessionFactory<FTPFile> ftpSessionFactory() {
  DefaultFtpSessionFactory sf = new DefaultFtpSessionFactory();
  sf.setHost(host);
  sf.setPort(port);
  sf.setUsername(userName);
  sf.setPassword(password);
  sf.setClientMode(2);

  return sf;
}
于 2020-01-21T20:46:36.183 回答