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

1

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

  • 0
    Пусть cron запускает Java-программу ежедневно, а Java-программа проверяет дату первым делом. Затем он может решить, должен ли он работать (и какой формат использовать) или нет (в этом случае он может выйти).
  • 0
    Я хочу построить эту вещь в самой Java вместо использования Unix Cron?
Показать ещё 1 комментарий
Теги:
scheduled-tasks
scheduledexecutorservice
timertask

2 ответа

1

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

Ниже приведен пример 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"/>
  • 0
    Можете ли вы привести пример, как бы я мог сделать это с помощью кварца? Я был более склонен к классу пакетов утилит Java?
  • 0
    добавил пример Spring. Извиняюсь за формат, мой браузер на данный момент немного ненадежен.
Показать ещё 1 комментарий
0

Поскольку самый короткий интервал, который вы разрешаете, составляет одну неделю, я рекомендую вам создать класс 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();
            }
        }
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню