Как прочитать выходной файл для сбора статистики (пост) обработки - PullRequest
3 голосов
/ 20 июня 2019

Резюме

Мне нужно собрать набор статистики во время процесса in-modify-out сервера Camel и выдать эту статистику как один объект (одну строку журнала json). Эти статистические данные должны включать:

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

Метрика выходного файла является проблемой , так как я не могу получить доступ к файлу, пока он не будет записан на диск, и он не записывается на диск до завершения процесса

Фон

Реализация log4j используется для регистрации сервисов, но после некоторой обработки мы поняли, что она действительно не удовлетворяет требованиям здесь, поскольку она выдает многострочный json и встраивает json в одно поле верхнего уровня. Нам нужны различные поля верхнего уровня, в зависимости от обрабатываемого файла.

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

Текущее состояние

Входной файл и даже статистика времени обработки работают нормально, и я использую следующую технику для их получения:

Внутри метода переопределения процесса «MyProcessor» я создаю новый экземпляр моего класса JsonLogWriter. (сокращенный псевдокод с многоточием)

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
...
@Component
public class MyProcessor implements Processor {
...
@Override
 public void process(Exchange exchange) throws Exception {
... 
JsonLogWriter jlw = new JsonLogWriter();
jlw.logfilePath = jsonLogFilePath;
jlw.inputFilePath = inFilePath;
jlw.outputfilePath = outFilePath;
...
jlw.metricsInputFile();   //gathers metrics using inputFilePath - OK
...

(входной файл обрабатывается / изменяется и возвращается как входной поток:

InputStream result = myEngine.readAndUpdate(inFilePath);
... get timings
jlw.write

}

Отсюда видно, что JsonLogWriter имеет

  • свойства для путей к файлам (входной файл, выходной файл, вывод журнала),
  • набор методов для заполнения данных:
  • метод для передачи данных в файл (после готовности)

Как только я заполнил все объекты json в классе, я вызываю метод write (), и класс собирает все объекты json вместе и все статистические данные поступают в лог-файл (в одну строку json) - ОК.

Ошибка - нет выходного файла (пока)

Если я использую метод metricsOutputFile, однако:

InputStream result = myEngine.readAndUpdate(inFilePath);
... get timings

jlw.metricsOutputFile(); // using outputfilePath

jlw.write

}

... JsonLogWriter завершается ошибкой, поскольку файл еще не существует.

java.nio.file.NoSuchFileException: aroute\output\a_long_guid_filename

при отладке я не вижу ни одной части объекта обмена или результата, которую я мог бы направить в процесс чтения / сбора файлов.

Для этого потребуется больше верблюжьих маршрутов? Какой может быть альтернативный подход, когда я могу получить всю статистику из входных и выходных файлов и сохранить их в одном объекте / строке json?

(очень рад получить конструктивную критику - как, например, почему ваша Java такая жесткая - и да, вполне возможно, я на этом этапе создаю прототипы решений, так что это не рабочий код, и я не исповедую глубоко понимание внутренних компонентов Java - обычно я могу заставить все работать)

1 Ответ

0 голосов
/ 20 июня 2019

Используйте один маршрут и два процессора: один для записи файла, а другой для чтения файла, поэтому один заканчивает запись до того, как другой начинает читать

Или вы также можете использовать два маршрута: один для записи файла (в: файл) и другой, который прослушивает чтение файла (из: файла)

Вы можете проверить общие шаблоны EIP, которые решат большинство из этих вопросов, здесь: https://www.enterpriseintegrationpatterns.com/patterns/messaging/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...