2010-03-02 15 views
23

में मान्य है मैं क्वार्ट्ज का उपयोग कर जावा में शेड्यूलिंग एप्लिकेशन लिख रहा हूं। मैं क्रोनट्रिगर का उपयोग कर रहा हूं, लेकिन मेरे क्रॉन एक्सप्रेशन को निर्धारित होने से पहले डेटाबेस में दर्ज किया गया है और उपयोगकर्ता इनपुट पर आधारित हैं।क्रॉन अभिव्यक्ति की पुष्टि करना जावा

क्या कोई तरीका है कि मैं यह सत्यापित कर सकता हूं कि जब मैं उन्हें पकड़ता हूं तो क्रॉन अभिव्यक्ति मान्य होती है? मैं इसे करने के बजाय और शेड्यूलर चलाने तक उपयोगकर्ता की प्रतीक्षा करने के बजाय उपयोगकर्ता को एक उचित त्रुटि संदेश देना चाहता हूं और जब मैं ट्रिगर को आजमाता हूं और बना देता हूं तो मुझे एक पारसी अपवाद मिलता है। उपयोगकर्ता डेटा इनपुट करने के कुछ दिन बाद हो सकता है।

उत्तर

35

क्या आप वास्तव में इसे निष्पादित किए बिना ट्रिगर नहीं बना सकते? ParseException के मामले में आप बस उचित प्रतिक्रिया दे सकते हैं। अगर अभिव्यक्ति ठीक है, तो डीबी को अभिव्यक्ति जारी रखें।

संपादित करें: या बस ऐसा करते हैं:

org.quartz.CronExpression.isValidExpression(expression); 
+8

ध्यान दें कि वैधता इस विधि द्वारा जाँच के रूप में नहीं * गारंटी * कि एक अभिव्यक्ति काम करेंगे करता है: हम नीचे कुछ के टुकड़े प्रदान करते हैं। जैसे 'isValidExpression (" 0 0 12 1/2 * एमओएन-एफआरआई * ") 'सत्य लौटाता है, लेकिन रनटाइम पर यह' असमर्थित ऑपरेशन अपवाद) फेंकता है: दिन-प्रति-सप्ताह और एक दिन के महीने पैरामीटर को निर्दिष्ट करने के लिए समर्थन लागू नहीं किया गया है । – Jonik

+0

दरअसल, इसलिए अभिव्यक्ति शुरू करने के लिए बेहतर है, और निर्माता को buildExpression को कॉल करने दें ताकि आप सुनिश्चित हो सकें कि यह क्वार्ट्ज –

+0

@AhmedHashem 'isValidExpression' विधि के लिए एक वैध अभिव्यक्ति है, पहले से ही आंतरिक रूप से 'क्रोनएक्सप्रेस' और कैच शुरू करता है कोई भी 'पारसे अपवाद'। तो यह अलग नहीं होना चाहिए। – destan

12

मैं निम्नलिखित code @ ph4r05 से जोड़ा और साथ ही एक regex उत्पन्न करने के लिए संशोधित किया;

