Paw*_*ski 4 java quartz-scheduler
Quartz JobDataMap有以下问题。我希望当使用简单的 Quartz Job并将非原始对象(例如StringBuilder 的实例)传递到JobDateMap 时,应该始终使用我放置的不同对象副本调用方法execute(从我的工作)。不幸的是,我总是得到我放入JobDateMap的对象实例(就像它是一个 StatefulJob)。
在下面的示例中,我希望在每次调用中都得到一个 '*',而每次我都会再得到一个 '*'。
public class MyJob implements Job {
public static void main(String[] args) throws SchedulerException {
SchedulerFactory schedFact = new StdSchedulerFactory();
Scheduler sched = schedFact.getScheduler();
JobDetail jobDetail = new JobDetail("job", Scheduler.DEFAULT_GROUP, MyJob.class);
jobDetail.getJobDataMap().put("param", new StringBuilder());
Trigger trigger = TriggerUtils.makeImmediateTrigger("trigger", 10, 100);
trigger.setGroup(Scheduler.DEFAULT_GROUP);
sched.scheduleJob(jobDetail, trigger);
sched.start();
try {
Thread.sleep(1000L);
} catch (Exception e) {}
sched.shutdown(true);
}
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
StringBuilder sb = (StringBuilder) context.getMergedJobDataMap().get("param");
sb.append("*");
System.out.println(sb.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
我想,我缺少有关 Quartz 工作方式的一些信息。有人知道什么吗?
“仅在 JobDataMap 中存储原始数据类型(包括字符串),以避免短期和长期的数据序列化问题。”
来源:http : //www.quartz-scheduler.org/documentation/2.3.1-SNAPSHOT/best-practices.html#jobdatamap-tips
Quartz 中还有其他功能可以让您以更优化的方式传递非基元。查看 SchedulerContext 类功能。
using System;
using System.Text;
using Quartz;
using Quartz.Impl;
namespace QuartzNET.Samples
{
class Program
{
static void Main(string[] args)
{
// Create RAMJobStore instance
DirectSchedulerFactory.Instance.CreateVolatileScheduler(1);
ISchedulerFactory factory = DirectSchedulerFactory.Instance;
// Get scheduler and add object
IScheduler scheduler = factory.GetScheduler();
scheduler.Context.Add("History", new StringBuilder("Runtime History: "));
// Create job and trigger
IJobDetail job = JobBuilder.Create<MyJob>()
.WithIdentity("MyJob")
.Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("Trigger")
.StartNow()
.WithSimpleSchedule(x => x
.WithInterval(TimeSpan.FromMinutes(1))
.RepeatForever())
.Build();
// Run it all
scheduler.Start();
scheduler.ScheduleJob(job, trigger);
}
}
class MyJob : IJob
{
public void Execute(IJobExecutionContext context)
{
var history = context.Scheduler.Context["History"] as StringBuilder;
history.AppendLine(context.NextFireTimeUtc.ToString());
Console.WriteLine(context.NextFireTimeUtc);
}
}
}
Run Code Online (Sandbox Code Playgroud)
根据JobDataMap 的最佳实践,我们不应该在 JobDataMap 中放置复杂的对象,以避免短期或长期问题。(可能存在序列化的问题,当然通过修改 Complex 对象类来实现 Serializable 是无法解决的。)
解决方法:将 复杂对象作为Json 字符串传递,并在从 JobDataMap 检索后反序列化它们。
例如,
class OrderLine {
private long orderLineId;
private Item item;
}
class Item {
private long itemId;
private String itemName;
}
//Putting OrderLine object in JobDataMap
jobDetail.getJobDataMap().put("complexData", new Gson().toJson(new OrderLine()));
// Retrieving data from JobDataMap
String complexDataString =
context.getJobDetail().getJobDataMap().getString("complexData");
OrderLine orderLine = new Gson().fromJson(complexDataString, OrderLine.class);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11474 次 |
| 最近记录: |