java - 如何在长链方法调用中共享内存?

标签 java oop design-patterns aop

我需要找出一种有条件地保存和记录方法请求和响应的方法,条件是顶级方法的延迟超过 p50 延迟。 调用可视化如下如下:

topLevel() -> method1() -> method2() -> ... -> makeRequest()

在 makeRequest 中,我需要记录请求和对该请求的响应。

但我只会知道是否需要在备份调用堆栈的过程中的某个时刻实际记录这些内容 - 如果 topLevel 方法花费的时间太长。

所以对我来说,唯一的选择是无论如何都将请求和响应保存在 makeRequest 中,并使其可用于 topLevel 方法。 topLevel 方法将检查延迟是否高于 p50,并有条件地记录请求和响应。

这一切都引出了一个标题问题:如何在长链方法调用中共享内存?

我不想通过多个方法调用传回对象,从而污染函数签名。

最好的模式是什么?也许使用本地缓存来保存请求和响应,然后在顶层检索它?是否有面向方面的方法来解决这个问题?

最佳答案

只要您通过 method1method2 控制顶层和下层的代码,这实际上并不难。

您只需通过调用链向下传递请求,然后传回响应即可。

topLevel() -> method1(request) -> method2(request) -> ...
    -> makeRequest(request) { ... return response; }

要将其与真实的代码示例联系起来,您可以查看 jersey 框架的工作原理。

以下是注入(inject)请求并返回响应的方法示例。

@POST
@Consumes({MediaType.TEXT_XML})
@Produces({TEXT_XML_UTF_8})
public Response resource(@Context HttpServletRequest servletRequest) throws Exception {
    ExternalRequest req = makeRequest(servletRequest.getInputStream());
    ExternalResponse resp = externalGateway.doSomething(req);
    return Response.ok(wrapResponse(resp)).build();
}

尽管 Jersey 提供了一些奇特的注释(@Context 等),但这里并没有真正具有任何意义的可区分设计模式 - 您只是传递请求对象并返回一个回应。

当然,您也可以维护缓存并将其传递到调用堆栈,或者实际上只是请求和响应的包装对象,但这与简单地传递请求非常相似。

关于java - 如何在长链方法调用中共享内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47037247/

相关文章:

oop - 如何打破我的程序编码习惯?

Java错误处理

java - 在 Java 中实现对象列表的最佳实践

java - 如果我终止 jUnit 测试会发生什么

java - 如何用 Java 返回我自己的 future ?

python - Python3 变量名称的简单区别能否改变代码的运行方式?

JavaScript 模块模式——如何创建子模块

java - Get请求JAVA中的LocalDate格式

java - JoptionPane,不允许空文本

c++ - 如何设计一个C++类?