bean多例_最新动态_新闻资讯_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 新闻资讯 > 最新动态 > bean多例

bean多例

 2011/9/17 11:24:24  Trinea  http://trinea.iteye.com  我要评论(0)
  • 摘要:在实现多进程监控的时候修改原来的monitoragent代码以满足需求。原代码如下:<beanid="agentRequestHanlder"class="com.XXX.monitor.AgentRequestHanlder"scope="prototype"><propertyname="agents"><map><entrykey="jstat"value-ref="jstat"/><entrykey="load"value
  • 标签:

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

  • 相关文章
发表评论
用户名: 匿名