多个线程可以同时安全地调用StdSchedulerFactory返回的Scheduler实例上的方法吗?
我正在寻找可扩展的"at"替代品,具有高可用性.它必须支持在运行时添加和删除作业.
一些背景:我有一个应用程序,我触发数百万个事件,每个事件只发生一次.我不需要像机制这样的机制(本月的第一个星期日等),只需要日期,时间和背景.
目前我正在使用Quartz调度程序,虽然它是一个非常好的项目,但它很难处理我们抛出的事件数量,即使经过大量调整(分片,增加轮询间隔等)后也是如此它在下划线数据库上执行的基本锁定.而且,这对我们来说有点矫枉过正,因为基本上我们有数百万次一次触发,而且工作量相对较少.
我很感激任何建议
我对Quartz很新,我对工作生命周期有些怀疑.
假设我有一个单独的工作配置来做一些事情.
这项工作开始并结束其工作.当它再次触发它是同一个实例(可能设置为睡眠并由调度程序唤醒)或者它是一个新的作业实例(一旦作业结束它就被杀死,当再次满足触发条件时,创建一个新的作业实例) ?
我问这样的问题,因为当我调试我的应用程序(带有石英支持的Spring 3 mvc)时,我看到作业的新实例,并且每次触发作业时都会打开SimpleThreadPool $ WorkerThreadRun()的新线程,以便SimpleThreadPool $ WorkerThreadRun()线程堆积,永不终止.
我只是想知道这种行为是否正常还是我必须填补记忆;-)
谁能给我一些解释?提前致谢.
我使用simpleInjector作为IOC容器bue我没有清楚地看到ReturnJob的责任是什么,我想知道如何进行?
这是我到目前为止所做的代码:
public class SimpleInjectorJobFactory:IJobFactory
{
private readonly Container _container;
public SimpleInjectorJobFactory()
{
_container= new Container();
}
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
return _container.GetInstance(bundle.JobDetail.JobType) as IJob;
}
public void ReturnJob(IJob job)
{
throw new System.NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud) 如何检查计划的Quartz cron作业是否正在运行?有任何API可以进行检查吗?
我需要在每个月的最后一天开始工作.我尝试了以下cron表达式:
<property name="cronExpression" value="0 0 3 L * * *" />
Run Code Online (Sandbox Code Playgroud)
但得到了这个错误:
Caused by: java.lang.UnsupportedOperationException: Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.
Run Code Online (Sandbox Code Playgroud)
它不喜欢它L,但没有使用它,我怎么能在这个月的最后一天运行?
我的构建路径中包含quartz 1.8.3.jar和Spring 3.0.6 jar,但是在spring + quartz调度的所有教程中出现的包都不可用.在哪里可以找到它?
"org.springframework.scheduling.quartz.JobDetailBean"
Run Code Online (Sandbox Code Playgroud)
我是一个java EE开发人员,直到现在使用像Quartz这样的框架来安排任务.我可以看到Java EE 7具有ManagedScheduledExecutorService来安排单个或重复任务.由于我从未在实际项目中使用过这个新功能,我想知道当你有一个可移植的方法时,使用Quartz(或其他)还有什么优势吗?
谢谢!
我可以使用Quartz Scheduler库创建具有以下设置的计划吗?:
因此,产生的时间表将是:
从我所学到的:
CalendarIntervalTrigger将跳过没有第30天的月份(由以下代码创建的触发器)
try {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("HelloJob_CalendarIntervaled", "calendarIntervaled")
.build();
Calendar decemberThirty = Calendar.getInstance();
decemberThirty.set(Calendar.YEAR, 2014);
decemberThirty.set(Calendar.MONTH, Calendar.DECEMBER);
decemberThirty.set(Calendar.DAY_OF_MONTH, 30);
CalendarIntervalTrigger calendarIntervalTrigger = newTrigger()
.withIdentity("calendarIntervalTrigger", "calendarIntervaled")
.withSchedule(CalendarIntervalScheduleBuilder.calendarIntervalSchedule()
.withIntervalInMonths(2))
.startAt(decemberThirty.getTime())
.forJob(jobDetail)
.build();
scheduler.scheduleJob(jobDetail, calendarIntervalTrigger);
System.out.println(calendarIntervalTrigger.getNextFireTime());
} catch (SchedulerException e) {
e.printStackTrace(); …Run Code Online (Sandbox Code Playgroud)我是Quartz的新手.我成功安装并运行它.但是当我第二次运行它时出现错误,因为该标识已存在该作业.
这是我的代码:
public void scheduleJobs() throws Exception {
try {
int i = 0;
scheduler = new StdSchedulerFactory().getScheduler();
JobKey job1Key = JobKey.jobKey("job"+i, "my-jobs"+i);
JobDetail job1 = JobBuilder
.newJob(SimpleJob.class)
.withIdentity(job1Key)
.build();
TriggerKey tk1 = TriggerKey.triggerKey("trigger"+i, "my-jobs"+i);
Trigger trigger1 = TriggerBuilder
.newTrigger()
.withIdentity(tk1)
.withSchedule(CronScheduleBuilder.dailyAtHourAndMinute(11, 25))
.build();
scheduler.start(); // start before scheduling jobs
scheduler.scheduleJob(job1, trigger1);
i++;
printJobsAndTriggers(scheduler);
} catch (SchedulerException e) {
LOG.error("Error while creating scheduler", e);
}
}
Run Code Online (Sandbox Code Playgroud)
我试图使用整数i来更改名称,但它不起作用.你知道我该怎么办呢?非常感谢.
quartz-scheduler ×10
java ×6
c# ×1
concurrency ×1
cron ×1
crontrigger ×1
java-ee ×1
java-ee-7 ×1
jboss-eap-6 ×1
quartz.net ×1
scheduler ×1
scheduling ×1
spring ×1
spring-3 ×1