Использование Tailer и WatchService

Я использую Tailer и WatchService одновременно, используя этот код:

AgentTailerListener listener = new AgentTailerListener();
Tailer tailer;

WatchService watcher = FileSystems.getDefault().newWatchService();
while (true) {
    WatchKey watchKey;
    watchKey = Paths.get("/tmp").register(watcher, ENTRY_CREATE);
    watchKey = watcher.take();

    for (WatchEvent<?> event : watchKey.pollEvents()) {
        if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
            tailSource = event.context().toString();
            System.out.println(tailSource);
            File file = new File("/tmp/" + tailSource);
            String end = "log";

            if (file.getName().endsWith(end)) {
                tailer = TailerFactory.createTailer(file, listener);
                (new Thread(tailer)).start();
            }

        }
    }

    watchKey.reset();
    transport.close();
}

Но проблема в том, что я хочу проверить только один файл с тейлером (как остановить поток, но я не могу остановить поток, специфичный для файла), и когда я записываю в файл командой echo, не все письма, которые я написал, появляются.

Когда я пишу один и тот же текст с эхом несколько раз подряд все буквы пишутся.

Я видел эту тему, Как связать -f последний файл журнала с заданным шаблоном, но я не знаю, смогу ли я использовать его для своей проблемы (я не знаю разницы между tail и tailer).


person Chènevis    schedule 22.07.2015    source источник


Ответы (1)


Наконец, я думаю, что это работает лучше:

AgentTailerListener listener = new AgentTailerListener();
Tailer tailer;
String tailSource;
Thread thread;

WatchService watcher = FileSystems.getDefault().newWatchService();

WatchKey watchKey;
watchKey = Paths.get("/tmp").register(watcher, ENTRY_CREATE);

List<Thread> threadList = new ArrayList<Thread>();
while (true) {
    watchKey = watcher.take();
    for (WatchEvent<?> event : watchKey.pollEvents()) {
    if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {

        tailSource = event.context().toString();
        System.out.println(tailSource);
        File file = new File("/tmp/" + tailSource);
        String end = "log";
        if (file.getName().endsWith(end)) {
            tailer= TailerFactory.createTailer(file, listener);
            if(threadList.isEmpty()){}
            else{
                Thread.sleep(1000);
                threadList.get(0).stop();
                threadList.clear();}
            System.out.println(threadList.size());
            threadList.add(thread = new Thread(tailer));
            threadList.get(0).start();
            }
    }
}
watchKey.reset();

} 

Но он создает очень много потоков, я думаю, что мне нужно использовать пул исправлений потоков.

person Chènevis    schedule 23.07.2015