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

8
我有一个使用案例,需要捕获从一个API到另一个API的数据流。例如,我的代码使用Hibernate从数据库读取数据,在数据处理期间我将一个POJO转换为另一个,并执行一些更多的处理,最后将其转换为最终结果Hibernate对象。简而言之,是像POJO1POJO2POJO3这样的东西。
在Java中,是否有一种方法可以推断出POJO3的属性是从POJO1的这个属性进行制作/转换的?我想找到某种可以捕捉从一个模型到另一个模型的数据流的工具。这个工具可以是编译时或运行时,两者都可以。
我正在寻找一种可以与代码并行运行并在每次运行基础上提供数据血统详细信息的工具。

你可以设置断点并逐步查看数据。 - Kars
我想在服务运行时捕获这个,而不是进行调试。简而言之,在执行此逻辑时捕获数据血统和数据流。 - M.J.
静态安全分析(SAST)工具正是这样做的(但我认为不是作为正常程序执行的一部分)。您可能想要查看它们使用的技术,Veracode就是一个例子。 - David Soroko
3个回答

2

现在,我将把Pojos称为States!你有一个起始位置,通过不同的状态迭代和转换模型。最后,您有一个最终的终端状态,您希望将其保留到数据库中。

Original Answer翻译成"最初的回答"

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

如果您使用事件溯源技术,可以推断出它是的。那么它会是什么样子呢?不是直接将A映射到状态P1,将状态P1映射到状态P2,而是排队所有必要且足够映射A到P1和P1到P2等操作...如果您想随时恢复P1或P2,那么它只是排队操作的产物。 只要您没有改变DB状态,就可以随时向前或向后回滚。 P1、P2、P3可以充当快照。
这样,您将能够重建此属性的精确映射流程。您将如何排队操作,是否将其细化到属性级别或更加抽象,完全取决于您。
这是一篇很好的文章,描述了事件溯源及其工作原理:https://kickstarter.engineering/event-sourcing-made-simple-4a2625113224 更新:
我可以想到另一种捕获属性更改的技术。您可以将Pojo进行仪器化,这与Hibernate用于增强Pojo和跟踪的技术基本相同。然后,您可以捕获并响应于Pojo1、Pojo2、Pojo3上的每个setter调用。不确定我是否会这样做....
这里有一些关于字节码仪器化的详细阅读:https://www.cs.helsinki.fi/u/pohjalai/k05/okk/seminar/Aarniala-instrumenting.pdf

0
我想可能有两个原因,要么是代码不是由您开发的,因此您想了解数据流以及将输入转换为输出的组合,要么是您的代码表现出您不期望的行为。
我认为您需要记录所有pojos、输入和输出的值到任何您可以检查每次运行的地方。
例如:如果您可能需要在数百次运行后使用数据库表,则可以记录到适当形式的日志中。然后,您需要手动使用这些数据值逐层映射到下一层。我认为有了可用的代码,这将很容易实现。如果您有其他需求,请解释清楚。
如果您欣赏我的想法和经验,并且愿意接受并点赞,那就太好了。

0

有“时间旅行调试器”。对于Java,快速搜索只能找到这个: Chronon Time Travelling Debugger,看看这个视频如何帮助你。

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

编写自己的java代理以跟踪这一点可能不是您想要的。您可以使用AspectJ为getter和setter添加一些堆栈跟踪日志记录。请参见这里进行快速介绍。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接