2013-07-15 2 views
3

TimerService로 작업하는 응용 프로그램이 있으며, 특정 작업을 실행하기 위해 몇 가지 타이머를 만들고 있습니다. 잘 작동합니다. 그러나, 나는 타임 아웃에 약간의 지연이 있음을 눈치 챘다. 나는 10 분마다 실행하도록 스케줄 된 "A"와 매 3 분마다 실행될 또 다른 "B"를 가지고 있습니다. "A"를 실행하는 데 5 분이 걸리면 "B"는 "A"가 끝난 후에 만 ​​실행되어 2 분 지연됩니다. 문제는 준비가되지 않았기 때문에 문제입니다. TimerService를 동시에 실행할 수있는 방법이 있다면 제 질문입니다. 내가 사용하고있는 코드는 다음과 같습니다. 어떤 도움을 주셔서 감사합니다.EJB TimerService 동작

일정 만들기 :

// Every schedule extend from this class. 
public abstract class Schedule { 
@Resource 
private TimerService timerService; 

public void start() { 
     TimerConfig timerConfig = new TimerConfig(); 
     timerConfig.setInfo(name); 
     timerConfig.setPersistent(false); 
     timerService 
       .createCalendarTimer(this.calendarSchedule, timerConfig); 
} 

} 

일정 구현 :

내가 여기에 두 가지 문제를 참조
@Named 
@Stateless 
public class MyScheduleEJB extends Schedule { 
    @Timeout 
    public void timeout(Timer timer) { 
    // do the work 
    } 
} 
+1

타이머는 별개의 상태 비 저장 세션 빈 인스턴스를 사용하여 독립적으로 실행되어야합니다. 타임 아웃 메소드에 로깅을 추가하면 타임 아웃 콜백 메소드가 모두 시작되지만 순차적으로 완료되는 것을 볼 수 있습니까? 그렇지 않으면 다른 메소드가 완료 될 때까지 시작되지 않습니다. 동기화 된 메소드 또는 잠금을 사용하고 있습니까? 두 가지 시간 제한 방법이 동일한 DB에서 작동하고 DB 잠금에서 차단됩니까? 단일 Bean 인스턴스 만 허용하도록 Stateless Bean 풀 크기를 구성 했습니까? –

+0

질문을 확인하기 시작했고 Websphere의 특정 구성을 발견했습니다. 감사. –

+0

아, 그 설정을 완전히 잊었습니다. 좋은 발견. –

답변

3

이는 Application Server에서 매우 특정한 상황입니다. 그러나 다른 사람이 같은 문제가있는 경우 타이머 풀이 사용해야하는 스레드의 수를 알려주는 Websphere (다른 AS에 대해서는 확실하지 않음)에 구성이 있습니다. 기본값은 1 뿐이므로, 동시에 실행되지 않았습니다. 구성 : WAS Config

1

: 왜 createCalendarTimer 방법을 사용하는

먼저? 제 생각에 가장 적합한 TimerService의 메소드 (5 초 또는 10 초마다 실행)는 createIntervalTimer입니다.

둘째, EJB 타이머를 구현하는 방식이 EJB 사양을 따르지 않는다고 생각합니다.

그는 말한다 : 하나 또는 그 이상의 시간 제한 콜백 메소드를 제공해야 타이머 서비스를 사용하는 엔터프라이즈 빈의 타이머 서비스

빈 클래스의

18.2Bean 제공자의보기.

18.3Bean 제공자의 책임

슈퍼 클래스 및/또는 슈퍼있을 수 있습니다 시간 제한 콜백 method.The 엔터프라이즈 빈 클래스가 있어야합니다 타이머 서비스 에 등록되어야하는 엔터프라이즈 빈. bean 클래스에 수퍼 클래스가있는 경우, timeout 메소드는 Bean 클래스에 정의되거나 수퍼 클래스의 으로 정의 될 수 있습니다.

EJB 타이머를 구현하는 방법에는 몇 가지 제한 사항이 있습니다. 아마도 스펙에는 몇 가지 해석이있을 것입니다. 그러나 이것을 읽은 후에는 코드를 변경하는 것을 주저하지 않을 것입니다.

+1

첫째, 그것은 단지 예일뿐입니다. 내 필요에 따라 (특정 요일을 대체 시간으로 실행하는 일정을 만듭니다) createCalendarTimer가 가장 적합합니다. –

+1

두 번째로, 나는 당신의 요점을 알지 못한다. 나의 코드는 당신이 쓴 것을 범하는 것이 아니다. 감사. –