Quartz Scheduler:如何将自定义对象作为JobParameter传递?

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)


And*_*eas 5

当您安排作业时,您可以在对象JobDataMap上设置 a 并将其传递给您的调度程序, quartz.net 教程JobDetail中描述了一些限制。该作业可以通过以下方式访问数据:

JobDataMap dataMap = context.JobDetail.JobDataMap;
Run Code Online (Sandbox Code Playgroud)

不过,我更喜欢通过注入作业的存储库来访问我的作业配置。


Gre*_*lor 5

在多线程环境中,我在上面的 hillstuk 答案中得到了意想不到的结果。\n这是我使用 Newtonsoft\xe2\x80\xa6 的解决方案享受

\n\n
public 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}\n
Run Code Online (Sandbox Code Playgroud)\n