当在JVM中创建文件时,commons-io-Tailer不会调用handle()



我有一个正在工作的Tailer实现(commons io Tailer)这是我的裁缝:

public class SyslogConsumer implements TailerListener {
     @Override
     public void handle(String line) { System.out.println(line);}
    ...
}
public void process() {
    TailerListener listener = new SyslogConsumer();
    final Tailer tailer = Tailer.create( path.toFile(), listener );
    Runtime.getRuntime().addShutdownHook( new Thread( "LogProcessor shutdown hook" ) {
        public void run() {
            tailer.stop();
        }
    } );
}

和我的测试:

public class LogProcessorTest {
    private static Path templog;
    private static final String logEvent = "May 1 00:00:00 this is valid";
    @Before
    public void setup()
        throws IOException
    {
        templog = Files.createTempFile( "logprocessing", ".log" );
        templog.toFile().deleteOnExit();
        BufferedWriter bw = new BufferedWriter( new FileWriter( templog.toFile() ) );
        bw.write( logEvent );
        bw.newLine();
        bw.close();
    }
    @Test
    public void testProcessingValidEntriesProducesEvents()
        throws IOException
    {
        // utility method that pipes stdout to my bytearray
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        TestUtils.captureStdOut( bos );
        LogProcessor proc = new LogProcessor( templog.toString() );
        proc.process();
        String s = bos.toString( "UTF-8" );
        Assert.assertEquals( logEvent, s );
    }
}

在对bos的内容进行内省时,它是空的,但日志文件包含2行:

>May 1 00:00:01 this is valid
>  

如果我将测试指向一个使用bash脚本创建和写入的文件:

$ cat test/endlessLogGenerator.sh
#! /bin/bash
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
out="$DIR/data/logstream.out"
echo > $out
c=0
while :
do
    let c=$((c+1))
    echo $(date +"%b %d %T this is message $c") >> $out
    sleep 1
done

那么它就完美地工作了。然而,当我在测试运行器中创建文件时,Tailer处理程序从未调用过我的侦听器。我试着在一个单独的线程中创建我的文件,也试着写一个不是测试创建的现有文件,也尝试在把它交给Tailer观看后在测试中写文件,等等。什么都不起作用。我在测试运行程序中尝试写入文件时,似乎没有任何东西会导致TailerListener触发handle()方法。我在Eclipse中的带有Java 8的Windows7上运行这个。有人有使用JVM编写的文件对TailerListener的handle()方法进行单元测试的经验吗?

谢谢。

原来我的问题是由Tailer吞下一个异常并静默地关闭流引起的:

Tailer's run() implementation...
....    
    } catch (Exception e) {
        listener.handle(e);
    } finally {
        IOUtils.closeQuietly(reader);
    }
....

在我的handle()实现中,我从日志中解析日期,而DateTimeFormatter没有设置正确的模式,所以它抛出了一个未检查的运行时异常,被Tailer捕获。设计这种行为的库实现者的奇怪选择。

我保留这个问题,而不是删除它,因为这个警告可能会派上用场。

相关内容

  • 没有找到相关文章

最新更新