Frage

Ich bin mit Quarz mit Java Jobs zu planen. Eine Sache ist, dass ich speichern cron Ausdrücke auf einer Datenbank, und ich möchte sie zu einem Benutzer präsentieren, sondern in einer besser lesbaren Form. Also ich frage mich, ob es ist ein Dienstprogramm, das einen Cron-Ausdruck in einen Menschen lesbaren String umwandeln könnte. So etwas wie:

"" 0 30 10-13? * WED, FRI“  wird werden "Feuer um 10:30, 11:30, 12:30 und 13:30, jeden Mittwoch und Freitag."

War es hilfreich?

Lösung

Eine Java-Bibliothek, die cron Ausdrücke in für Menschen lesbaren Strings konvertiert: https://github.com/RedHogs/cron-parser

Andere Tipps

Nun ja, ich habe verstehe Ihre Frage. Aber ich hätte erklärt meine Antwort ein wenig besser.

Nein, ich kenne kein Tool, das Ihnen helfen, einen Cron-Ausdruck in „menschlich“ lesbarer Form zu bekommen. Aber durch den Zugang zum CronExpression bekommen können Sie erstellen Sie besitzen.

Versuchen Aufruf

cronTrigger.getExpressionSummary() 

auf dem Cron-Ausdruck:

"0/2 * * 4 * ?"

Es gibt die folgende Zeichenfolge:

seconds: 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58
minutes: *
hours: *
daysOfMonth: 4
months: *
daysOfWeek: ?
lastdayOfWeek: false
nearestWeekday: false
NthDayOfWeek: 0
lastdayOfMonth: false
calendardayOfWeek: false
calendardayOfMonth: false
years: *

Mit dem Zugriff auf das CronExpression Objekt haben, können Sie Ihre eigene "human" explenation erstellen.

cron-utils kann für diese Aufgabe nützlich sein, da Menschen lesbare Beschreibungen liefert und nicht erfordern ein vollwertiges Scheduler sie zu sorgen. Ist gut dokumentiert und unterstützt mehrere cron-Formate.

Unter einem Code-Schnipsel aus der Dokumentation:

//create a descriptor for a specific Locale
CronDescriptor descriptor = CronDescriptor.instance(Locale.UK);

//parse some expression and ask descriptor for description
String description = descriptor.describe(parser.parse("*/45 * * * * *"));
//description will be: "every 45 seconds"

hier ist ein i gestartet. verwendet es die Sprache, die meine Nutzer (wahrscheinlich) verstehen.

es wird nicht so gut tun, mit Mischungen von Tokens wie ‚1,13,16-23, L‘ für die DAYOFMONTH Token, aber hoffentlich werde ich einige Zeit damit verbringen muß, bevor meine Nutzer, dass ausgefeilte :

package com.tacteonltd.control.cron;

import java.util.StringTokenizer;

import com.tacteonltd.control.string.STRING;
import com.tacteonltd.control.time.TIME;

