2011-01-24 2 views
0

내 응용 프로그램에서 EJB3.0 및 JBoss5를 기반으로 JBoss AsyncUtils에서 비동기 프록시를 사용합니다. Stateful bean ComputerBean은 상태 저장 풀 ProcessorBean (s)에 작업을 디스패치합니다. 나는 얼마나 많은 인스턴스가 현재 인스턴스화되어 있는지를 보여주기 위해 ProcessorBeans에 카운터를 만들었습니다. 여기에 코드입니다 : 보스는 내가 계산을 중지하는 경우에도, SLSBeans의 수 (인해 높은 부하) 증가, 그러나 결코 내려 간다 발견 실행되는 콘솔을 추적JBoss에 의한 SLSB의 asnync 프록시 삭제

@Stateful 
public class ComputerBean implements ComputerRemote { 

    @EJB 
    private ProcessorLocal processor; 

    public void startComputations() { 
     Random r = new Random(); 
     while(true) { 
      AsyncUtils.mixinAsync(processor).compute(r.nextInt()); 
     } 
    } 
} 

@Stateless 
public class ProcessorBean implements ProcessorLocal { 

    private static int COUNTER = 0; 

    @PostConstruct 
    public void init() { 
     System.out.println("constructing"); 
     COUNTER++; 
    } 

    @PreDestroy 
    public void destroy() { 
     System.out.println("destroying"); 
     COUNTER--; 
    } 

    public void compute(int i) { 
     System.out.println("----------------> " + COUNTER); 

     // some dummy computations - it's here only in order to take some time 
     double d = 0.3; 
     for (int j=0; j<100; j++) { 
      d+= 0.2 % 4 + i; 
     } 
    } 
} 

20 분 동안 기다린 다음 다시 시작하십시오.

다소 복잡한 시스템에서이 메커니즘을 사용하고 싶기 때문에 작동 방식을 정확히 알고 있어야합니다. 내가 뭐 잘못 했어요? SLSBeans 카운터가 절대로 떨어지지 않는 이유는 무엇입니까? 사전에

감사합니다, 표트르

답변

0

당신은 대부분 무 상태 세션 빈 풀링 있다는 사실에 실행하고 있습니다. 기본적으로 풀은 고정 크기이므로 생성 될 빈의 최대 개수를 확인해야합니다.

분명히이 특정 풀 구현은 주어진 시간이 지나면 풀 아래로 내려 앉지 않습니다. JBoss의 특정 주석을 통해 풀의 일부 동작을 조정할 수 있습니다. 이 참조 :

당신이 정말로 원하는 경우

http://docs.jboss.org/ejb3/docs/reference/build/reference/en/html/session-bean-config.html

, 당신은 또한 기본 풀을 대체 어쩌면 잠시 후 인스턴스를 제거 할 수 있습니다. 당신이 질문의 코드와 제안 답변

+0

덕분에, 내가 한 : @Stateless @PoolClass (값 = org.jboss.ejb3.StrictMaxPool.class,이 maxSize = 5, 제한 시간 = 10000) 공용 클래스 ProcessorBean 구현 ProcessorLocal {(...) 하지만 불행히도 문제를 해결하지 못합니다. 콘솔에서 카운터가 ~ 27까지 증가 할 수 있습니다. (이것은 매우 이상한데, 내가 최대 풀 크기를 설정했다는 것을 고려할 때 ... 나는 불가능하다고 말하고 싶다.) –

+0

나는 말할 것이다. 한 가지는 코드가 실제로 스레드로부터 안전하지 않다는 것입니다. 비 동기화 된 정적 변수에서 COUNTER ++를 수행하고 있습니다. AtomicInteger를 사용해 볼 수도 있습니다. 증분 결과를 bean의 인스턴스 변수에 저장하고이를 인쇄하십시오. 이것은 무슨 일이 일어나고 있는지 조금 더 말해 줄 수 있습니다. 이 스레드는 http://community.jboss.org/message/572349와 ​​약간 관련이 있습니다. http://community.jboss.org/thread/34588. 여전히 작동하지 않는다면이 질문을 JBoss 포럼에 게시하십시오. –

+0

감사 Arjan, 당신이 제안한 AsyncUtils 시도, 불행히도 문제를 해결하지 않았다. JBoss 포럼에서 스레드를 시작했습니다 : http://community.jboss.org/thread/162001 –

관련 문제