如何在Java代码中监视/检查数据/属性流

时间:2019-02-21 17:32:49

标签: java dataflow data-lineage

当需要捕获从一个API到另一个API的数据流时,我有一个用例。例如,我的代码使用休眠模式从数据库中读取数据,在数据处理过程中,我将一个POJO转换为另一个POJO1并执行了更多处理,然后最终转换为最终结果休眠对象。简而言之,例如POJO2POJO3/****************************************************************************** ** This file is an amalgamation of many separate C source files from SQLite ** version 3.27.1. By combining all the individual C code files into this ** single large file, the entire code can be compiled as a single translation ** unit. This allows many compilers to do optimizations that would not be ** possible if the files were compiled separately. Performance improvements ** of 5% or more are commonly seen when SQLite is compiled as a single ** translation unit.

在Java中,有一种方法可以推断POJO3的属性是从POJO1的该属性制成/转换的。我想寻找一种可以捕获从一种模型到另一种模型的数据流的东西。此工具可以是编译时,也可以是运行时,我都同意。

我正在寻找一种可以与代码并行运行并在每次运行时提供数据沿袭详细信息的工具。

3 个答案:

答案 0 :(得分:3)

现在,我将把它们称为“州”,而不是“ Pojos”!您将拥有一个开始的位置,可以迭代并通过不同的状态转换模型。最后,您拥有一个最终的终端状态,您希望将其持久化到数据库

stream(A).map(P1).map(P2).map(P3)....-> set of B

如果您使用一种称为事件来源的技术,则可以推断出是。那看起来怎么样?与其直接将A映射到状态P1并将状态P1映射到状态P2,您将排队所有必要的操作,这些操作足以将A映射到P1并将P1映射到P2,依此类推...如果要在任何情况下恢复P1或P2时间,这只是排队操作的产物。只要您尚未改变数据库状态,就可以随时快退或快退。 P1,P2,P3可以充当快照。

这样,您将可以为该属性重建确切的映射流。如果要与属性级别一样好,您将如何细化您的操作排队,或者取决于您更多的过程。

这是一篇很好的文章,描述了事件来源及其工作方式:https://kickstarter.engineering/event-sourcing-made-simple-4a2625113224

更新:

我可以想到另一种捕获属性更改的技术。您可以安装Pojo-s,这几乎与Hibernate用于增强Pojo的技术相同,并且与跟踪技术相同。然后,您可以捕获和响应Pojo1,Pojo2,Pojo3上的每个setter调用。不知道我是否会那样走。...

如果https://www.cs.helsinki.fi/u/pohjalai/k05/okk/seminar/Aarniala-instrumenting.pdf

,这里有一些关于字节码检测的迷惑性读物

答案 1 :(得分:0)

我想出两个原因,要么是代码不是由您开发的,所以您想了解数据流以及将输入转换为输出的组合,或者代码的运行方式出乎意料。 我认为您需要将所有pojo,输入和输出的值记录到任何位置,以备以后每次运行检查。 示例:数据库表,如果您可能需要经过几百次运行,但是一次只能以适当的形式登录到一个日志中。然后,您需要自己手动使用这些数据值层,以便以后映射到下一层。我认为有了代码,这将很容易。如果您有其他需要,请。解释。

请接受并喜欢,如果您感谢我的手势,将有助于我的想法和经验。

答案 2 :(得分:0)

有“时间旅行调试器”。对于Java,快速搜索仅能说明这一点: Chronon Time Travelling Debugger,请参阅this screencast可能对您有帮助。

由于您的转换可能使用了setter和getter,因此此工具也可能很有趣:Flow

编写您自己的Java代理进行跟踪可能不是您想要的。您可能可以使用AspectJ向getter和setter添加一些堆栈跟踪日志记录。请参阅here,以获取快速介绍。