2011-08-21 6 views
14

私はオンデマンドでジョブを起動するASP.NETページを作成する予定です。現在のところ、SimpleTriggerクラスを使用してジョブをトリガーしていますが、__TriggerクラスのどれもJobParametersの値としてオブジェクト型をサポートしていないため、ジョブスケジューリングエンジンにパラメータを渡すためにWCF Tcpバインディングがフックで使用されています。カスタムパラメータ(シリアライズ可能)をジョブパラメータとして渡す方法を知りたい。 あなたのアドバイスありがとう!クォーツスケジューラ:カスタムオブジェクトをJobParameterとして渡す方法は?

答えて

4

ジョブをスケジュールするときにJobDetailオブジェクトにJobDataMapを設定し、これをスケジューラに渡すことができます。quartz.net tutorialに記載されているいくつかの制限があります。ジョブは、次の方法でデータにアクセスできます。

JobDataMap dataMap = context.JobDetail.JobDataMap; 

ただし、私はジョブに注入されたリポジトリを介して自分のジョブ構成にアクセスすることをお勧めします。

データマップにインスタンスを渡し:

+0

お返事をお寄せいただきありがとうございますけれども、私が探していますが、外部アプリケーションからオブジェクトを渡す方法です。 –

+0

これは私が知る必要があるものです...まだ検索中です – evermean

+0

JobDataMapを使用せずにリポジトリをどのように注入しますか?それともあなたが注射するレポだけですか? –

24

石英ジョブの実行時に取得することができるオブジェクトを渡す2つの方法があります。ジョブセットアップを設定すると、このようなキーでマップにインスタンスを追加します。

public void Execute(IJobExecutionContext context) 
     { 
      var dataMap = context.MergedJobDataMap; 
      var myInstance = (MyClass)dataMap["myKey"]; 

OR

追加:

// Create job etc... 
var MyClass _myInstance; 
statusJob.JobDataMap.Put("myKey", _myInstance); 
// Schedule job... 

は、このような仕事のExecute()メソッドでインスタンスを取得します。ジョブを設定したときのインスタンスをスケジューラーコンテキストに設定します。

ISchedulerFactory schedFact = new StdSchedulerFactory(); 
    _sched = schedFact.GetScheduler(); 
    _sched.Start(); 
    // Create job etc... 
    var MyClass _myInstance; 
    _sched.Context.Put("myKey", myInstance); 
    // Schedule job... 

私は、マルチスレッド環境で上記hillstukの答えと予期しない結果を持っていた

public void Execute(IJobExecutionContext context) 
     { 
      var schedulerContext = context.Scheduler.Context; 
      var myInstance = (MyClass)schedulerContext.Get("myKey"); 
+0

JobDataMapを使用する場合、MyClassインスタンスはどのようにシリアル化されていますか? '[Serializable]'で帰属させる必要がありますか? – Dejan

+0

Dejan、私は[Serializable]を使用していないので、インスタンスはOKです。私が知る限り、Quartzで永続的なJobStoreを使用すると、シリアライゼーションが呼び出されます。 Quartzドキュメンテーションは、シリアライズの場合、プリミティブでない型を保存することを警告しています:http://quartz-scheduler.org/documentation/best-practices。それに基づいて私の答えの例はあなたにとって役に立たないかもしれません。 – hillstuk

2

:このような仕事のExecute()メソッドでインスタンスを取得します。ここで はNewtonsoftを使用して、私のソリューションです...あなたはIJobDetailであなたのインスタンス/オブジェクトを置くことができます

public void InitJob() { 

    MyClass data = new MyClass {Foo = “Foo fighters”}; 

    /* a unique identifier for demonstration purposes.. Use your own concoction here. */ 
    int uniqueIdentifier = new Random().Next(int.MinValue, int.MaxValue); 

    IJobDetail newJob = JobBuilder.Create<MyAwesomeJob>() 
    .UsingJobData("JobData", JsonConvert.SerializeObject(data)) 
    .WithIdentity($"job-{uniqueIdentifier}", "main")     
    .Build(); 

} 

/* the execute method */ 
public class MyAwesomeJob : IJob 
{ 
    public void Execute(IJobExecutionContext context) 
    {     
     var jobData = JsonConvert.DeserializeObject<MyClass>(context.JobDetail.JobDataMap.GetString("JobData"));  
    } 
} 

/* for completeness */ 
public class MyClass { 
    string Foo { get; set; } 
} 
1

をお楽しみください。

JobDataMap m = new JobDataMap(); 
    m.Put("Class1", new Class1(){name="xxx"}); 


    IJobDetail job = JobBuilder.Create<Job>() 
      .WithIdentity("myJob", "group1") 
      .UsingJobData(m)//class object 
      .UsingJobData("name2", "Hello World!") 
      .Build(); 

使い方

public void Execute(IJobExecutionContext context) 
     { 
JobDataMap dataMap = context.JobDetail.JobDataMap; 
      Class1 class1 = (Class1)dataMap.Get("Class1"); 
string x = class1.name; 
} 
関連する問題