2012-12-10 162 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中生活并不是一个好主意。我需要为此做一个单独的申请。 –