2011-04-19 3 views
2

JConsole을 통해 내 MBean 속성을 수정하는 데 문제가 있습니다. 나는 다음과 같이 호출 된 스레딩 빈을 가지고있다 :jmx를 통해 런타임에 ThreadPoolTaskExecutor를 수정하는 방법

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()); 
    } 

ThreadContent.xml은 모든 기본 속성 값을 포함한다. public void setCorePoolSize(int corePoolSize)

편집 : 나는 순서대로 ThreadPoolManager이 그것을 같은 스레드 속성의 getter와 setter 메소드에 대한 액세스 권한을 부여위한 ThreadPoolTaskExecutor에서 inherting이

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(); 
     } 

: 같은

SimpleJmxAgent 본다 :

나는 다음을 사용했다 :

는에 싸여 :

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

} 

그래서 지금은 작동의 MBean 탭에 나타납니다. 그러나 속성은 사용되는 것과 다른 값으로 표시됩니다. 보기 속성이 디폴트 값을 1로 설정되어있을 때 나는

property name="corePoolSize" value="5" 

그러나 내 ThreadContext.xml에 설정했습니다. changeCorePoolSize 작업을 통해 Jconsole을 통해이를 변경할 수 있지만 표시되는 값을 변경하는 화장품 효과 만 있지만 진행중인 프로세스는 여전히 변경되지 않고 여전히 5 TaskExecutor 스레드가 있습니다.

내가하고있는 일에 뭔가 빠졌습니까? ThreadContext.xml을 통해 설정하고 Jconsole의 속성에 표시되는 속성 사이의 연결을 끊을 수있는 원인은 무엇입니까?

답변

1

CorePoolSize를 줄이면 활성 스레드 수가 줄어들지 만 현재 실행중인 명령이 완료된 후에 만 ​​적용됩니다.

workQueue가 가득 차면 활성 스레드 수를 증가시킬 수있는 MaxPoolSize의 효과에주의하십시오.

관심이 있으시면 JMX enabled util.concurrent ThreadPoolExecutor을 패키지로 만들고 간단한 봄 XML 네임 스페이스 기반 구성을 통해이 파일을 노출합니다. 이것은 메트릭 (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 페이지와이 스레드 풀을 모니터링하는 하이퍼 릭 HQ 플러그인이 포함되어 당신은 단순히 선언해야합니다.

이 < 집행자 서비스/>가 공통 구성 요소 (DBCP, util.concurrent, CXF, JMS 등) 및 http://code.google.com/p/xebia-france/wiki/XebiaManagementExtras에서 비즈니스 친화적 인 아파치 소프트웨어 라이선스에 따라 제안의 모니터링을 용이하게하기 위해 많은 다른 JMX 엑스트라와 함께 제공됩니다. 내가 런타임에 다시없는이 도움이

희망,

시릴

0

사용 super은 무한 루프를 방지하기 위해, 슈퍼 클래스의 메소드를 호출합니다 :

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

당신은 super.setCorePoolSize (corePoolSize를) 필요를;

0

제대로 이해하면 코어 크기가 5 인 풀을 초기화하지만 런타임시 풀 크기를 1로 재설정하십시오. "계속 진행중인 프로세스에 5 개의 TaskExecutor 스레드가 계속 남아 있습니다 ", 5 개의 사용중인 스레드 또는 5 개의 유휴 스레드입니까?

사용량이 많은 경우 4 개의 "초과"스레드가 유휴 상태가 될 때까지 코어 크기 재설정이 적용되지 않습니다.

+0

안녕하세요 니콜라스, . 그것은 Jconsole에서 값을 확인할 때 단지 1 일 때 나타나는 것입니다. 기본값으로 생각됩니다. 그럼에도 불구하고 TaskExecutor 스레드의 5 가지 인스턴스가 Jconsole에서 관찰 될 수 있습니다. 그러면 왜 이것이 1이 아닌 5를 표시하지 않을까요? – Will

관련 문제