1

Javaでcronジョブを作成しています。特定のタスクを毎週、毎月、3 か月、6 か月、9 か月ごとに実行したいと考えています。

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毎週、毎月、3 か月ごと、6 か月ごと、9 か月ごとに実行したいのですが、午後 8 時から午前 5 時までの間はタスクを実行したくありません。ランダムな日でも構いません。

TestTaskA毎週実行している場合は印刷されone-weekreport_week毎月実行している場合は印刷されone-monthreport_one_month. 3 か月、6 か月、9 か月も同様です。

これを行う最善の方法は何ですか?心に留めておくと、毎週、毎月、3 か月、6 か月、9 か月ごとに実行することになっている TestTaskB と TestTaskC もあるかもしれません。

これに使えますScheduledExecutorServiceか?簡単な例は、私にとって非常に役立ちます。

4

2 に答える 2

1

Quartz スケジューラーには、cron ジョブを実行するための非常に柔軟なフレームワークがあります。

以下の例では、Spring を利用しています。

最初の Bean は CRON トリガーを初期化します。2 番目の Bean は CRON スケジューラを設定し、最後に 3 番目の 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"/>
于 2014-08-31T22:21:32.317 に答える
0

許容される最短の間隔は 1 週間なので、週に 1 回 cron によって起動され、実行するタスクがあるかどうかを確認する Java クラスを作成することをお勧めします。

という抽象クラスを作成し、Taskそこから他のすべてのタスク クラスを継承します (タスクごとに必要な他のインターフェイスを追加で実装することもできます)。次に、Java クラスが cron によって起動されると、タスクを反復処理して実行する必要があるかどうかを判断し (最後に実行された時間とその間隔、単純な計算を使用して)、時間になったらタスクを実行します。

タスク.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();
            }
        }
    }
}
于 2014-08-31T23:07:50.940 に答える