2011-01-24 3 views
1

org.springframework.scheduling.quartz.SimpleTriggerBean을 사용하는 스프링 응용 프로그램을 사용하여 정기적으로 메서드 실행을 예약합니다.스프링, 백그라운드 실행 또는 주문형

때로는 같은 방식으로 "주문형"이라고 부르기를 원합니다. GUI에서의 조치에 의해 트리거됩니다. 실행하려는 메소드가 2 초가 걸리기 때문에 실행이 끝날 때까지 사용자 GUI를 차단하고 싶지는 않습니다. 또한, 배경 스레드 (상호 배타적)로 "온 디맨드"실행을 조정하고자합니다.

  1. 는 콩 가 작업을 예약하는 TaskExecutor를 사용하는 것이 관리자라는 만듭니다

    여기에 한 가지 방법입니다. Manager는 방법을 Manager.scheduleTask()를 가지고

  2. 배경과 "수요" 스레드가 관리자에 같은 방법을 호출합니다 (Manager.scheduleTask)
  3. 작업은 동기화 에서 실행 두 메서드를 사용하여 하나의 작업 만 실행되고 있는지 확인하십시오.

더 똑똑하고 깨끗한 솔루션을 찾고 있습니다.

+0

석영에 연결 되었습니까? 아니면 더 간단한 것으로 간주할까요? – skaffman

+0

나는 석영에 붙어 있지 않다. Spring과 쉽게 통합 할 수 있기 때문에 그냥 사용하고 있습니다. 석영을 사용하지 않고 아이디어가 있습니까? –

답변

1

SingleThreadExecutor을 사용할 수 있습니다.

ExecutorService exec = Executors.newSingleThreadExecutor(); 
exec.submit(<task>); 

석영 작업이 실행되면 실행 프로그램에 작업을 제출할 수 있습니다. 마찬가지로 작업을 수동으로 실행하면 실행 프로그램에 작업을 제출할 수도 있습니다. ExecutorService에는 단일 스레드 만 있으므로 작업은 한 번에 한 번만 실행할 수 있습니다. 다른 작업 인스턴스는 현재 실행중인 작업이 완료 될 때까지 대기합니다. 이 경우 수동 동기화에 대해 걱정할 필요가 없습니다.

+0

이것은 동기화 작업을 해결합니다. 그러나, 그것은 제가 제안한 거의 동일한 해결책입니다. 나는 다른 가능성있는 더 좋은 접근법이 있는지 궁금해한다. –

3

스프링 3.0을 사용하는 경우 참조 문서의 Task Execution and Scheduling 섹션을 살펴보십시오.

  • @Scheduled
  • @Timer

soultion있을 것 같은 적어도 : 갖는 3 가지 방법 :

그것은 두 개의 통계가 있다는 것을 보여준다

private void doIt() {...} 

@Scheduled(cron="0 0 0 * * MON-FRI") 
public void doItEveryDay() {doIt();} 

@Async 
public void doItOnDemand() {doIt();} 

는하지만 이 주석을 사용하면 쉽게 읽을 수 있습니다. 왜 세 가지 방법이 있는지에 대한 이해.

+0

제안을위한 Tks. 여전히 동일한 솔루션이지만 주석을 사용하여 읽기가 더 쉽다는 것에 동의합니다. –

관련 문제