2014-02-20 10 views
7

이 간단한 단순한 문제는 추측 할 수 있지만 왜 그렇게되는지 설명 할 수는 없습니다. @Singleton 주석 즉 싱글 톤 타이머를 사용하는 EJB 타이머를 구현했습니다.타이머가 여러 개의 타이머 인스턴스를 만듭니다.

매 5 분마다 실행되도록 설정했습니다. 프로세스가 그렇게 1 초 즉

(EJB default - 1) 
(EJB default - 2) 
(EJB default - 3) 
(EJB default - 4) 

과의 간격에서 10 개 스케줄러 인스턴스를 동시에 실행 실행

@Singleton 
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
public class Scheduler { 
    private static final double timerVar = Math.random() * 33; 

    static Logger logger = Logger.getLogger("Scheduler"); 

    @Schedule(second = "*", minute = "*/5", hour = "*", persistent = true) 
    public void doWork() { 
     logger.log(Level.INFO, "timer value for this session : " + timerVar); 
    } 
} 

: 코드는 다음과 같이 보입니다. 나는 코드 내에서 긴 작업을 넣을 때, (EJB default - 1)이 완료되지 않았습니다 및 실행을 시도 (EJB default - 2) 때이 말을 나에게 오류를 제공합니다

JBAS014373 : 조직에 EJB 3.1 PFD2 4.8.5.5.1 동시 접속 제한 시간을. [email protected] - 한 번에 실행되도록 내가 여러 EJB 스케줄러 인스턴스를 피할 수있는 방법, 5000 MILLISECONDS

먼저 내에서 잠금을 얻을 수 있을까? 둘째로, "5000MILLISECONDS 내에서 잠금을 얻을 수 없습니다"라는 거래는 무엇이며 어떻게 피할 수 있습니까?

시간 초과 오류로 인해 JBOSS 대기열에 많은 티켓이 있다는 것을 발견했습니다 (here).


편집

추가가 읽을 수 그래서 최신 코멘트의 코드 : Tushar-46835, 당신은 당신의 솔루션에 상세히 설명 할 수

@, 어쩌면 우리의 조각을 보여 무엇을 그랬니? - 20시 12분

@rtcarlson에서 rtcarlson 10월 2일 '14 : 나는 여러 EJB 스케줄러 인스턴스를 피할 수있는 방법을

@Resource 
TimerService timerService; 

@Schedule(persistent = false, minute = "/30", hour = "") 
public void checkQueueState() { 
    dt = new DataAccessFactory(); 
    excvo = dt.canExecute(); 
    dt = null; 
    available = excvo.isExecuteReady(); 
    if (available) { 
     timerService.createSingleActionTimer(new Date(), new TimerConfig(null, false)); 
    } 
} 

@Timeout 
private void generateReport(Timer timer) { 
    logger.info("!!--timeout invoked here " + new Date()); 
} 

답변

6

먼저, 될 : 여기 내 문제를 해결 코드 조각이다 한 번에 을 실행 했습니까?

영구 타이머를 만듭니다. 따라서 지정된 간격이 지난 후에, 이전에 실행을 마칠 때까지 기다리는 동안 대기열에 큐를 넣고 새로운 대기열을 생성하게됩니다 (&).

다시 시작한 후에 모든 대기열에 포함 된 타이머의 시간이 초과되었습니다. & 지속성에 따라 서버에서 여러 인스턴스를 생성합니다.

둘째로, " 5000MILLISECONDS 내에 잠금을 얻을 수 없습니다"와 어떻게 대처할 수 있습니까?

기본적으로 모든 메소드에는 잠금 유형 쓰기가 있으므로 한 번에 하나의 스레드 만 실행됩니다. 따라서 다른 사용자는 타임 아웃 예외를 받거나 잠금을 얻을 수 없습니다.당신이 말했듯이, 장기 실행 프로세스가 있습니다.

+1

@ Tushar-46835, 해결책을 설명해 주시겠습니까? 우리가 한 일의 스 니펫을 보여줄 수 있습니까? – rtcarlson

+0

@rtcarlson : 다음은 내 문제를 해결 한 코드입니다. 리소스 TimerService timerService; 일정 (영구 = false, 분 = "*/30", 시간 = "*") \t 공 무효 checkQueueState (\t \t dt = new DataAccessFactory(); \t \t excvo = dt.canExecute(); \t \t dt = null; \t \t 사용 가능 = excvo.isExecuteReady(); \t \t 경우 (가능) { \t \t \t timerService.createSingleActionTimer (새로운 날짜(), 새로운 TimerConfig) ( \t \t \t \t \t 널 (null), 거짓); \t \t} \t} \t 시간 초과 \t 개인 무효 generateReport (타이머 타이머) { \t \t logger.info ("! - 여기 호출 시간 제한"+ 새 Date()); \t} – TusharPanda