在GlassFish服务器上创建单独的线程

3
我正在做毕业项目,遇到了一个困境。我需要制作一个应用程序,根据数据库中定义的时间表生成PDF并将其发送给人们。我们公司已经有一个GlassFish应用服务器,因此最好将整个解决方案交付在一个包中。
我的新服务需要在单独的线程上运行,生成报告并通过电子邮件发送。从网上可以看出,在GlassFish等应用服务器中运行自己的线程是不被鼓励的,因此似乎需要制作自己的单独应用程序。
这真的可以吗?您有什么意见,这方面的最佳实践是什么?

了解您的问题的最佳实践是什么 :-)?混淆了具有Webstart Web应用程序等的客户端我的新服务需要在单独的线程上运行 - vels4j
我想我本可以表达得更清楚一些。 所有东西都上传到GlassFish服务器的一个WAR文件中。从服务器逻辑到客户端的所有内容都在这个文件中,这样实现也是不错的选择... - André Snede
1个回答

5

@Schedule

如果您在使用Ejb 3.1 (glassfish 3.x),您可以使用@Schedule注释来使容器按照指定的间隔或给定的日历时间调用方法。这样可以避免在您自己的代码中处理线程。

查看ejb 3.1计时器相关内容

@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注释的方法可以调用一个worker-ejb,其worker-method用@Asynchronous注释。
@Timeout
我刚意识到您希望计划从数据库启动。一种选择是使用@Startup注释的@Singleton ejb编程方式启动一堆计时器。如果某些计时器同时运行完毕,则会在不同的线程中调用timeout注释的方法。
@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);
    }
}

理想情况下,我希望可以创建子线程来分担繁重工作的负荷。这样主线程就可以监听已安排的任务,并随时准备接收新任务。您会如何解决这个问题? - André Snede
添加了一些你可以尝试的替代方案。 - Aksel Willgert
非常感谢您的出色回答,虽然您的方法似乎是最好的方法,但它向我表明让此应用程序驻留在GlassFish内部并不是一个好主意。我需要为此制作一个单独的应用程序。 - André Snede
我不太明白,一个部署在Glassfish上的应用程序(.war)完全适合执行此任务。 - Aksel Willgert
我希望能够将这些繁重的任务分配给多个客户端,这样不仅仅是一个服务器来完成工作。你可能会认为它应该是一个Web应用程序,通过它我可以扩展它,但在我的脑海中,它不适合我们现在运行的服务器,因为它包含并运行所有逻辑。它将负载过重。虽然我确实认为你的建议非常好,但我没有足够的经验来看到完全的好处。它仍然无法解决我的其他问题,比如控制任务。 - André Snede
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接