Quartz 调度程序时间设置 - 不接受逗号

Quartz scheduler time setting - comma not accepted

我正在尝试将 Quartz 作业设置为每小时 运行 每分钟,但 0 分钟和 30 分钟除外。

当我尝试这样配置时:

ScheduledSenderJob=0 2-28 * * * ?

它非常适合我。 但是当我尝试这个时:

ScheduledSenderJob=0 2-28,35-58 * * * ?

启动 Glassfish 服务器时出现异常:CronException,无效字符,。不知怎么的,逗号字符似乎不起作用,我无法解决它。

有人可以帮助我吗,正确的安排是什么? 谢谢。

堆栈跟踪:

Caused by: java.lang.RuntimeException: java.lang.RuntimeException: CronExpression '0 2-28' is invalid,.
at eu.pont.zf.szkif.sched.quartz.QuartzServicesImpl.startScheduling(QuartzServicesImpl.java:200)
at eu.pont.zf.szkif.sched.quartz.QuartzServicesImpl.init(QuartzServicesImpl.java:78)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)
at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)
at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5388)
at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)
at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571)
at org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:49)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:861)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)
at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571)
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162)
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:861)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)
at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:370)
at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5360)
at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5348)
at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:206)
... 48 more

更新:

为您提供对 ScheduledSenderJob 的访问权限的任何软件 属性 都在解释字符串并在逗号上进行标记。下面是一个示例应用程序,它从 java 属性文件加载您的 cron 表达式并且运行没有问题:

import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.TriggerBuilder.newTrigger;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;

    import org.quartz.SchedulerFactory;
    import org.quartz.Trigger;


    /**
     * Hello world!
     *
     */
    public class App 
    {

        public static void main( String[] args )
        {
             SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();

              Scheduler sched;
            try {
                sched = schedFact.getScheduler();

                Properties props = new Properties();
                InputStream inputStream = sched.getClass().getClassLoader()
                        .getResourceAsStream("test.properties");

                props.load(inputStream);

                String cronString = props.getProperty("cron");

                  // define the job and tie it to our HelloJob class
                  JobDetail job = JobBuilder.newJob(HelloJob.class)
                      .withIdentity("myJob", "group1")
                      .build();

                System.out.println( "Hello World!" );
                Trigger trigger = newTrigger()
                        .withIdentity("trigger3", "group1")
                        .withSchedule(cronSchedule(cronString))
                        .forJob("myJob", "group1")
                        .build();

                sched.scheduleJob(job,trigger);
                sched.start();
            } catch (SchedulerException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        }

    }

HelloJob.java:

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloJob implements Job{

    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        System.out.println("Hello ! ");

    }

}

test.properties - 我将计时位移动到秒以更快地查看结果。

cron=2-28,35-58 * * * * ?