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 * * * * ?
我正在尝试将 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 * * * * ?