내 응용 프로그램에서 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 카운터가 절대로 떨어지지 않는 이유는 무엇입니까? 사전에
감사합니다, 표트르
덕분에, 내가 한 : @Stateless @PoolClass (값 = org.jboss.ejb3.StrictMaxPool.class,이 maxSize = 5, 제한 시간 = 10000) 공용 클래스 ProcessorBean 구현 ProcessorLocal {(...) 하지만 불행히도 문제를 해결하지 못합니다. 콘솔에서 카운터가 ~ 27까지 증가 할 수 있습니다. (이것은 매우 이상한데, 내가 최대 풀 크기를 설정했다는 것을 고려할 때 ... 나는 불가능하다고 말하고 싶다.) –
나는 말할 것이다. 한 가지는 코드가 실제로 스레드로부터 안전하지 않다는 것입니다. 비 동기화 된 정적 변수에서 COUNTER ++를 수행하고 있습니다. AtomicInteger를 사용해 볼 수도 있습니다. 증분 결과를 bean의 인스턴스 변수에 저장하고이를 인쇄하십시오. 이것은 무슨 일이 일어나고 있는지 조금 더 말해 줄 수 있습니다. 이 스레드는 http://community.jboss.org/message/572349와 약간 관련이 있습니다. http://community.jboss.org/thread/34588. 여전히 작동하지 않는다면이 질문을 JBoss 포럼에 게시하십시오. –
감사 Arjan, 당신이 제안한 AsyncUtils 시도, 불행히도 문제를 해결하지 않았다. JBoss 포럼에서 스레드를 시작했습니다 : http://community.jboss.org/thread/162001 –