bean多例

在实现多进程监控的时候修改原来的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值