java - GlassFish 服务器上的独立线程

标签 java jakarta-ee service glassfish

我正在做我的毕业设计,在这里遇到了一个难题。 我需要制作一个应用程序来生成 PDF 并按照数据库中数据定义的时间表将它们通过电子邮件发送给人们。 我在一家公司工作,负责这个项目,我们已经有一个我们使用的 GlassFish 应用程序服务器。最好是像现在这样将整个解决方案打包交付。 带有 webstart 的客户端 Web 应用程序等都在一个包中

我的新服务需要在单独的线程上运行,生成报告并通过电子邮件发送。根据我在网络上看到的内容,强烈建议不要在 GlassFish 等应用服务器中运行您自己的线程,因此听起来我需要制作自己的独立应用程序。

这真的可以吗?您有何评论?最佳做法是什么?

最佳答案

@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 注释方法可以调用一个 worker-ejb,其中 worker-method 注释为 @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);
    }
}

关于java - GlassFish 服务器上的独立线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13798123/

相关文章:

javascript - Angular:服务与组件中的功能?

service - 如何在 Symfony 4 中加载供应商类作为服务?

java - 如何在 Java 中将字符串转换回对象列表

java - 自 3.1.0 以来,使用 Maven 生成 QueryDSL 类失败

java - 为什么 Visual Studio 尝试使用错误的 JDK 版本?

jakarta-ee - 什么时候使用 wsgen?

servlets - @WebInitParam 有什么意义?

service - Wix3可以检查服务是否存在吗?

java - java中如何在每次更新后存储更新的数组?

java - Maven, hibernate , Spring 问题