2012-12-10 4 views
2

저는 졸업 프로젝트를하고 있으며 여기서 딜레마에 빠져 있습니다. PDF를 생성하고 데이터베이스의 데이터로 정의 된 일정에 따라 사람들에게 전자 메일로 보내는 응용 프로그램을 만들어야합니다. 저는이 프로젝트를 진행하는 회사에서 일하고 있습니다. 우리는 이미 우리가 사용하는 GlassFish 애플리케이션 서버를 보유하고 있습니다. 현재와 ​​같이 전체 솔루션이 하나의 패키지로 제공되는 것이 가장 좋습니다. 웹 스타트가있는 클라이언트 웹 응용 프로그램 등은 모두 하나의 패키지에 있습니다.GlassFish 서버와 별도의 스레드

새 서비스를 별도의 스레드에서 실행하고 보고서를 작성하여 전자 메일로 보내야합니다. 웹에서 읽을 수있는 것부터 GlassFish로 응용 프로그램 서버에서 자신의 스레드를 실행하는 것이 매우 바람직하지 않으므로 별도의 응용 프로그램을 만들어야합니다.

이게 실제로 가능합니까? 귀하의 의견은 무엇이며, 이에 대한 모범 사례는 무엇입니까? 당신은 EJB 3.1 (글래스 피쉬 3.X)를 사용하는 경우

+0

질문을 이해하는 가장 좋은 방법은 무엇입니까 ?-)? Webstart Web Application 등을 포함한 * Client와 혼동을 야기 할 수 있습니다. *, * 새로운 서비스는 별도의 스레드에서 실행되어야합니다. * – vels4j

+0

나는 더 명확하게 만들 수 있었을 것입니다. 모든 것이 하나의 WAR 파일로 GlassFish 서버에 업로드됩니다. 서버 논리에서 클라이언트에 이르기까지 모든 것이 그 파일에 있습니다.이 방법을 구현하는 것이 좋습니다. –

답변

4

@Schedule

, 당신은 용기가 지정된 간격이나 지정된 달력 시간에 메소드를 호출해야하는 @Schedule 주석을 사용할 수 있습니다. 당신의 @Schedule 주석 방법은 주석 노동자-방법으로 노동자 - EJB를 호출 할 수있는 별도의 스레드에서 일을하고 싶었다면 당신은 자신의 코드

Read about ejb 3.1 timer

@Stateless 
public class LabbBean { 

    @EJB 
    WorkerEjb workerEjb; 

    @Schedule(second="*/5", minute="*",hour="*", persistent=false) 
    public void myMethod() { 
     for (all jobs found in db){ 
      workerEjb.workerMethod(job);  
     } 
    } 
} 

@Stateless 
public class WorkerEjb { 
    @Asynchronous 
    public void workerMethod(job) { 
     //Send emails 
    } 
} 

에서 처리 스레드를 방지 할 수 있도록 허용 난 그냥 실현

@Timeout @Asynchronous

당신은 데이터베이스에서 시작되는 일정을 원했다. @Startup 주석을 사용하여 @Singleton ejb를 사용하여 프로그래밍 방식으로 타이머를 시작하는 옵션입니다. 타임 아웃 주석 메소드는, 일부의 타이머가 동시에 종료했을 경우, 개별의 thread로 불려갑니다.

@Singleton 
@Startup 
public class LabbBean { 
    @Resource 
    protected TimerService timerService; 

    @PostConstruct 
    public void init() { 
     //Init your timers from the data in the database here 
     for (all your timers) { 
      TimerConfig config = new TimerConfig(); 
      config.setInfo("timer1"); 
      config.setPersistent(false); 

      ScheduleExpression schedule = new ScheduleExpression(); 
      schedule.dayOfMonth(10); 
      schedule.minute(2); 
      timerService.createCalendarTimer(schedule, config); 
     } 
    } 

    //method called when timeout occurs 
    @Timeout 
    public void timeoutHandler(Timer timer) { 
     String name = timer.getInfo().toString(); 
     System.out.println("Timer name=" + name); 
    } 
} 
+0

이상적인 점은 무거운 작업의 작업을 분산시킬 수있는 하위 스레드를 만들 수 있다는 것입니다. 예약 된 작업을 수신 대기하는 기본 스레드가 새 작업을 수행 할 준비가되었습니다. 어떻게 해결할 수 있습니까? –

+0

시도해 볼 수있는 몇 가지 대안을 추가했습니다. –

+0

멋진 답변을 주셔서 감사합니다. 귀하의 방법이 가장 좋은 방법 인 것처럼 보이지만,이 애플리케이션을 GlassFish에 살게하는 것은 좋지 않습니다. 이를 위해 별도의 신청서를 작성해야합니다. –

관련 문제