【问题标题】:Spring FTP Inbound Channel Adapter log every certain time to the FTPSpring FTP Inbound Channel Adapter 每隔一定时间将日志记录到 FTP
【发布时间】:2016-11-11 19:54:18
【问题描述】:

快速提问 那么在 FTP 入站通道适配器如何记录例如每 10 分钟到远程 FTP,轮询器固定速率是什么?轮询器用于轮询,但它一直登录到远程服务器?

我有这个:

@Bean
    @InboundChannelAdapter(value = "stream", poller = @Poller(fixedRate = "1000"))
    public MessageSource<InputStream> ftpMessageSource() {

        FtpStreamingMessageSource messageSource = new FtpStreamingMessageSource(template(), null);

        messageSource.setRemoteDirectory(remotedirectory);
        messageSource.setFilter(filter());

        return messageSource;
    }

或轮询元数据触发器:

 @Bean(name = PollerMetadata.DEFAULT_POLLER)
        public PollerMetadata defaultPoller() {
            PollerMetadata pollerMetadata = new PollerMetadata();
            pollerMetadata.setTrigger(new PeriodicTrigger(5000));
            return pollerMetadata;
        }

或者如何每 10 分钟记录一次,然后轮询所有新文件,设置 Thread.sleep() ?

_______编辑___

public static void main(String[] args) {
        SpringApplication.run(FtpinboundApp.class, args);
    }

    @Bean
    public SessionFactory<FTPFile> ftpSessionFactory() {
        DefaultFtpSessionFactory sf = new DefaultFtpSessionFactory();
        sf.setHost(remotehost);
        sf.setPort(remoteport);
        sf.setUsername(remoteuser);
        sf.setPassword(remotepassword);
        return new CachingSessionFactory<FTPFile>(sf);
    }

    @Bean
    @ServiceActivator(inputChannel = "data", adviceChain = "after")
    public MessageHandler handler() {
        return new MessageHandler() {

            @Override
            public void handleMessage(Message<?> message) throws MessagingException {
                try {
                    httpposthgfiles.getHGFilesfromRestful(message.getPayload().toString());
                    httppost990.get990fromRestful(message.getPayload().toString());

                } catch (IOException e) {
                    logger.error(e);
                } catch (Exception e) {
                    logger.error(e);
                }
            }
        };
    }

    @Bean
    public ExpressionEvaluatingRequestHandlerAdvice after() {
        ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
        advice.setOnSuccessExpression("@template.remove(headers['file_remoteDirectory'] + headers['file_remoteFile'])");
        advice.setPropagateEvaluationFailures(true);
        return advice;
    }

    @Bean
    @InboundChannelAdapter(value = "stream", poller = @Poller(fixedRate = "1000"))
    public MessageSource<InputStream> ftpMessageSource() {

        FtpStreamingMessageSource messageSource = new FtpStreamingMessageSource(template(), null);

        messageSource.setRemoteDirectory(remotedirectory);
        messageSource.setFilter(filter());

        return messageSource;
    }

    public FileListFilter<FTPFile> filter() {
        CompositeFileListFilter<FTPFile> filter = new CompositeFileListFilter<>();
        filter.addFilter(new FtpSimplePatternFileListFilter("xxxx_aaa204*"));
        filter.addFilter(acceptOnceFilter());
        return filter;
    }

    @Bean
    public FtpPersistentAcceptOnceFileListFilter acceptOnceFilter() {
        FtpPersistentAcceptOnceFileListFilter filter = new FtpPersistentAcceptOnceFileListFilter(meta(), "xxxx_aaa204");
        filter.setFlushOnUpdate(true);
        return filter;
    }

    @Bean
    public ConcurrentMetadataStore meta() {
        PropertiesPersistingMetadataStore meta = new PropertiesPersistingMetadataStore();
        meta.setBaseDirectory("/tmp/foo");
        meta.setFileName("ftpStream.properties");
        return meta;
    }

    @Bean
    @Transformer(inputChannel = "stream", outputChannel = "data")
    public org.springframework.integration.transformer.Transformer transformer() {
        return new StreamTransformer("UTF-8");
    }

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

    @Bean(name = PollerMetadata.DEFAULT_POLLER)
    public PollerMetadata defaultPoller() {
        PollerMetadata pollerMetadata = new PollerMetadata();
        pollerMetadata.setTrigger(new PeriodicTrigger(5000));
        return pollerMetadata;
    }

【问题讨论】:

    标签: java ftp spring-integration


    【解决方案1】:

    只有在您使用 CachingSessionFactory 时才会保持登录状态。

    最好不要像那样休眠和占用线程,而是使用任务调度程序(轮询程序就是这样做的)。

    new PeriodicTrigger(600_000) 将安排一个任务,每 10 分钟登录一次并检查文件。

    【讨论】:

    • 非常感谢加里,看我编辑添加我的代码,我有:返回新的 CachingSessionFactory(sf) 但也有 @Bean(name = PollerMetadata.DEFAULT_POLLER) 和 pollerMetadata.setTrigger(新的定期触发器(5000));我必须删除缓存会话工厂吗?或者它应该像我现在一样每 5000 毫秒记录一次?谢谢
    • 不要将代码/配置放在 cmets 中;它不可读;始终编​​辑您的问题并添加评论以表明您已这样做。如果您使用缓存会话工厂,会话将在轮询之间保持打开状态(尽管大多数服务器在超时后关闭空闲连接)。不清楚你在问什么; 5000 它将每 5 秒检查一次文件,600_000 它将每 10 分钟检查一次。
    • @viruskimera 只需使用 DefaultFtpSessionFactory 它应该足以完成通常的轮询任务。将 max-messages-per-poll 设置为 -1 以从 ftp 中获取所有文件
    • 好的,我的意思是如果我需要删除 CachingSessionFactory 并在我当前的代码(在我的编辑中)设置 600_000 以每 10 分钟记录一次,根据@SergeyBenner(我认为)是的,因为我会回来我的代码中的“sf”(默认会话)和上面的 PollerMetadata 将生效。
    猜你喜欢
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    相关资源
    最近更新 更多