如何根据日期和时间自动运行特定的代码块?

问题描述 投票:0回答:6

我想知道如何使应用程序执行代码的特定部分,例如在特定时间和日期发送电子邮件的代码部分?

我已阅读以下问题,但没有一个答案是正确的,所以我决定再次询问,因为它们很旧且不容易看到。另外我的问题是关于执行部分代码而不仅仅是发送电子邮件。

通过java在特定日期自动发送邮件
java自动发送邮件

我不关心应该使用哪个框架来解决它,所以选择了两个框架。

请注意,用户应该能够手动执行此操作,想象一下用户定义发送多封电子邮件的时间或在应用程序上设置提醒警报的计时器。

java spring jakarta-ee struts2
6个回答
4
投票

我认为使用 cron 作业在特定时间间隔执行代码块将是更好的选择。 同时你可以使用 cronmakerQuartz Scheduler,他们对我的案例做得更好。


2
投票

我建议使用任何与 cron 挂钩的库。 Cron 非常灵活,可以在任何特定日期、时间间隔或任何组合安排事务。因此,任何与它挂钩的库都可能是您想要的。

可能有几个库可以挂钩到 cron,但我有过使用名为 cron4j 的库的经验,发现它运行良好,并且很容易快速开始使用。


2
投票

你应该使用Quartz调度器

对于 pom.xml 中依赖项的条目

第2步:现在创建quartz.xml和条目,例如

        <property name="jobClass" value="com.test.schedule.RunScheduleJob" />

        <property name="jobDataAsMap">
            <map>
                <entry key="runScheduleTask" value-ref="runScheduleTask" />
            </map>
        </property>

    </bean>         

    <!-- Cron Trigger -->
    <bean id="mailTrigger"
        class="org.springframework.scheduling.quartz.CronTriggerBean">

        <property name="jobDetail" ref="runScheduleJob" />
        <!-- <property name="cronExpression" value="0 0/2 * * * ?" /> -->       
        <property name="cronExpression" value="1 0 00 * * ?" />
        <!-- <property name="cronExpression" value="0 10 16 L * ?" /> -->

    </bean>

第 3 步:您将创建一个扩展 QuartzJobBean 的类

public class RunScheduleJob extends QuartzJobBean
{   

    private RunScheduleTask runScheduleTask;


    public RunScheduleJob() {
        runScheduleTask=new RunScheduleTask();
    }

    public RunScheduleTask getRunScheduleTask() {
        return runScheduleTask;
    }
    public void setRunScheduleTask(RunScheduleTask runScheduleTask) {
        this.runScheduleTask = runScheduleTask;
    } 
    protected void executeInternal(JobExecutionContext context)throws JobExecutionException   
{ 
         Trigger tri =  context.getTrigger();
         if(tri.getName().equalsIgnoreCase("mailTrigger")){
             runScheduleTask.sendMailSmsOn();
         }
    }
}

第 4 步:从该类中,您将调用 RunScheduleTask 类中的所有方法 公共类 RunScheduleTask {

    private IAdminService adminService;



    public IAdminService getAdminService() {
        return adminService;
    }
    public void setAdminService(IAdminService adminService) {
        this.adminService = adminService;
    }   

    public void sendMailSms{
        try{

            adminService.sendMailSmsOnBeforeExpirationDate();

        }catch (Exception e) {
            log.error("Error occured in sendMailSmsOnBeforeExpirationDate ", e);
        }

    }

1
投票

您还没有说这是服务器还是客户端 - 但如果您只想让客户端应用程序检查时间然后采取一些操作,您可以将操作定义为函数,获取时间,检查时间是否合适在特定时间段内运行该函数(如果有)。像这样的东西:

  document.addEventListener("DOMContentLoaded", function()    {
  var time=new Date().getHours();
    if (8 <= time && time <= 14)
           {
        yourFunction();
           }
    else 
           {
        anotherfunction();
           }
     });

如果您需要日期和时间,则可以很容易地优化变量。


1
投票

如果您使用Spring框架(根据标签),我认为使用@Scheduled注释将是实现您的目标的最简单方法。


0
投票

Quartz 的数据源支持有限,Jobrunr 更适合有多个数据源选项的情况。 https://github.com/jobrunr/jobrunr

© www.soinside.com 2019 - 2024. All rights reserved.