有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何通过jmx在运行时修改ThreadPoolTaskExecutor

通过JConsole修改MBean属性时遇到问题。我有一个线程bean,它通过以下方式调用:

public static void main(String[] args) throws Exception {
    // JMX
    new SimpleJmxAgent();

    // spring executor context
    ApplicationContext ctx = new FileSystemXmlApplicationContext(
            "src/resources/ThreadContent.xml");

    startThreads(ctx);
}

private static void startThreads(ApplicationContext ctx) {

    TaskExecutor tE = (TaskExecutor) ctx.getBean("TaskExecutor");

    System.out.println("Starting threads");

    for (int i = 0; i < 10; i++) {
        tE.execute(new RepeatingGrpPoC());
    }

线程内容。xml包含所有默认属性值

SimpleJmxAgent看起来像:

public SimpleJmxAgent() {

    mbs = ManagementFactory.getPlatformMBeanServer();

    // Spring context - used to load MBeans
    XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource(
            "resources/JMXcontent.xml"));

    // Unique identification of MBeans
    ThreadPoolManager threadBean = (ThreadPoolManager) factory.getBean("ThreadPoolBean");
    ObjectName threadName = null;

      try {
          // Uniquely identify the MBeans and register them with the platform MBeanServer 
          threadName = new ObjectName("THREADING:name=ThreadBean");
          mbs.registerMBean(threadBean, threadName);
       } catch(Exception e) {
          e.printStackTrace();
       }

我从ThreadPoolTaskExecutor导入了ThreadPoolManager,以便它能够访问线程属性的getter和setter方法,例如: public void setCorePoolSize(int corePoolSize)

编辑:

我已经实施了以下用途:

public void setCorePoolSize(int corePoolSize){
    super.setCorePoolSize(corePoolSize);
}

包裹在一个盒子里:

    public void changeCorePoolSize(int x){
    setCorePoolSize(x);

}

因此,现在该操作出现在MBeans选项卡中。但是,属性显示为与所使用内容不同的值。我已在我的线程上下文中设置。xml

property name="corePoolSize" value="5"

但是,当查看属性设置为1(默认值)时。我可以通过Jconsole通过changeCorePoolSize操作来改变这一点,但改变显示的值只是一种装饰效果,而不会改变仍有5个TaskExecutor 线程仍在运行的正在进行的进程

我在做什么时遗漏了什么?是什么导致我通过ThreadContext设置的属性之间的断开连接。xml以及在Jconsole的属性中显示的xml


共 (4) 个答案

  1. # 1 楼答案

    使用super调用超类中的方法,以避免无限循环:

    public void setCorePoolSize(int corePoolSize){
        super.setCorePoolSize(corePoolSize);
    }
    
  2. # 2 楼答案

    你需要超级。setCorePoolSize(corePoolSize)

  3. # 3 楼答案

    减少CorePoolSize应该足以减少活动线程的数量,但它仅在当前运行的命令完成后生效

    当心MaxPoolSize的影响,如果工作队列已满,它可能会增加活动线程的数量

    如果您感兴趣,我们打包了一个JMX enabled util.concurrent ThreadPoolExecutor,并通过一个简单的基于SpringXML名称空间的配置将其公开。它公开了度量(activeCount、completedTackCount等)和运行时配置参数(corePoolsize、maxPoolsize)。 您只需声明:

    <beans 
       xmlns:management="http://www.xebia.fr/schema/xebia-management-extras"
       ... >
    
       <!-- MBeanExporter is in charge of registering the ExecutorService MBean -->
       <context:mbean-export />
    
       <management:executor-service 
           id="my-executor" 
           pool-size="1-10" 
           queue-capacity="5"
           keep-alive="5"
           rejection-policy="ABORT" />
       ...
    <beans>

    该库包含JSP页面和用于监视这些线程池的Hyperic HQ插件

    这<;执行人服务/>;与许多其他JMX附加组件打包,以便于监控常见组件(dbcp、util.concurrent、cxf、jms等),并在http://code.google.com/p/xebia-france/wiki/XebiaManagementExtras的业务友好型Apache软件许可下提出

    希望这有帮助

    西里尔

  4. # 4 楼答案

    如果我理解正确,可以使用5的核心大小初始化池,但在运行时,将池大小重置为1。当您说,“仍有5个TaskExecutor线程仍在运行的正在进行的进程,”,这是5个繁忙线程还是5个空闲线程

    如果它们很忙,在4个“多余”线程空闲之前,核心大小重置不会生效