问题:
我们有一个现有的系统,它执行许多计算并且有点复杂。实际上,有时用户不知道某些数据是如何导出的。 (如果不对代码的具体细节进行广泛的研究,我们也不知道。我们正在努力实现一项功能,使我们能够准确地向用户显示为完成答案所做的工作。
一般解决方案:
为了实现这一点,我们需要以某种方式通过我们的系统传递“上下文”,我们可以在处理过程中添加一些事实。然后可以将这些事实格式化并呈现给用户。
具体可能的解决方案:
我知道有两种传递上下文的方法。一种方法是增加每个功能以引入“桶”或可以在需要将某些东西返回给用户时添加的集合。这需要我们对函数/ api进行大量更改以接收,可能修改并将此额外变量传递给其他函数。
另一种方法是使用ThreadLocal变量,我们可以在线程中的任何位置检索并填充数据。此外,我们希望通过将其包装在java @Annotations中,使这个群体与开发人员无缝连接,然后可以通过方面处理这些群体以填充此“上下文”。
使用ThreadLocal作为我们想要探索的隐形隐藏“上下文”的想法。
具体做法是:
因此,我们正在研究的基本思想是@Annotate方法,以便根据传递给函数的参数或从函数中检索的结果将某些事实添加到ThreadLocal变量中。这样,我们可以在我们遇到它们时修饰函数,这些函数“自动”找到上下文并按照注释定义中的指定对其进行扩充。
问题(最后): 是否存在已存在的类似这样或类似的框架?
由于
-AP_
答案 0 :(得分:1)
听起来您可以对代码进行更改。您是否考虑过只使用日志框架(如slf4j)并将跟踪消息写入您感兴趣的方法的入口和出口点的日志中?记录基本上是审计,这是我认为你真正想要的。
使用注释方法找到的困难是有一些方法可以在运行时处理它们。如果你所讨论的类是spring bean,你可以使用spring方面,或者你可以使用编译时编织(CTW)来引入有关注释方法的建议来审计有关方法的参数和返回值的信息(在推送时)你可以使用加载时间编织,但对于大多数应用程序来说,这种方法确实是无意义的)。 CTW要困难得多,但如果您在代码中创建对象实例(即,您正在审核域模型,而不是静态基础架构),或者您正在审核泥浆的大球,那么CTW就更加困难了。 / p>
最后,在经历了35年的辛苦经历之后,我可以告诉你一个事实(虽然我实际上无法证明这一点),如果你遇到这些问题,那么投掷总是更容易,也更便宜离开你拥有的系统并从头开始重新实现它。 A.l.w.a.y.s。
乙