2

前の質問に続いて、CronExpressionをサブクラス化し、getSetをパブリックに変更しました。このメソッドはint型を取得し、cron式を含む文字列があります。この式に関する情報(hour \ days \ etc)を取得するにはどうすればよいですか?getSetメソッドに何を渡す必要がありますか?または多分私は別の方法を使用する必要がありますか?これは私には非常に不明確です。

4

1 に答える 1

4

の問題CronExpressionは、それがそれを述べているにもかかわらず、それです:

UNIXライクなcron式のパーサーとエバリュエーターを提供します。

APIはあいまいで、メソッドの下に隠されていprotectedます。これは、汎用のCRON式パーサーではありません。ただし、いくつかの調整を行うことで、解析ロジックを簡単に利用できます。

class MyCronExpression extends CronExpression {

    public MyCronExpression(String cronExpression) throws ParseException
    {
        super(cronExpression);
    }

    public TreeSet<Integer> getSeconds()
    {
        return super.getSet(CronExpression.SECOND);
    }

    public TreeSet<Integer> getMinutes()
    {
        return super.getSet(CronExpression.MINUTE);
    }

    public TreeSet<Integer> getHours()
    {
        return super.getSet(CronExpression.HOUR);
    }

    //...

}

使用法:

final MyCronExpression cronExpression = new MyCronExpression("0 30 9,12,15 * * ?");
System.out.println(cronExpression.getSeconds());        //0
System.out.println(cronExpression.getMinutes());        //30
System.out.println(cronExpression.getHours());      //9, 12, 15

正規表現を使用してCRON式を手動で解析したくなるかもしれません... job_scheduling_data_2_0.xsdQuartzスキーマの正規表現は次のとおりです。

(((([0-9]|[0-5][0-9]),)*([0-9]|[0-5][0-9]))|(([\*]|[0-9]|[0-5][0-9])(/|-)([0-9]|[0-5][0-9]))|([\?])|([\*]))[\s](((([0-9]|[0-5][0-9]),)*([0-9]|[0-5][0-9]))|(([\*]|[0-9]|[0-5][0-9])(/|-)([0-9]|[0-5][0-9]))|([\?])|([\*]))[\s](((([0-9]|[0-1][0-9]|[2][0-3]),)*([0-9]|[0-1][0-9]|[2][0-3]))|(([\*]|[0-9]|[0-1][0-9]|[2][0-3])(/|-)([0-9]|[0-1][0-9]|[2][0-3]))|([\?])|([\*]))[\s](((([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1]),)*([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])(C)?)|(([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])(/|-)([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])(C)?)|(L(-[0-9])?)|(L(-[1-2][0-9])?)|(L(-[3][0-1])?)|(LW)|([1-9]W)|([1-3][0-9]W)|([\?])|([\*]))[\s](((([1-9]|0[1-9]|1[0-2]),)*([1-9]|0[1-9]|1[0-2]))|(([1-9]|0[1-9]|1[0-2])(/|-)([1-9]|0[1-9]|1[0-2]))|(((JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC),)*(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))|((JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(-|/)(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))|([\?])|([\*]))[\s]((([1-7],)*([1-7]))|([1-7](/|-)([1-7]))|(((MON|TUE|WED|THU|FRI|SAT|SUN),)*(MON|TUE|WED|THU|FRI|SAT|SUN)(C)?)|((MON|TUE|WED|THU|FRI|SAT|SUN)(-|/)(MON|TUE|WED|THU|FRI|SAT|SUN)(C)?)|(([1-7]|(MON|TUE|WED|THU|FRI|SAT|SUN))?(L|LW)?)|(([1-7]|MON|TUE|WED|THU|FRI|SAT|SUN)#([1-7])?)|([\?])|([\*]))([\s]?(([\*])?|(19[7-9][0-9])|(20[0-9][0-9]))?| (((19[7-9][0-9])|(20[0-9][0-9]))(-|/)((19[7-9][0-9])|(20[0-9][0-9])))?| ((((19[7-9][0-9])|(20[0-9][0-9])),)*((19[7-9][0-9])|(20[0-9][0-9])))?)

あるいは、Java用のより優れた汎用CRON式パーサーを知っている人がいるかもしれません。

于 2012-03-14T13:15:50.253 に答える