【问题标题】:File Tail Inbound Channel Adapter stderr and stdout文件尾入站通道适配器标准错误和标准输出
【发布时间】:2016-12-10 11:40:31
【问题描述】:

我正在尝试使用 spring 集成的尾部文件,它的工作原理如下面的代码,但我有两个问题

@Configuration
public class RootConfiguration {

    @Bean(name = PollerMetadata.DEFAULT_POLLER)
    public PollerMetadata defaultPoller() {

        PollerMetadata pollerMetadata = new PollerMetadata();
        pollerMetadata.setTrigger(new PeriodicTrigger(10));
        return pollerMetadata;
    }

    @Bean
    public MessageChannel input() {
        return new QueueChannel(50);
    }

   @Bean
   public FileTailInboundChannelAdapterFactoryBean tailInboundChannelAdapterParser() {
       FileTailInboundChannelAdapterFactoryBean x = new FileTailInboundChannelAdapterFactoryBean();
       x.setAutoStartup(true);
       x.setOutputChannel(input());
       x.setTaskExecutor(taskExecutor());
       x.setNativeOptions("-F -n +0");
       x.setFile(new File("/home/shahbour/Desktop/file.txt"));
       return x;
   }

    @Bean
    @ServiceActivator(inputChannel = "input")
    public LoggingHandler loggingHandler() {
        return new LoggingHandler("info");
    }


    @Bean
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(4);
        taskExecutor.afterPropertiesSet();
        return taskExecutor;

    }
}

根据以下日志,我有 4 个线程用于跟踪文件。我需要所有这些还是我可以禁用一些。为什么我有一个线程用于 Monitoring process java.lang.UNIXProcess@b37e761,Reading stderr,Reading stdout

我问这个是因为我要在 voip 交换机上运行该程序,并且我想使用尽可能少的资源。

2016-12-10 13:22:55.666  INFO 14862 --- [ taskExecutor-1] t.OSDelegatingFileTailingMessageProducer : Starting tail process
2016-12-10 13:22:55.665  INFO 14862 --- [           main] t.OSDelegatingFileTailingMessageProducer : started tailInboundChannelAdapterParser
2016-12-10 13:22:55.682  INFO 14862 --- [           main] o.s.i.endpoint.PollingConsumer           : started rootConfiguration.loggingHandler.serviceActivator
2016-12-10 13:22:55.682  INFO 14862 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Starting beans in phase 2147483647
2016-12-10 13:22:55.701  INFO 14862 --- [           main] c.t.SonusbrokerApplication               : Started SonusbrokerApplication in 3.84 seconds (JVM running for 4.687)
2016-12-10 13:22:55.703 DEBUG 14862 --- [ taskExecutor-2] t.OSDelegatingFileTailingMessageProducer : Monitoring process java.lang.UNIXProcess@b37e761
2016-12-10 13:22:55.711 DEBUG 14862 --- [ taskExecutor-3] t.OSDelegatingFileTailingMessageProducer : Reading stderr
2016-12-10 13:22:55.711 DEBUG 14862 --- [ taskExecutor-4] t.OSDelegatingFileTailingMessageProducer : Reading stdout

我的第二个问题是,是否可以从乞讨开始读取文件并继续拖尾,我正在考虑为此 -n 1000 使用本机选项

注意:真正的代码是在创建新文件时监视文件夹中的新文件,然后启动尾部进程

【问题讨论】:

  • 在阅读了 OSDelegatingFileTailingMessageProducer 的代码后,我看到需要 stderror 进程来检查文件移动或其他错误并将其作为事件发送,我看不到任何方法禁用它,也用于从文件开头读取 -n +0 已经这样做了

标签: spring-integration


【解决方案1】:

waitFor() 进程需要进程监视器 - 它不使用任何资源,除了一点内存。

需要stdout 阅读器才能实际处理tail 命令生成的数据。

启动线程(在您的情况下,taskExecutor-1 在完成启动其他线程的工作后退出)。

目前没有禁用stderr阅读器的选项,但我们很容易添加一个,因此运行时只有2个线程。

随时打开JIRA 'improvement' Issue,当然还有contributions are welcome

【讨论】:

  • 感谢您的及时回答,我将尝试提供一个禁用 stderr 线程的选项。
猜你喜欢
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多