如何读取输出文件以收集统计信息(后处理)

时间:2019-06-20 04:59:36

标签: java json spring-boot apache-camel

摘要

我需要在Camel服务器的in-modify-out过程中建立一组统计信息,并将这些统计信息作为一个对象发出(一条json日志行)。 这些统计信息需要包括:

  
      
  • 输入文件指标(大小/字符/字节以及其他针对文件节的指标)
  •   
  • 处理时间统计信息(处理时间的开始/结束/持续时间,度量收集时间的开始/结束/持续时间)
  •   
  • 输出文件指标(与输入文件指标相同,并且将是不同的数字,正在更改输出文件)
  •   

输出文件指标是个问题,因为在将文件写入磁盘之前,我无法访问该文件,并且  直到“处理”完成后才将其写入磁盘

背景

一个log4j实现被用于服务记录,但是经过一番修补后,我们意识到它确实不适合这里的要求,因为它将输出多行json并将json嵌入到单个顶级字段中。我们需要不同的顶级字段,具体取决于处理的文件。

服务器有望异步处理多个文件操作,并且文件大小各异(从微小到相当大-这是我们在开始调整或查看之前需要迭代统计信息和度量的原因之一)

当前状态

输入文件甚至处理时间统计信息都可以正常工作,我正在使用以下技术来获取它们:

在“ MyProcessor”的“ process”重写方法内,我创建了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 :(得分:0)

使用一种路由和两种处理器:一种用于写入文件,另一种用于读取文件,因此一个在另一个开始读取之前完成写操作

或者,您也可以使用两种方法:一种用于写入文件(to:file),另一种用于侦听读取文件(from:file)

您可以在此处检查可以解决大多数此类问题的常见EIP模式: https://www.enterpriseintegrationpatterns.com/patterns/messaging/