gpt4 book ai didi

java - 如何读取用于收集统计信息(后期)处理的输出文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:21:04 25 4
gpt4 key购买 nike

总结

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

  • input file metrics (size/chars/bytes and other, file-section specific measures)
  • processing time statistics (start/end/duration of processing time, start/end/duration of metrics gathering time)
  • output file metrics (same as input file metrics, and will be different numbers, output file being changed)

输出文件指标是个问题,因为在文件写入磁盘之前我无法访问该文件,并且 在“处理”完成之前它不会写入磁盘

背景

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: 路由\输出\a_long_guid_filename

调试时,我看不到交换或结果对象的任何部分,我可能会通过管道将其传输到文件读取/统计信息收集过程中。

这是否需要更多的 Camel 路线来解决?什么可能是一种替代方法,我可以从输入和输出文件中获取所有统计信息并将它们保存在一个对象/json 行中?

(很高兴收到建设性的批评 - 为什么你的 Java 如此严厉 - 是的,很可能是,我正在这个阶段制作原型(prototype)解决方案,所以这不是生产代码,我也不是很深了解 Java 内部结构——虽然我通常可以让东西正常工作)

最佳答案

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

或者,你也可以使用两种路由:一种用于写入文件(to:file),另一种用于监听读取文件(from:file)

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

关于java - 如何读取用于收集统计信息(后期)处理的输出文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56679232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com