Не удалось получить fileNames из нескольких сеансов ftp после использования DelegatingSessionFactory - PullRequest
0 голосов
/ 24 сентября 2019

Я использую spring -gration-ftp для получения имен файлов с нескольких серверов ftp из разных каталогов.Я реализовал DelegatingSessionFactory для подключения к нескольким FTP-серверам и для получения имен файлов. Я реализовал FtpOutboundGateway с командой ls в приложении весенней загрузки.Но я получаю файлы только с одного FTP-сервера, мне нужны файлы со всех предоставленных FTP-серверов.Не могли бы вы помочь здесь, чтобы получить их.

Я пробовал ниже строку кода в bean-компоненте FtpOutboundGateway, поэтому я получал информацию о файле только с сервера ftp2.Я не могу найти решение для получения сведений о файлах с обоих серверов ftp1 и ftp2.

@ServiceActivator(inputChannel = "ftpLS")
@Bean
public FtpOutboundGateway getGW() {
final SessionFactory<FTPFile> sf1 =
        this.sessionFactory.getFactoryLocator().getSessionFactory("two");
    final FtpOutboundGateway gateway = new FtpOutboundGateway(sf1 , "ls", 
"payload");
    gateway.setOption(Option.NAME_ONLY);
    return gateway;
}

Найти код здесь - Код здесь: -

package com.springernature.ecm.erroralert.scheduler;

import java.time.format.DateTimeFormatter;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.net.ftp.FTPFile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.integration.annotation.MessagingGateway;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.file.remote.gateway.AbstractRemoteFileOutboundGateway.Option;
import   org.springframework.integration.file.remote.session.DelegatingSessionFactory;
import org.springframework.integration.file.remote.session.SessionFactory;
import org.springframework.integration.ftp.gateway.FtpOutboundGateway;
import org.springframework.integration.ftp.session.DefaultFtpSessionFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.springernature.ecm.erroralert.task.ErrorAlertTask;
import com.springernature.ecm.erroralert.utility.FileUtility;

import lombok.extern.slf4j.Slf4j;

/**
* @author abc
*/
@Component
@Slf4j
public class ScheduledTasks {

private static final DateTimeFormatter dateTimeFormatter =
    DateTimeFormatter.ofPattern("HH:mm:ss");

@Autowired
private ErrorAlertTask errorAlertTask;

@Autowired
private FileUtility fileUtility;

private final String[] names = { "one", "two" };

private final String[] hosts = { "ftp1.company.com", "ftp2.company.com" };

private final String[] users = { "abc", "xyx" };

private final String[] pwds = { "******", "******" };

private final String[] port = { "21", "21" };

@Autowired
private DelegatingSessionFactory<FTPFile> sessionFactory;

@Autowired
private Gate gate;

@Scheduled(fixedRate = 60000)
public void scheduleTaskWithFixedRate() {

    runner(this.gate);

}

public void runner(final Gate gate) {
    try {
        this.sessionFactory.setThreadKey("one"); // use factory "one"
        final List list = gate.list("/abc/abcd/somepath/Out/");
         log.info("Result:" + list);
        this.sessionFactory.clearThreadKey();
        this.sessionFactory.setThreadKey("two"); // use factory "two"
        final List list2 = gate.list("/somepath/Out/");
        log.info("Result2:" + list2);
    } finally {
        this.sessionFactory.clearThreadKey();
    }
}

@Bean
public DelegatingSessionFactory<FTPFile> sessionFactory() {
    final Map<Object, SessionFactory<FTPFile>> factories = new LinkedHashMap<>();
    for (int i = 0; i < this.names.length; i++) {
        final DefaultFtpSessionFactory factory = new DefaultFtpSessionFactory();
        factory.setHost(this.hosts[i]);
        factory.setUsername(this.users[i]);
        factory.setPassword(this.pwds[i]);
        factory.setPort(Integer.parseInt(this.port[i]));
        factories.put(this.names[i], factory);
    }
    // use the first SF as the default
    return new DelegatingSessionFactory<FTPFile>(
        factories,
        factories.values().iterator().next());
}

@ServiceActivator(inputChannel = "ftpLS")
@Bean
public FtpOutboundGateway getGW() {
    final FtpOutboundGateway gateway = new FtpOutboundGateway(sessionFactory(), "ls", "payload");
    gateway.setOption(Option.NAME_ONLY);
    return gateway;
}

@MessagingGateway(defaultRequestChannel = "ftpLS")
public interface Gate {

    List<String> list(String directory);

}
}

Фактический результат - 2019-09-24 17: 53: 55.674 ИНФО 13052 --- [scheduling-1] cseescheduler.ScheduledTasks: Результат: [test1.log, test2.txt] 2019-09-24 17: 53: 55.674 ИНФО 13052 --- [планирование-1] cseescheduler.ScheduledTasks: Result2: []

Ожидаемый результат - 2019-09-24 17: 53: 55.674 INFO 13052 --- [scheduling-1] cseescheduler.ScheduledTasks: Результат: [test1.log, test2.txt] 2019-09-24 17: 53: 55.674 INFO 13052 --- [scheduling-1] cseescheduler.ScheduledTasks: Результат 2: [Имена файлов с сервера ftp2]

...