Spring Batch: как обрабатывать многострочные файлы журналов - PullRequest
3 голосов
/ 30 марта 2012

Я пытаюсь импортировать содержимое файла журнала в базу данных с помощью Spring Batch.

В настоящее время я использую FlatFileItemReader, но, к сожалению, есть много записей журнала, которые не перехватывают. Две основные проблемы:

  1. Строки, содержащие многострочные строки JSON:

    2012-03-22 11:47:35,307  DEBUG main someMethod(SomeClass.java:56): Do Something(18,true,null,null,null): my.json = '{
        "Foo":"FooValue",
        "Bar":"BarValue",
        ... etc
    }'
    
  2. Строки, содержащие следы стека

    2012-03-22 11:47:50,596  ERROR main com.meetup.memcached.SockIOPool.createSocket(SockIOPool.java:859): No route to host
    java.net.NoRouteToHostException: No route to host
            at sun.nio.ch.Net.connect0(Native Method)
            at sun.nio.ch.Net.connect(Net.java:364)
            at sun.nio.ch.Net.connect(Net.java:356)
            at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:623)
            at sun.nio.ch.SocketAdaptor.connect(SocketAdaptor.java:92)
            at com.meetup.memcached.SockIOPool$SockIO.getSocket(SockIOPool.java:1703)
            at com.meetup.memcached.SockIOPool$SockIO.<init>(SockIOPool.java:1674)
            at com.meetup.memcached.SockIOPool.createSocket(SockIOPool.java:850)
            at com.meetup.memcached.SockIOPool.populateBuckets(SockIOPool.java:737)
            at com.meetup.memcached.SockIOPool.initialize(SockIOPool.java:695)
    

По сути, мне нужно, чтобы FlatFileItemReader продолжал читать, пока не достигнет следующей отметки времени, при этом агрегируя все строки до этого. Делалось ли что-нибудь подобное раньше (в Spring Batch)

Ответы [ 2 ]

2 голосов
/ 21 января 2015

В документации Spring Batch теперь есть ответы на часто задаваемые вопросы, касающиеся этого варианта использования.

1 голос
/ 30 марта 2012

Решение состояло в том, чтобы написать собственный ридер, который отслеживает последние несколько строк и ищет конкретный шаблон, отмечающий начало действительной строки.Я не нашел ничего готового в Spring Batch, но я мог бы использовать много существующего кода.Решение является проприетарным, поэтому я не могу опубликовать его здесь, извините, но вот как оно работает:

  1. Храните LinkedList of Lines.LinkedList важен, потому что мы будем обращаться к нему как к списку, так и к очереди.
  2. В вашем методе чтения запустите цикл: прочитайте следующую строку и запишите ее в свою очередь.Проверьте свою очередь, чтобы увидеть, есть ли у вас две допустимые строки (вам нужен доступ к списку здесь).Если вы это сделаете, верните все строки перед второй допустимой строкой (и удалите их из очереди).Если вы не нашли никакой допустимой строки, верните null.

Нет необходимости говорить, что это решение заметно медленнее, чем встроенный FlatFileItemReader, но оно получает правильные данные.

...