public class CRON {
    public static String humanReadable(String value){
        StringBuffer sb = new StringBuffer();
        try{
            StringTokenizer tokens = new StringTokenizer(value, " ", false);
            humanizeSeconds(tokens.nextToken(), sb);sb.append("\n");
            humanizeMinutes(tokens.nextToken(), sb);sb.append("\n");
            humanizeHours(tokens.nextToken(), sb);sb.append("\n");
            String dom = tokens.nextToken();
            String month = tokens.nextToken();
            String dow = tokens.nextToken();
            humanizeDOMs(dom, dow, sb);sb.append("\n");
            humanizeMonths(month, sb);sb.append("\n");
            humanizeDOWs(dow, dom, sb);
        }catch(Throwable t){
            t.printStackTrace();
        }
        return sb.toString();
    }
    private static void humanizeDOWs(String value, String dom, StringBuffer sb){
        value=value.trim();
        if(STRING.isNumeric(value)){
            sb.append("and the " + value + postFix(value) + " day-of-the-week("+TIME.getWeekDayName(Integer.parseInt(value))+"). "); 
        }
        else if(value.equals("*"))
        {
            sb.append("and every day-of-the-week. ");
        }
        else if(value.equals("?"))
        {
            sb.append("and whatever day-of-the-week it is for day"+(STRING.isNumeric(dom) ? "":"s")+"-of-the-month :"+(STRING.isNumeric(dom) ? dom:"that match"+(STRING.isNumeric(dom) ? "es":"")+" " + dom + "."));
        }
        else if(value.indexOf("/")>-1){
            String first = value.substring(0, value.indexOf("/"));
            String every = value.substring(value.indexOf("/") + 1);
            sb.append("and the " + first + postFix(first) + " day-of-the-week and every " + every + " day" + (Integer.parseInt(every) == 1 ? "":"s") + " following. "); 
        }
        else if(value.indexOf(",")>-1){
            StringTokenizer tokens = new StringTokenizer(value, ",", false);
            sb.append("and the following days of the week: ");
            int added = 0;
            while(tokens.hasMoreTokens()){
                String token = tokens.nextToken();
                sb.append((added==0 ? "":", ") + token);added++;
            }
            sb.append(".");
        }
        else if(value.indexOf("-")>-1){
            StringTokenizer tokens = new StringTokenizer(value, "-", false);
            sb.append("and for every day of the week from " + tokens.nextToken() + " through " + tokens.nextToken() + ". ");
        }
        else {
            sb.append("and the following days of the week: " + value + ".");
        }
    }
    private static void humanizeMonths(String value, StringBuffer sb){
        value=value.trim();
        if(STRING.isNumeric(value)){
            sb.append("the " + value + postFix(value) + " month("+TIME.getMonthName(Integer.parseInt(value))+"), "); 
        }
        else if(value.equals("*"))
        {
            sb.append("every month, ");
        }
        else if(value.indexOf("/")>-1){
            String first = value.substring(0, value.indexOf("/"));
            String every = value.substring(value.indexOf("/") + 1);
            sb.append("the " + first + postFix(first) + " month("+TIME.getMonthName(Integer.parseInt(value))+") and every " + every + " month" + (Integer.parseInt(every) == 1 ? "":"s") + " following, "); 
        }
        else if(value.indexOf(",")>-1){
            StringTokenizer tokens = new StringTokenizer(value, ",", false);
            sb.append("the following months: ");
            int added = 0;
            while(tokens.hasMoreTokens()){
                sb.append((added==0 ? "":", ") + tokens.nextToken());added++;
            }
        }
    }
    private static void humanizeDOMs(String value, String dow, StringBuffer sb){
        value=value.trim();
        if(STRING.isNumeric(value)){
            sb.append("the " + value + postFix(value) + " day-of-the-month, "); 
        }
        else if(value.equals("*"))
        {
            sb.append("every day-of-the-month, ");
        }
        else if(value.equals("?"))
        {
            sb.append("whatever day-of-the-month falls upon " + dow + " , ");
        }
        else if(value.indexOf("-")>-1){
            StringTokenizer tokens = new StringTokenizer(value, "-", false);
            String from = tokens.nextToken();
            String through = tokens.nextToken();
            int year = TIME.getYear(System.currentTimeMillis());
            int month = TIME.getMonth(System.currentTimeMillis());
            String last_dom = "" + TIME.getLastDOM(year, month);
            sb.append("for every day of the month from " + from + " through " + (through.equals("L") ? "the last("+year +"." +month + "."+last_dom+")":through) );
        }
        else if(value.indexOf("/")>-1){
            String first = value.substring(0, value.indexOf("/"));
            String every = value.substring(value.indexOf("/") + 1);
            sb.append("the " + first + postFix(first) + " day-of-the-month and every " + every + " day" + (Integer.parseInt(every) == 1 ? "":"s") + " following, "); 
        }
        else if(value.indexOf(",")>-1){
            StringTokenizer tokens = new StringTokenizer(value, ",", false);
            sb.append("the following days of the month: ");
            int added = 0;
            while(tokens.hasMoreTokens()){
                String token = tokens.nextToken();
                if(token.equals("L")){
                    int year = TIME.getYear(System.currentTimeMillis());
                    int month = TIME.getMonth(System.currentTimeMillis());
                    String last_dom = "" + TIME.getLastDOM(year, month);
                    sb.append((added==0 ? "":", ") + "the last("+year +"." +month + "."+last_dom+")");
                }
                else{
                    sb.append((added==0 ? "":", ") + token);added++;
                }
            }
        }
    }
    private static void humanizeSeconds(String value, StringBuffer sb){
        value=value.trim();
        if(STRING.isNumeric(value)){
            sb.append("on the " + value + postFix(value) + " second, "); 
        }
        else if(value.equals("*"))
        {
            sb.append("on every second, ");
        }
        else if(value.indexOf("/")>-1){
            String first = value.substring(0, value.indexOf("/"));
            String every = value.substring(value.indexOf("/") + 1);
            sb.append("on the " + first + postFix(first) + " second and every " + every + " second" + (Integer.parseInt(every) == 1 ? "":"s") + " following, "); 
        }
        else if(value.indexOf("-")>-1){
            StringTokenizer tokens = new StringTokenizer(value, "-", false);
            sb.append("for every second from " + tokens.nextToken() + " through " + tokens.nextToken() + " ");
        }
        else if(value.indexOf(",")>-1){
            StringTokenizer tokens = new StringTokenizer(value, ",", false);
            sb.append("on the following seconds: ");
            int added = 0;
            while(tokens.hasMoreTokens()){
                sb.append((added==0 ? "":", ") + tokens.nextToken());added++;
            }
        }
    }
    private static void humanizeMinutes(String value, StringBuffer sb){
        value=value.trim();
        if(STRING.isNumeric(value)){
            sb.append("the " + value + postFix(value) + " minute, "); 
        }
        else if(value.equals("*"))
        {
            sb.append("every minute, ");
        }
        else if(value.indexOf("/")>-1){
            String first = value.substring(0, value.indexOf("/"));
            String every = value.substring(value.indexOf("/") + 1);
            sb.append("the " + first + postFix(first) + " minute and every " + every + " minute" + (Integer.parseInt(every) == 1 ? "":"s") + " following, "); 
        }
        else if(value.indexOf("-")>-1){
            StringTokenizer tokens = new StringTokenizer(value, "-", false);
            sb.append("for every minute from " + tokens.nextToken() + " through " + tokens.nextToken() + " ");
        }
        else if(value.indexOf(",")>-1){
            StringTokenizer tokens = new StringTokenizer(value, ",", false);
            sb.append("the following minutes: ");
            int added = 0;
            while(tokens.hasMoreTokens()){
                sb.append((added==0 ? "":", ") + tokens.nextToken());added++;
            }
        }
    }
    private static void humanizeHours(String value, StringBuffer sb){
        value=value.trim();
        if(STRING.isNumeric(value)){
            sb.append("the " + value + postFix(value) + " hour, "); 
        }
        else if(value.equals("*"))
        {
            sb.append("every hour, ");
        }
        else if(value.indexOf("/")>-1){
            String first = value.substring(0, value.indexOf("/"));
            String every = value.substring(value.indexOf("/") + 1);
            sb.append("the " + first + postFix(first) + " hour and every " + every + " hour" + (Integer.parseInt(every) == 1 ? "":"s") + " following, "); 
        }
        else if(value.indexOf("-")>-1){
            StringTokenizer tokens = new StringTokenizer(value, "-", false);
            sb.append("for every hour from " + tokens.nextToken() + " through " + tokens.nextToken() + " ");
        }
        else if(value.indexOf(",")>-1){
            StringTokenizer tokens = new StringTokenizer(value, ",", false);
            sb.append("the following hours: ");
            int added = 0;
            while(tokens.hasMoreTokens()){
                sb.append((added==0 ? "":", ") + tokens.nextToken());added++;
            }
        }
    }
    private static String postFix(String value){
        String post = null; 
            if(value.substring(value.length()-1).equals("1"))post = "st";
            else if(value.substring(value.length()-1).equals("2"))post = "nd";
            else if(value.substring(value.length()-1).equals("3"))post = "rd";
            else post="th";
        return post;
    }
}

Die CronTrigger erzeugen ein CronExpression Objekt aus dem Cron-Ausdruck String. Aber man kann keinen Zugriff darauf erhalten. Aber durch Reflexion verwenden Sie können:

Class c = cronTrigger.getClass();
Field f = c.getDeclaredField("cronEx");
f.setAccessible(true);
CronExpression cronEx = (CronExpression) f.get(cronTrigger);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top