我花了很多时间弄清楚我的问题出在哪里。我可以在本地运行,我已经在本地构建.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 会有什么问题吗?
任何帮助或指导将不胜感激。