在实现多进程监控的时候修改原来的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
分享到:
相关推荐
Spring In Action-3.2@Scope单例、多例Bean,Spring In Action-3.2@Scope单例、多例Bean,Spring In Action-3.2@Scope单例、多例Bean,Spring In Action-3.2@Scope单例、多例Bean
Spring Bean的初始化和销毁实例详解 Spring Bean的初始化和销毁是Spring框架中一个非常重要的概念,它们都是Bean生命周期中不可或缺的一部分。在Spring框架中,我们可以使用多种方式来控制Bean的初始化和销毁,以下...
如果要产生多例,则需要在配置文件的bean中添加scope="prototype"。这将告诉Spring框架为每个请求创建一个新的对象实例。 三、为什么要用单例多例? 单例模式的优点是能够节省系统资源,避免了重复创建对象的开销...
在本例中,报错信息是"No bean named 'student' available",意味着Spring容器找不到名为'student'的bean。为了解决这个问题,我们需要遵循Spring框架的bean定义和自动注入规则。以下是详细的分析和解决方案: 首先...
- **单例模式与多例模式**: - **`singleton`属性**:控制Bean是否以单例模式运行。当设置为`true`时(默认值),在同一个`BeanFactory`或`ApplicationContext`中,无论何时请求该Bean,都会返回相同的实例。如果...
`scope`属性可以设定Bean的作用域,如单例(singleton)或多例(prototype)。 总的来说,Spring Bean生命周期的理解和灵活运用,能帮助我们更好地控制Bean的行为,实现更高效、更可控的依赖管理和资源管理。通过...
这里我们以Jackson为例,它是一个功能强大的JSON处理库。在`JsonUtil.java`中,可以定义一个转换方法: ```java import com.fasterxml.jackson.databind.ObjectMapper; public class JsonUtil { private static ...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于前后端交互,而...此外,还可以考虑添加更多的功能,如JSON数组与BEAN集合的转换,或者支持自定义的转换策略,使得工具包更加灵活和强大。
本文将深入探讨实体Bean继承的三种映射方式,并以一种方式为例进行详细讲解。 首先,让我们了解Java持久化规范提供的三种继承实体映射方式: 1. 所有继承层次共用一张表(Single Table Inheritance) 2. 每个具体...
- **场景介绍**:以报销单维护为例,通过Spring功能向导快速完成基本功能的开发。 - **关键知识点**: - **Spring单表维护向导**:利用EOS提供的向导功能,快速实现对单表数据的增删查改操作。 - **SpringBean配置...
在本例中,可能有一个名为`HelloWorldRemote`的远程接口,同样定义了`sayHello()`方法。Bean类使用`@Remote`注解声明这个接口,并实现其方法。为了使远程接口能够工作,还需要设置相关的JNDI(Java Naming and ...
在本例中,我们将探讨如何使用EJB消息驱动Bean处理Queue和Topic。 1. **消息驱动Bean的基本概念**: - **MDB的角色**:MDB充当JMS(Java Message Service)客户端,它监听特定的消息源,接收到消息后自动调用Bean...
本例中使用的购物车Bean `Car1` 实现了添加商品到购物车、列出购物车中的商品以及删除商品的功能。 ##### 1. 购物车Bean代码分析 ```java public class Car1 implements Serializable { private Hashtable list =...
在本例中,"DAOGenerator"可能是一个自定义的工具或者是一系列生成DAO和BEAN文件的脚本。使用此类工具时,需要先确保有数据库连接的权限,然后指定数据库的URL、用户名、密码以及需要生成代码的表名。运行工具后,会...
此外,`FactoryBean`还可以用于创建单例或多例对象,只需要在`FactoryBean`的实现中控制即可。 在Spring4中,`FactoryBean`仍然保持着其核心功能,并且在处理AOP代理、JMS消息生产者、DAO工厂等方面有广泛应用。...
Bean的创建通常有两种模式:单例模式(Singleton)与多例模式(Prototype)。 1. **单实例模式**:在容器启动时创建Bean对象,之后无论多少次请求该Bean,返回的都是同一个对象。这是默认的Bean作用域。 - 例如,...
在本例中,我们将重点关注XML配置,对应的压缩包文件名为“springxmldemo”,这表明我们将讨论如何通过XML配置文件来定义和管理Bean。 1. **XML配置方式** XML配置是Spring早期的主要装配方式,通过`beans`元素...
假设我们的XML文件中有多个`<address>`节点,每个节点代表一个人的不同地址。 接下来,我们需要配置Betwixt来理解这种映射关系。这可以通过编写XML配置文件或者使用编程式API来完成。这里我们使用编程式API为例: ...
这里以Jackson为例,展示如何实现这一转换。 1. 添加Jackson依赖: 在你的`pom.xml`文件中,添加以下Jackson依赖: ```xml <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind ...