如何每周,每月和每六个月执行一项特定任务?

时间:2014-08-31 22:09:26

标签: java scheduled-tasks timertask scheduledexecutorservice

我正在努力用Java创建一个cron作业。我想每周,每月,每三个月,六个月和九个月执行一项特定任务。

public Interface interfaceA {
    public String abc() throws Exception;
}

public class TestTaskA implements interfaceA {

    @Override
    public String abc() throws Exception {
        // some code
    }
}

我正在运行它 -

TestTaskA testTaskA = new TestTaskA();
testTaskA.abc();    

我想每周,每月,每三个月,每六个月,每九个月运行一次TestTaskA,我不想在晚上8点到凌晨5点之间执行任务。任何随机日也没关系。

现在如果我每周都在运行TestTaskA,那么它应该打印出one-weekreport_week,如果它每个月都在运行,那么它应打印出来one-monthreport_one_month。同样地,三个月,六个月和九个月。

最好的方法是什么?记住,我可能也有TestTaskB和TestTaskC,我应该每周,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,一个月,

我可以使用ScheduledExecutorService吗?任何简单的例子对我都有很大的帮助。

2 个答案:

答案 0 :(得分:1)

Quartz调度程序有一个非常灵活的框架来运行cron Jobs。

下面的例子是利用Spring。

第一个bean初始化CRON触发器。第二个bean是设置CRON调度程序,最后第三个bean指定将在哪个bean中执行哪个方法。

更多信息是@ http://quartz-scheduler.org/

     <!-- Scheduling  processing via Quartz  -->
    <!-- Step 1. Basically here, you define the list of Triggers, 
here you will define in the list tag 
the weekly,monthly, 3 month etc trigger beans -->

            <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
                <property name="triggers">
                    <list>
                        <ref bean="cronTrigger" />
                    </list>
                </property>
            </bean>



    <!-- Step 2. You define the Trigger. For example this will actually run once every month -->
    <!-- Here you also define what job will be triggered. This trigger will invoke the monthlyJobDetail bean -->

         <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
                <property name="jobDetail" ref="monthlyJobDetail" />
        <!--         run every 2 mins from 9:00 to 17 -->
                <property name="cronExpression" value="0 0 12 1 1/1 ? *"/>
            </bean>



    <!-- Step 3. Define what method in the what bean will be invoked. Here the job defines that targetBean.targetMethod will be invoked. 
         <bean id="monthlyJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
                <property name="targetObject" ref="targetBean" />
                <property name="targetMethod" value="targetMethod" />
                <property name="concurrent" value="false" />
            </bean>

    <!-- Bean that contains buisiness code -->
     <bean id="targetBean" class="com.example.targetBean"/>

答案 1 :(得分:0)

由于您允许的最短间隔为一周,我建议您创建一个每周一次由cron触发的Java类,并检查是否有任何要执行的任务。

创建一个名为Task的抽象类,并从中继承所有其他任务类(您可以另外实现每个任务所需的任何其他接口)。然后,当cron启动Java类时,迭代你的任务并确定它是否应该被执行(使用上次执行它的间隔,简单的数学运算),然后在时间到达时执行任务:

Task.java

public abstract class Task {

    public static enum TaskInterval {
        WEEKLY, MONTHLY, QUARTERLY, SEMI_ANUALLY ,TRI_QUARTERLY
    }

    private long mLastExecutionDate;
    private TaskInterval mInterval;

    public boolean shouldExecute() {
        // Return true if the task should be executed, false otherwise
    }

    public abstract void execute();
}

TaskA.java

public class TaskA extends Task {

    @Override
    public void execute() {
        // Code for TaskA
    }
}

Main.java

public class Main {

    public Main() {
        // Load all the tasks here somehow
        ArrayList<Task> mAllTasks = new ArrayList<Task>();

        for(Task t : mAllTasks) {
            if(t.shouldExecute()) {
                t.execute();
            }
        }
    }
}