安排春季工作,所以它不应该在第二和第四周六运行

时间:2016-09-15 06:44:25

标签: spring spring-scheduled

我想在工作日和星期六开始我的春季预定工作。(星期六不应该是月份的第2和第4个月)。有没有办法使用spring表达式实现这一点。

public class PayoutJob {

@Scheduled(cron="0 0 11 1 * MON-FRI")
public void payout(){
    System.out.println("Started cron job");

    // some business logic
   }
}

上述工作在工作日上午11点的工作日进行。有没有办法计算第二和第四个星期六的逻辑,并把它放在spring表达式中,以避免在那些日子里运行这个工作。

1 个答案:

答案 0 :(得分:1)

我的建议是,保持简短:

public class PayoutJob {

    @Scheduled(cron="0 0 11 1 * MON-FRI")
    public void payoutMonFri(){
        doJob();
    }

    @Scheduled(cron="0 0 11 1 * SAT")
    public void payoutSat(){
        if(!is2ndOr4thSaturday()){
            doJob();
        }
    }

    void doJob(){
        System.out.println("Started cron job");
        // some business logic
    }

    boolean is2ndOr4thSaturday(){

        Calendar c = Calendar.getInstance();

        int dayOfWeek  = c.get(Calendar.DAY_OF_WEEK);
        if(dayOfWeek == Calendar.SATURDAY){
            int today = c.get(Calendar.DAY_OF_MONTH);
            c.set(Calendar.DAY_OF_MONTH, 1); // reset
            int saturdayNr = 0;

            while(c.get(Calendar.DAY_OF_MONTH) <= today){
                if(c.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY){
                    ++saturdayNr;
                }
                c.add(Calendar.DAY_OF_MONTH, 1);
            }

            return saturdayNr == 2 || saturdayNr == 4;
        }

        return false;       
    }
}

我已根据我的要求更正了while循环条件。