Java 访问延迟';基于Spring的控制器中的请求方法

Java 访问延迟';基于Spring的控制器中的请求方法,java,spring,design-patterns,Java,Spring,Design Patterns,我有各种web服务将数据返回给用户: 伪代码: MyController { SoapRequest1 { processRequest return data1 } SoapRequest2 { return data2 } } MyController { List latency SoapRequest1 { timeStamp1 processRequest return data1 latency.add(timeStamp2 - timeStamp1) t

我有各种web服务将数据返回给用户:

伪代码:

MyController {

SoapRequest1 {
 processRequest
 return data1
}

SoapRequest2 {
 return data2
}

}
MyController {

List latency

SoapRequest1 {
 timeStamp1
 processRequest
 return data1
 latency.add(timeStamp2 - timeStamp1)
 timeStamp2
}

SoapRequest2 {
 timeStamp1
 processRequest
 timeStamp2
 latency.add(timeStamp2 - timeStamp1)
 return data2
}

getRequestLatencies{
  return latency
}
}
我希望单独监测这些请求的执行情况。这就是我正在考虑的:

伪代码:

MyController {

SoapRequest1 {
 processRequest
 return data1
}

SoapRequest2 {
 return data2
}

}
MyController {

List latency

SoapRequest1 {
 timeStamp1
 processRequest
 return data1
 latency.add(timeStamp2 - timeStamp1)
 timeStamp2
}

SoapRequest2 {
 timeStamp1
 processRequest
 timeStamp2
 latency.add(timeStamp2 - timeStamp1)
 return data2
}

getRequestLatencies{
  return latency
}
}
因此,要在任何时候访问请求的延迟,我可以调用
getRequestLatencies
。这只是一个很高的水平,但我认为这应该是可行的。需要进一步的工作来过滤特定的延迟,但在较高的级别上,这是否足够?我不喜欢修改控制器来访问每个请求的延迟,但我不知道还有其他方法吗?有没有我不知道的设计模式


延迟需要从UI前端进行访问。因此,我将通过服务公开延迟值。

我们在这里使用Servlet过滤器来实现基本相同的结果。我很确定SpringMVC有自己的过滤器概念。其概念是在入站侧停止点启动秒表,并在响应出站时记录。通过JMX MBean或其他方式暴露这个孩子,现在你只需要一两个小时的工作就可以监控它。像冠军一样工作

然后,挑战就变成了不跟踪延迟,而是“分类”请求,因为过滤器会捕获所有请求,您通常需要知道“/somerequest2平均为2ms,/somerequest3平均为8ms”。这里列出了一些已编译的正则表达式,其中包含一些“包罗万象”来处理我们不太关心的API的情况


原始但有效。

我认为将(性能)监控和业务代码混合使用不是一个好的设计-我更喜欢外部监控解决方案/代码,您可以在本地(从同一服务器)监控服务以防止网络延迟或使用实际网络连接监视服务以测试网络延迟。在这两种情况下,延迟计算的逻辑都会在方法调用之前和之后发生


编辑我对spring控制器没有经验,但您是否需要任何特殊配置来运行控制器,如容器或其他什么?

您不能使用AOP吗?检查此stackoverflow.com/questions/1496205/…answer尝试将一个方面应用于要监视的控制器方法,并使用单独的log4j将计时记录到单独的日志文件中appender@jhadesdev请参阅updateone,除了将方面记录到文件之外,还有一种方法是让方面也在数据库表中插入计时。然后,统计服务可以查询该表中的metricsI,我想我没有完全加入控制器,只是简单地维护一个计时列表。这样至少可以消除SoapRequest1和SoapRequest2之间的差异。我也有点同意他说的,你不想把你的业务逻辑和你的绩效衡量混为一谈。我们采用“过滤器中的模式”路线来解决这两个问题。我相信这里也有一种方法可以利用Java注释来实现延迟监控的混合。我最喜欢过滤器解决方案。它是“中间的,没有意外”。这家伙建议有一个Spring插件,可以通过注释执行类似的操作: