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

时间:2013-05-20 05:41:28

标签: java spring java-ee struts2

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

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

send-automatic-mail-on-specific-date-through-java
java-sending-mail-automatically

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

请注意,用户应该能够手动完成,想象用户定义发送大量电子邮件的时间或设置应用程序上的提醒警报计时器。

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

我建议使用任何挂钩到cron的库。 Cron非常灵活,可以按任何特定日期,间隔或任何组合安排事情。所以任何挂钩的库都可能是你想要的。

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

答案 2 :(得分:2)

你应该使用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类中的所有方法     公共类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);
        }

    }

答案 3 :(得分:1)

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

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

如果你需要日期和时间,那么很容易改进变量。

答案 4 :(得分:1)

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