gpt4 book ai didi

java - Quartz JobDataMap 不适用于非原始类型

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:12:54 27 4
gpt4 key购买 nike

我在使用 Quartz JobDataMap 时遇到以下问题。我希望在使用简单的 Quartz Job 并将非原始对象(例如 StringBuilder 的实例)传递到 JobDateMap 时,方法 execute(来 self 的工作)应该总是用我放置的不同副本来调用。不幸的是,我总是得到放入 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());

}
}

我想,我遗漏了一些关于 Quartz 工作原理的信息。有人知道吗?

最佳答案

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);
}
}
}

关于java - Quartz JobDataMap 不适用于非原始类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14562379/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com