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

bqucvtff  于 12个月前  发布在  Spring
关注(0)|答案(6)|浏览(120)

我想知道如何使应用程序执行特定的代码部分,例如在特定的时间和日期发送电子邮件的代码部分?
我已经阅读了下面的问题,但是没有一个答案是正确的,所以我决定再问一次,因为它们很旧,不容易看到。此外,我的问题是关于执行代码的一部分,而不仅仅是发送电子邮件。
send-automatic-mail-on-specific-date-through-java
java-sending-mail-automatically
我不在乎我应该使用哪个框架来解决它,所以选择了两个框架。
请注意,用户应该能够手动做到这一点,想象用户定义一个时间来发送一些电子邮件或设置一个定时器提醒报警的应用程序。

lsmd5eda

lsmd5eda1#

我认为使用cron job在特定的时间间隔内执行代码块将是一个更好的选择。同时,你可以通过cronmakerQuartz scheduler,他们为我的情况做得更好。

nfs0ujit

nfs0ujit2#

我建议使用任何与Cron挂钩的库。Cron非常灵活,可以在任何特定日期、时间间隔或任何组合安排事情。因此,任何与它挂钩的库都可能是你想要的。
可能有几个库可以挂钩到cron,但我有一个名为cron4j的库的经验,发现它工作得很好,并且很容易快速开始使用。

pwuypxnk

pwuypxnk3#

你应该使用Quartz scheduler
对于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类中所有方法(public class 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);
        }

    }

oyjwcjzk

oyjwcjzk4#

你还没有说这是服务器端还是客户端-但是如果你只是想让客户端应用程序检查时间然后采取一些行动,你可以将行动定义为一个函数,获取时间,检查时间是否符合特定的时间段,如果符合就运行函数。类似这样:

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

字符串
如果你需要日期和时间,很容易细化变量。

z9smfwbn

z9smfwbn5#

如果你正在使用Spring Framework(根据标签),我认为使用@Scheduled annotation将是实现目标的最简单方法。

20jt8wwn

20jt8wwn6#

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

相关问题