2012-12-10 209 views
2

我正在做我的畢業設計項目,並且在這裏遇到了困境。 我需要製作一個應用程序來生成PDF並按照由數據庫中的數據定義的計劃將它們通過電子郵件發送給用戶。 我正在爲這個項目的公司工作,並且我們已經有了我們使用的GlassFish應用程序服務器。如果整個解決方案像現在一樣在一個包中交付,那將是最好的。 客戶端與Webstart的 Web應用程序等,都在一個封裝GlassFish服務器上的獨立線程

我的新服務需要一個單獨的線程中運行,生成報告併發送出去的郵件上。從我在網上閱讀的內容來看,在GlassFish中非常不鼓勵在應用程序服務器上運行自己的線程,所以聽起來像我需要製作自己的單獨應用程序。

這真的可以嗎?你有什麼意見,以及有什麼最佳做法?

+0

什麼是理解你的問題的最佳做法:-)?與* WebSTart Web應用程序等客戶端*全部在一個包*,*我的新服務需要運行在一個單獨的線程* – vels4j

+0

我想我可以說得更清楚。 在一個WAR文件中將所有內容上傳到GlassFish服務器。從服務器邏輯到客戶端的所有內容都在該文件中,實現這一點會很好,這種方法也是很好的... –

回答

4

@Schedule

如果使用EJB 3.1(glassfish的3.x的),則可以使用@Schedule註解爲具有容器在指定的時間間隔或在給定的日曆時間調用的方法。讓您避免處理線程在自己的代碼

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 
    } 
} 

如果你想要做在單獨的線程工作時,@Schedule註解的方法可以調用一個工人的EJB與註釋的工人方法作爲@Asynchronous

@Timeout

我才意識到你想要的時間表,從數據庫開始。一個選項是使用帶有@Startup註解的@Singleton ejb以編程方式啓動一堆定時器。如果某些定時器同時用完,則會在單獨的線程中調用超時註釋的方法。

@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中生活並不是一個好主意。我需要爲此做一個單獨的申請。 –