8

当我需要捕获从一个 API 到另一个 API 的数据流时,我有一个用例。例如,我的代码使用休眠从数据库读取数据,在数据处理过程中,我将一个转换POJO为另一个并执行更多处理,然后最终转换为最终结果休眠对象。简而言之,就像POJO1to 。POJO2POJO3

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

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

4

3 回答 3

2

现在我将称它们为州而不是 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 用于增强 Pojos 的技术几乎相同,并且与用于跟踪的技术配置文件相同。然后,您可以捕获并响应 Pojo1、Pojo2、Pojo3 上的每个 setter 调用。不知道我是否会那样做......

如果https://www.cs.helsinki.fi/u/pohjalai/k05/okk/seminar/Aarniala-instrumenting.pdf,这里有一些关于字节码检测的详细阅读

于 2019-02-24T10:02:52.083 回答
0

有“时间旅行调试器”。对于 Java,快速搜索只会发现这一点: Chronon Time Traveling Debugger,请参阅此截屏视频,它可能对您有什么帮助。

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

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

于 2019-03-01T23:39:51.387 回答
0

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

如果您感谢我帮助我的想法和经验的姿态,请接受并喜欢。

于 2019-03-01T21:51:55.767 回答