安排 Spring 工作,使其不应该在第 2 和第 4 个星期六 运行

Schedule Spring job so it should not run on 2nd and 4th saturday

我想 运行 我 spring 在工作日和星期六安排的工作。(星期六不应该是每月的第 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 点 IST。有什么方法可以计算第 2 个和第 4 个星期六的逻辑并将其放入 spring 表达式中以避免 运行 在那些日子里完成工作。

我的建议是,保持简短:

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 循环条件。