我需要找出一种有条件地保存和记录方法请求和响应的方法,条件是顶级方法的延迟超过 p50 延迟。 调用可视化如下如下:
topLevel() -> method1() -> method2() -> ... -> makeRequest()
在 makeRequest 中,我需要记录请求和对该请求的响应。
但我只会知道是否需要在备份调用堆栈的过程中的某个时刻实际记录这些内容 - 如果 topLevel 方法花费的时间太长。
所以对我来说,唯一的选择是无论如何都将请求和响应保存在 makeRequest 中,并使其可用于 topLevel 方法。 topLevel 方法将检查延迟是否高于 p50,并有条件地记录请求和响应。
这一切都引出了一个标题问题:如何在长链方法调用中共享内存?
我不想通过多个方法调用传回对象,从而污染函数签名。
最好的模式是什么?也许使用本地缓存来保存请求和响应,然后在顶层检索它?是否有面向方面的方法来解决这个问题?
最佳答案
只要您通过 method1
和 method2
控制顶层和下层的代码,这实际上并不难。
您只需通过调用链向下传递请求,然后传回响应即可。
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/