Kya*_*ein 14 c# asp.net quartz.net c#-3.0
我打算编写一个ASP.NET页面来按需触发作业.目前,我使用SimpleTrigger类来触发作业,但是__Trigger类都没有在JobParameters中支持对象类型作为值,并且据我所知,在钩子下使用WCF Tcp绑定将参数传递给作业调度引擎.我想知道如何将自定义对象(可序列化)作为作业参数传递.谢谢你的建议!
hil*_*tuk 35
传递Quartz作业执行时可以检索的对象有两种方法:
在数据映射中传递实例.设置作业时,使用如下键将实例添加到地图:
// Create job etc...
var MyClass _myInstance;
statusJob.JobDataMap.Put("myKey", _myInstance);
// Schedule job...
Run Code Online (Sandbox Code Playgroud)
在作业的Execute()方法中检索实例,如下所示:
public void Execute(IJobExecutionContext context)
{
var dataMap = context.MergedJobDataMap;
var myInstance = (MyClass)dataMap["myKey"];
Run Code Online (Sandbox Code Playgroud)
要么
在设置作业时将实例添加到调度程序上下文中,如下所示:
ISchedulerFactory schedFact = new StdSchedulerFactory();
_sched = schedFact.GetScheduler();
_sched.Start();
// Create job etc...
var MyClass _myInstance;
_sched.Context.Put("myKey", myInstance);
// Schedule job...
Run Code Online (Sandbox Code Playgroud)
在作业的Execute()方法中检索实例,如下所示:
public void Execute(IJobExecutionContext context)
{
var schedulerContext = context.Scheduler.Context;
var myInstance = (MyClass)schedulerContext.Get("myKey");
Run Code Online (Sandbox Code Playgroud)
当您安排作业时,您可以在对象JobDataMap上设置 a 并将其传递给您的调度程序, quartz.net 教程JobDetail中描述了一些限制。该作业可以通过以下方式访问数据:
JobDataMap dataMap = context.JobDetail.JobDataMap;
Run Code Online (Sandbox Code Playgroud)
不过,我更喜欢通过注入作业的存储库来访问我的作业配置。
在多线程环境中,我在上面的 hillstuk 答案中得到了意想不到的结果。\n这是我使用 Newtonsoft\xe2\x80\xa6 的解决方案享受
\n\npublic void InitJob() {\n\n MyClass data = new MyClass {Foo = \xe2\x80\x9cFoo fighters\xe2\x80\x9d}; \n\n /* a unique identifier for demonstration purposes.. Use your own concoction here. */\n int uniqueIdentifier = new Random().Next(int.MinValue, int.MaxValue); \n\n IJobDetail newJob = JobBuilder.Create<MyAwesomeJob>()\n .UsingJobData("JobData", JsonConvert.SerializeObject(data))\n .WithIdentity($"job-{uniqueIdentifier}", "main") \n .Build();\n\n}\n\n/* the execute method */\npublic class MyAwesomeJob : IJob\n{\n public void Execute(IJobExecutionContext context)\n { \n var jobData = JsonConvert.DeserializeObject<MyClass>(context.JobDetail.JobDataMap.GetString("JobData")); \n }\n}\n\n/* for completeness */\npublic class MyClass {\n string Foo { get; set; } \n}\nRun Code Online (Sandbox Code Playgroud)\n