前言
前面讲过了,L。
这里继续讲解一下如何监控struts和spring。
手码不易,转载请注明:
由于spring的理论并不扎实,监控spring又是依靠sring的面向切面AOP技术来做的,因此在配置的时候虽然参照官方文档,但是仍然无法获得监控数据。这里先说一下简单的struts的监控。
Struts监控
Struts的监控相对来说要简单多了,只要按照下面的步骤,肯定是没有问题的。
第一步,导入必要的jar包,需要的jar包前面已经提到过了。
一个是javamelody.jar,另一个是jrobin-x.jar
第二步,需要在web.xml中添加监控对应的过滤器
12 10monitoring 3net.bull.javamelody.MonitoringFilter 4 56 9log 7true 811 14 15monitoring 12/* 1316 net.bull.javamelody.SessionListener 17
当然不要忘记struts自己的过滤器
12 10struts 3org.apache.struts2.dispatcher.FilterDispatcher 4 56 9struts.action.extension 7action 811 struts 12/* 13
第三步,在struts.xml中添加默认的package,这个package提供了默认的拦截器
12 3 4 10 115 6 97 8 12
其他的package比如sttuts的包,都要继承这个default的包。
12 3 6 7/error.jsp 4/success.jsp 58 11 12/error.jsp 9/searchSuccess.jsp 1013 16 17/error.jsp 14/hibernateSuccess.jsp 15
上面三步,就算是配置完了。
如果不触发监控事件,比如点击某些东西进行响应跳转,使用struts,那么是监控不到数据的。虽然有显示对应的图片,但是图片上的数据都是0,Nan或者下方的表为空,这些都是没有触发监听事件的原因。
Spring监控
JavaMelody针对于spring的监控是到方法级别的,我们可以监控到某个类的某个方法,因此需要使用到AOP里面的pointcut进行监听。
下面看一下主要的监听配置:
第一步,依然是导入必备的jar包,上面说的两个,不再重复了。
第二步,加载monitoring-spring.xml以及我们自己的applicationContext.xml配置文件。
如果想要在加载web.xml的时候读取spring的配置文件,需要实现一个监听器
12 3 org.springframework.web.context.ContextLoaderListener4 5
然后在web.xml中,添加spring文件路径。通过这只上下文参数来设置
12 contextConfigLocation 34 classpath:net/bull/javamelody/monitoring-spring.xml5 /WEB-INF/classes/bean.xml6 7
上面第一行,定义了监控应用的spring配置文件,下面是我们自己的spring的配置文件。
第三步,通过正则表达式,定位方法
12 3 74 65
这里面主要是使用了JdkRegexpMethodPointcut,也就是正则表达式定位业务方法。下面的参数可能是pattern或者patterns,参数
com.test.*.* 意思是对应com.test包下的所有类的所有方法
com.test.*.doGet 意思是对应com.test包下所有类的叫doGet的方法
.*Test.* 意思是所有以Test结尾的类的所有方法
具体的配置详情,还需要去学习一下AOP中关于切入点pointcut的使用。如果不会的话,多看一下相关的知识吧。
然后就是针对想要监控的bean,添加这个拦截器:
这样在使用ProxyFactoryBean的时候,就会自动调用拦截器interceptorNames,定位到facadeMonitoringAdvisor中的方法,并在方法前后出发net.bull.javamelody.MonitoringSpringAdvisor,进行信息的监控。
相应切面的编程代码这里也直接附上,有兴趣的可以运行试验下,主要是理解这个思想,就可以监控自己感兴趣的业务了。
1 people.java 2 public class People{ 3 // 讲话 4 public void speak() { 5 System.out.println("Hello,我是People!"); 6 } 7 // 跑步 8 public void Running() { 9 System.out.println("我在跑……跑…………逃……");10 }11 // 恋爱12 public void Loving() {13 System.out.println("我在和MM恋爱……别来打搅我!");14 }15 // 死亡16 public void died() {17 System.out.println("完了,我死了");18 }19 }20 21 advice类22 public class LogerPeople implements MethodBeforeAdvice {23 24 public void before(Method method, Object[] args, Object target)25 throws Throwable {26 System.out.println(target.getClass().getSimpleName() + "正在" +27 method.getName()+ "!");28 System.out.println("before!________________");29 30 }31 } 32 33 TestMain34 public class TestMain {35 36 public static void main(String[] args) {37 ApplicationContext ac = new ClassPathXmlApplicationContext(38 "bean1.xml");39 40 //通过ProxyFactoryBean获取IComputer接口实现类的实例41 People c = (People) ac.getBean("ProxyFactoryBean");42 c.speak();43 c.Running();44 c.Loving();45 c.died();46 }47 } 48 49 50 spring配置文件5152 53 54 55 64 6556 57 5859 6360
62DefaultAdvisor 6166 6967 68 70 71 7772
76.*spea.* 73.*ing 74.*di.* 7578
我捣鼓了一天半的时间,一直都监控不到数据,就是因为虽然配置了默认的拦截器,但是一直都没有对拦截器进行触发响应。因此一直都没有调用到这个监控类,也就当然没有监控信息出现了。
总结起来,还是因为没有理解spring AOP的原理,以后会补上spring的相关学习。