CallMonitoringAspect.java
上传用户:dezhong
上传日期:2022-08-10
资源大小:167k
文件大小:2k
源码类别:

Java编程

开发平台:

Java

  1. package org.springframework.samples.petclinic.aspects;
  2. import org.aspectj.lang.ProceedingJoinPoint;
  3. import org.aspectj.lang.annotation.Around;
  4. import org.aspectj.lang.annotation.Aspect;
  5. import org.springframework.jmx.export.annotation.ManagedAttribute;
  6. import org.springframework.jmx.export.annotation.ManagedOperation;
  7. import org.springframework.jmx.export.annotation.ManagedResource;
  8. import org.springframework.util.StopWatch;
  9. /**
  10.  * Simple AspectJ aspect that monitors call count and call invocation time.
  11.  * Implements the CallMonitor management interface.
  12.  *
  13.  * @author Rob Harrop
  14.  * @author Juergen Hoeller
  15.  * @since 2.5
  16.  */
  17. @ManagedResource("petclinic:type=CallMonitor")
  18. @Aspect
  19. public class CallMonitoringAspect {
  20. private boolean isEnabled = true;
  21. private int callCount = 0;
  22. private long accumulatedCallTime = 0;
  23. @ManagedAttribute
  24. public void setEnabled(boolean enabled) {
  25. isEnabled = enabled;
  26. }
  27. @ManagedAttribute
  28. public boolean isEnabled() {
  29. return isEnabled;
  30. }
  31. @ManagedOperation
  32. public void reset() {
  33. this.callCount = 0;
  34. this.accumulatedCallTime = 0;
  35. }
  36. @ManagedAttribute
  37. public int getCallCount() {
  38. return callCount;
  39. }
  40. @ManagedAttribute
  41. public long getCallTime() {
  42. return (this.callCount > 0 ? this.accumulatedCallTime / this.callCount : 0);
  43. }
  44. @Around("within(@org.springframework.stereotype.Service *)")
  45. public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable {
  46. if (this.isEnabled) {
  47. StopWatch sw = new StopWatch(joinPoint.toShortString());
  48. sw.start("invoke");
  49. try {
  50. return joinPoint.proceed();
  51. }
  52. finally {
  53. sw.stop();
  54. synchronized (this) {
  55. this.callCount++;
  56. this.accumulatedCallTime += sw.getTotalTimeMillis();
  57. }
  58. }
  59. }
  60. else {
  61. return joinPoint.proceed();
  62. }
  63. }
  64. }