^\s*($|#|\w+\s*=|(\?|\*|(?:[0-5]?\d)(?:(?:-|\/|\,)(?:[0-5]?\d))?(?:,(?:[0-5]?\d)(?:(?:-|\/|\,)(?:[0-5]?\d))?)*)\s+(\?|\*|(?:[0-5]?\d)(?:(?:-|\/|\,)(?:[0-5]?\d))?(?:,(?:[0-5]?\d)(?:(?:-|\/|\,)(?:[0-5]?\d))?)*)\s+(\?|\*|(?:[01]?\d|2[0-3])(?:(?:-|\/|\,)(?:[01]?\d|2[0-3]))?(?:,(?:[01]?\d|2[0-3])(?:(?:-|\/|\,)(?:[01]?\d|2[0-3]))?)*)\s+(\?|\*|(?:0?[1-9]|[12]\d|3[01])(?:(?:-|\/|\,)(?:0?[1-9]|[12]\d|3[01]))?(?:,(?:0?[1-9]|[12]\d|3[01])(?:(?:-|\/|\,)(?:0?[1-9]|[12]\d|3[01]))?)*)\s+(\?|\*|(?:[1-9]|1[012])(?:(?:-|\/|\,)(?:[1-9]|1[012]))?(?:L|W)?(?:,(?:[1-9]|1[012])(?:(?:-|\/|\,)(?:[1-9]|1[012]))?(?:L|W)?)*|\?|\*|(?: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+(\?|\*|(?:[0-6])(?:(?:-|\/|\,|#)(?:[0-6]))?(?:L)?(?:,(?:[0-6])(?:(?:-|\/|\,|#)(?:[0-6]))?(?:L)?)*|\?|\*|(?:MON|TUE|WED|THU|FRI|SAT|SUN)(?:(?:-)(?:MON|TUE|WED|THU|FRI|SAT|SUN))?(?:,(?:MON|TUE|WED|THU|FRI|SAT|SUN)(?:(?:-)(?:MON|TUE|WED|THU|FRI|SAT|SUN))?)*)(|\s)+(\?|\*|(?:|\d{4})(?:(?:-|\/|\,)(?:|\d{4}))?(?:,(?:|\d{4})(?:(?:-|\/|\,)(?:|\d{4}))?)*))$ 

यहाँ जावा कोड है: यहाँ regex है

private static String cronRegex = null; 

public static String getCronRegex() 
{ 
    if (cronRegex == null) 
    { 
    // numbers intervals and regex 
    Map<String, String> numbers = new HashMap<String, String>(); 
    numbers.put("sec", "[0-5]?\\d"); 
    numbers.put("min", "[0-5]?\\d"); 
    numbers.put("hour", "[01]?\\d|2[0-3]"); 
    numbers.put("day", "0?[1-9]|[12]\\d|3[01]"); 
    numbers.put("month", "[1-9]|1[012]"); 
    numbers.put("dow", "[0-6]"); 
    numbers.put("year", "|\\d{4}"); 

    Map<String, String> field_re = new HashMap<String, String>(); 

    // expand regex to contain different time specifiers 
    for (String field : numbers.keySet()) 
    { 
     String number = numbers.get(field); 
     String range = "(?:" + number + ")(?:(?:-|\\/|\\," + ("dow".equals(field)? "|#" : "") + 

     ")(?:" + number + "))?" + ("dow".equals(field)? "(?:L)?" : ("month".equals(field)? "(?:L|W)?" : "")); 
     field_re.put(field, "\\?|\\*|" + range + "(?:," + range + ")*"); 
    } 

    // add string specifiers 
    String monthRE = field_re.get("month"); 
    String monthREVal = "JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC"; 
    String monthRERange = "(?:" + monthREVal + ")(?:(?:-)(?:" + monthREVal + "))?" ; 
    monthRE = monthRE + "|\\?|\\*|" + monthRERange + "(?:," + monthRERange + ")*" ; 
    field_re.put("month", monthRE); 

    String dowRE = field_re.get("dow"); 
    String dowREVal = "MON|TUE|WED|THU|FRI|SAT|SUN"; 
    String dowRERange = "(?:" + dowREVal + ")(?:(?:-)(?:" + dowREVal + "))?" ; 

    dowRE = dowRE + "|\\?|\\*|" + dowRERange + "(?:," + dowRERange + ")*" ; 
    field_re.put("dow", dowRE); 

    StringBuilder fieldsReSB = new StringBuilder(); 
    fieldsReSB.append("^\\s*(").append("$") // 
     .append("|#") // 
     .append("|\\w+\\s*=") // 
     .append("|") // 
     .append("(")// 
     .append(field_re.get("sec")).append(")\\s+(")// 
     .append(field_re.get("min")).append(")\\s+(")// 
     .append(field_re.get("hour")).append(")\\s+(")// 
     .append(field_re.get("day")).append(")\\s+(")// 
     .append(field_re.get("month")).append(")\\s+(")// 
     .append(field_re.get("dow")).append(")(|\\s)+(")// 
     .append(field_re.get("year"))// 
     .append(")")// 
     .append(")")// 
     .append("$"); 

    cronRegex = fieldsReSB.toString(); 
    } 
    return cronRegex; 
} 

मैं किसी भी तरह से कर रहा हूँ एक regex विशेषज्ञ का मतलब है, लेकिन कम से कम यह सब क्वार्ट्ज द्वारा दिए गए उदाहरण पर काम करने लगता है documentation

+0

बहुत अच्छा! यह मान्य है लेकिन दुर्भाग्य से काम नहीं करता है: "0 8 9? 1/1 मॉन # 3 *"। मुझे लगता है कि इस चीज़ को ठीक करने के लिए मुझे अपने regex-fu पर ब्रश करना होगा ... – vincentjames501

-1

मुझे जिथब पर "क्वार्ट्जनेट" परियोजना में निम्नलिखित नियमित अभिव्यक्ति मिली। मुझे लगता है कि क्वार्ट्ज क्रॉन एक्सप्रेशन को सत्यापित करने के लिए उपयोग किया जा सकता है।

लिंक: https://github.com/quartznet/quartznet/blob/master/src/Quartz/Xml/job_scheduling_data_2_0.xsd

(((([0-9]|[0-5][0-9])(-([0-9]|[0-5][0-9]))?,)*([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]))?)|(([\*]|[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]))?)|(([\*]|[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]))?,)*([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]))?)|(([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))?)|((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]))?)|([1-7]/([1-7]))|(((MON|TUE|WED|THU|FRI|SAT|SUN)(-(MON|TUE|WED|THU|FRI|SAT|SUN))?,)*(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])))?,)*((19[7-9][0-9])|(20[0-9][0-9]))(-((19[7-9][0-9])|(20[0-9][0-9])))?)?) 
1

आप cron-utils इतना ही नहीं की जाँच करेगा क्रॉन मान्य है इस्तेमाल कर सकते हैं, लेकिन आप अलग क्रॉन प्रारूपों से लक्षित करने के लिए परिवर्तित कर सकते हैं एक (पूर्व .: उपयोगकर्ता एक यूनिक्स आदानों अगर क्रॉन अभिव्यक्ति, आप आसानी से क्वार्ट्ज में परिवर्तित हो सकते हैं और एक को डीबी तक जारी रख सकते हैं)।

// Turn cron expressions into another format by using CronMapper: 
CronMapper cronMapper = CronMapper.fromUnixToQuartz(); 

Cron quartzCron = cronMapper.map(unixCron); 
// and to get a String representation of it, we can use 
quartzCron.asString(); 

//validate the cron expression! 
quartzCron.validate() 
संबंधित मुद्दे