在实现多进程监控的时候修改原来的monitor agent代码以满足需求。原代码如下:
<bean id="agentRequestHanlder" class="com.XXX.monitor.AgentRequestHanlder" scope="prototype" > <property name="agents"> <map> <entry key="jstat" value-ref="jstat" /> <entry key="load" value-ref="load" /> <entry key="memory" value-ref="memory" /> <entry key="cpu" value-ref="cpu" /> <entry key="io" value-ref="io" /> <entry key="file" value-ref="file" /> <entry key="net" value-ref="net" /> <entry key="pidIo" value-ref="pidIo" /> <entry key="pidCpu" value-ref="pidCpu" /> <entry key="jmeter" value-ref="jmeterAgent" /> </map> </property> </bean> …… <bean id="pidIo" class="com.XXX.monitor.agent.sysstat.PidIOAgent"> <property name="transferDataSender" ref="transferDataSender"></property> </bean> <bean id="pidCpu" class="com.XXX.monitor.agent.sysstat.PidCpuAgent"> <property name="transferDataSender" ref="transferDataSender"></property> </bean>?
?
单进程监控时service中根据key(即监控的指标)在agents中匹配对应的监控类。对于多进程的话若依旧由于pidIo对应的bean是单例的,
所以最后的进程会覆盖之前的进程设置信息。对此将pidIo改为多例,即每次都会创建一个新对象。
但考虑到源代码的兼容性,以及其他人调用bean时不会产生错误,另外建立了两个bean方便调用,如下:
不知道是否合适……
<bean id="agentRequestHanlder" class="com.XXX.monitor.AgentRequestHanlder" scope="prototype" > <property name="agents"> <map> <entry key="jstat" value-ref="jstat" /> <entry key="load" value-ref="load" /> <entry key="memory" value-ref="memory" /> <entry key="cpu" value-ref="cpu" /> <entry key="io" value-ref="io" /> <entry key="file" value-ref="file" /> <entry key="net" value-ref="net" /> <entry key="pidIo" value-ref="pidIoProtoType" /> <entry key="pidCpu" value-ref="pidCpuProtoType" /> <entry key="jmeter" value-ref="jmeterAgent" /> </map> </property> </bean> …… <bean id="pidIo" class="com.XXX.monitor.agent.sysstat.PidIOAgent"> <property name="transferDataSender" ref="transferDataSender"></property> </bean> <bean id="pidCpu" class="com.XXX.monitor.agent.sysstat.PidCpuAgent"> <property name="transferDataSender" ref="transferDataSender"></property> </bean> <bean id="pidIoProtoType" class="com.XXX.monitor.agent.sysstat.PidIOAgent" scope="prototype"> <property name="transferDataSender" ref="transferDataSender"></property> </bean> <bean id="pidCpuProtoType" class="com.XXX.monitor.agent.sysstat.PidCpuAgent" scope="prototype"> <property name="transferDataSender" ref="transferDataSender"></property> </bean>
?
Ps:经过测试此种方法不合适,经作为教训留着把,因为agents这个map已经固定,用get方法得到的还是确定的实例。。。最终改成根据agents返回的结果动态生成实例,见http://trinea.iteye.com/admin/blogs/1003265
?
遇到的问题
1、spring2.0多例定义的方法
?
<bean id="pidIo" class="com.XXX.monitor.agent.sysstat.PidIOAgent" singleton="false"> <property name="transferDataSender" ref="transferDataSender"></property> </bean>
?
?xml会在singleton="false"处提示报错
cvc-complex-type.3.2.2: Attribute 'singleton' is not allowed to appear in element 'bean'.
原因为:
在spring2.0中,bean没有“singleton”这个属性,而是在“scope”中对它进行设定。“scope”可以设定为 “singleton”和“prototype”默认情况下是“singleton”即和原先的“singleton=true”性质一样,如果要实现单例模式则将“scope”设定为“prototype”,即和原先版本的“singleton=false”一样。
?
参考:
http://blog.csdn.net/zoucui/archive/2009/02/16/3897798.aspx