0

问题:

我们有一个执行许多计算并且有些复杂的现有系统。事实上,有时用户不知道某些数据是如何得出的。(如果没有对代码的细节进行广泛的研究,我们也不知道)。我们正在努力实现一项功能,该功能使我们能够准确地向用户展示为产生答案所做的工作。

一般解决方案:

为了实现这一点,我们需要以某种方式通过我们的系统传递一个“上下文”,我们可以在处理过程中添加一些事实。然后可以对这些事实进行格式化并呈现给用户。

具体可能的解决方案:

我知道有两种方法可以传递上下文。一种方法是增加每个函数以引入“桶”或集合,当需要将某些东西返回给用户时可以添加到该集合中。这将需要我们对函数/api 进行大量更改以接收、可能修改并将这个额外的变量传递给其他函数。

另一种方法是使用 ThreadLocal 变量,我们可以在线程中的任何位置检索它并填充数据。此外,我们希望通过将其包装在 java @Annotations 中来使此填充对开发人员无缝,然后可以由方面处理以填充此“上下文”。

我们想要探索的正是这种将 ThreadLocal 用作不可见的隐藏“上下文”的想法。

具体来说:

因此,我们正在研究的基本思想是@Annotate 方法,以便可以根据传递给函数的参数或从函数检索的结果将一些事实添加到 ThreadLocal 变量中。这样,我们可以在遇到函数时对其进行装饰,并且这些函数会“自动”找到上下文并按照注释定义中指定的方式对其进行扩充。

问题(最后):是否存在已经存在的现有框架可以执行类似或类似的操作?

谢谢

-AP_

4

1 回答 1

1

听起来您可以对代码进行更改。您是否考虑过仅使用日志框架(如 slf4j)并在您感兴趣的方法的入口和出口点将跟踪消息写入日志?日志记录基本上是审计,我认为这是您真正需要的。

使用注释方法您会发现的困难是有一些方法可以在运行时处理它们。如果您正在谈论的类是 spring bean,则可以使用 spring 方面,或者您可以使用编译时编织 (CTW) 围绕带注释的方法引入建议,以审计有关方法的参数和返回值的信息(在推送中)您可以使用加载时间编织,但这种方法对于大多数应用程序来说确实是无稽之谈)。CTW 要困难得多,但如果您在代码中创建对象实例(也就是说,您正在审核域模型,而不是静态基础设施),或者您正在审核一大堆泥浆,那么 CTW 是必要的。

最后,经过 35 年的来之不易的经验,我可以告诉你一个事实(尽管我无法真正证明这一点),如果你遇到这些问题,扔掉系统总是更容易也更便宜你有并从头开始重新实现它。总是

于 2013-06-05T06:36:54.227 回答