我正在努力用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-week
和report_week
,如果它每个月都在运行,那么它应打印出来one-month
和report_one_month
。同样地,三个月,六个月和九个月。
最好的方法是什么?记住,我可能也有TestTaskB和TestTaskC,我应该每周,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,每月,一个月,
我可以使用ScheduledExecutorService
吗?任何简单的例子对我都有很大的帮助。
答案 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();
}
}
}
}