Spring Integration FTP в контейнере Docker: поток не запускается - PullRequest
0 голосов
/ 15 января 2020

Я довольно долго выясняю, откуда возникла моя проблема. Я могу работать локально, я собрал свой .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;
}

У меня есть источник данных и мой набор информации ftp в моем application.yml

Когда я запускаю это локально, у меня нет проблем. Когда я запускаю gradle build и запускаю .jar с несколькими различными версиями openjdk (8u181, 8u191, 11.04), у меня нет проблем.

Когда я запускаю внутри контейнера docker, используя мой файл .jar, возникает проблема.

Мой docker файл

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 и посмотрел вывод.

Работая локально и запуская встроенный .jar, я вижу, что работает поллер и он запускает запросы SQL к таблице metadataStore, которая была создана в моей удаленной базе данных (postgresql).

Работая в контейнере docker, я не вижу запущенных запросов sql. что говорит мне, что где-то в этом заключается проблема.

При отладке при запуске мои журналы в консоли совпадают с INFO s и WARN s независимо от того, работают ли они локально, запускают встроенный .jar или работают в контейнере docker. Есть это информационное сообщение, которое может помочь:

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

Я проверил, может ли быть скрытая проблема с подключением SessionFactory, пытаясь подключиться к неверному хосту, но я действительно получаю исключения в мой docker контейнер для неверного хоста. Поэтому я могу с уверенностью сказать, что FTP-соединение корректно и работает с правильным хостом и портом.

Я думаю, что это связано либо с опросником, либо с моим источником данных.

Внутри этого приложения я также запускаю Spring Data Rest с использованием JDB C и JPA. Могут ли быть проблемы с использованием bean-компонента источника данных в разных библиотеках?

Any помощь или руководство будет принята с благодарностью.

1 Ответ

0 голосов
/ 21 января 2020

, поэтому режим клиента по умолчанию для DefaultFtpSessionFactory - "АКТИВНЫЙ", но в моем случае внутри контейнера docker режим клиента должен быть установлен на "ПАССИВНЫЙ"

, чтобы сделать это Мне нужно было добавить одну строку кода к DefaultFtpSessionFactory, вы должны установить режим клиента на 2 ... sf.setClientMode(2); ниже - последний бин DefaultFtpSessionFactory.

@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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...