Как запускать ту или иную задачу каждую неделю, каждый месяц и каждые полгода?

Я работаю над выполнением задания cron на Java. Я хочу запускать определенную задачу каждую неделю, месяц, три месяца, шесть месяцев и девять месяцев.

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 для этого? Любой простой пример мне очень поможет.


person AKIWEB    schedule 31.08.2014    source источник
comment
Пусть cron ежедневно запускает Java-программу, а Java-программа в первую очередь проверяет дату. Затем он может решить, следует ли ему запускаться (и какой формат использовать) или нет (в этом случае он может выйти).   -  person azurefrog    schedule 01.09.2014
comment
Я хочу создать эту штуку на самой Java вместо использования unix cron?   -  person AKIWEB    schedule 01.09.2014
comment
@AKIWEB Есть ли причина для его создания исключительно на Java? Мы были весьма успешны с концепцией, похожей на то, что предложила mittelmania?   -  person Axel Amthor    schedule 01.09.2014


Ответы (2)


Планировщик Quartz имеет очень гибкую структуру для запуска заданий cron.

В приведенном ниже примере используется Spring.

Первый компонент инициализирует триггеры CRON. Второй компонент устанавливает планировщик CRON, и, наконец, третий компонент указывает, какой метод в каком компоненте будет выполняться.

Дополнительную информацию можно найти на @ 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"/>
person Rami Del Toro    schedule 31.08.2014
comment
Можете ли вы привести пример, как мне это сделать с помощью Quartz? Я больше склоняюсь к классу пакетов java util? - person AKIWEB; 01.09.2014
comment
добавил пример Spring. Извиняюсь за формат, мой браузер в данный момент немного глючит. - person Rami Del Toro; 01.09.2014
comment
Спасибо за объяснение. У меня есть некоторое представление о том, как использовать Quartz, но можете ли вы каким-либо образом привести один простой пример для моего вопроса, чтобы я получил четкое представление о том, как использовать Quartz для моего примера вопроса? Поскольку я никогда не использовал Quartz, у меня возникла проблема. :( - person AKIWEB; 01.09.2014

Поскольку самый короткий допустимый интервал составляет одну неделю, я рекомендую вам создать класс Java, который запускает cron раз в неделю и проверяет, есть ли какие-либо задачи для выполнения.

Создайте абстрактный класс с именем Task и наследуйте от него все остальные классы задач (вы можете дополнительно реализовать любой другой интерфейс, который вы хотите для каждой задачи). Затем, когда класс Java запускается с помощью cron, переберите свои задачи и определите, следует ли их выполнять (используя время последнего выполнения и его интервал, простая математика), а затем выполните задачу, если ее время пришло:

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();
            }
        }
    }
}
person mittelmania    schedule 31.08.2014