2011-12-05 6 views
4

Quartz.NETジョブを別のAppDomainで実行することはできますか?もしそうなら、これはどのように達成できますか?別のAppDomainでQuartz.NETジョブを実行するにはどうしたらいいですか?

+0

なぜあなたはそれをする必要がありますか?あなたの使用シナリオは何ですか?あなたのメインアプリケーションとは別のWindowsサービスとしてスケジューラを実行する場合は、十分ではありませんか? – yorah

+0

ランタイムコードの分離が主な理由です。私には(他のものの中でも)実行したい無関係の仕事がたくさんあります。共通の管理領域を持っています。 Quartzジョブは、大規模なエンタープライズ統合システムの一部にすぎません。 –

答えて

4

免責事項:私はこれを試していない、単なるアイデアです。そして、このコードはどれもコンパイルされていません。

実際のジョブのラッパーを作成するカスタムジョブファクトリを作成します。このラッパーにExecuteメソッドを実装させるには、新しいアプリドメインを作成し、そのアプリドメインで元のジョブを実行します。

さらに詳しく:新しいタイプのジョブを作成します(例:IsolatedJob : IJob)。このジョブは、コンストラクタのパラメータとして、それがカプセル化する必要があることをジョブの種類を取るています:

internal class IsolatedJob: IJob 
{ 
    private readonly Type _jobType; 

    public AutofacJob(Type jobType) 
    { 
     if (jobType == null) throw new ArgumentNullException("jobType"); 
     _jobType = jobType; 
    } 

    public void Execute(IJobExecutionContext context) 
    { 
     // Create the job in the new app domain 
     System.AppDomain domain = System.AppDomain.CreateDomain("Isolation"); 
     var job = (IJob)domain.CreateInstanceAndUnwrap("yourAssembly", _jobType.Name); 
     job.Execute(context); 
    } 
} 

あなたは、元のcontextオブジェクト上に呼び出してMarshalByRefObjectとプロキシから継承IJobExecutionContextの実装を作成する必要があるかもしれません。 IJobExecutionContextにアクセスできる他のオブジェクトの数があれば、私はジョブの実行中にほとんど必要とされないので、NotImplementedExceptionで多くのメンバーを実装したいと思うでしょう。

次はカスタムジョブファクトリが必要です。

internal class IsolatedJobFactory : IJobFactory 
{ 
    public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler) 
    { 
     return NewJob(bundle.JobDetail.JobType); 
    } 

    private IJob NewJob(Type jobType) 
    { 
     return new IsolatedJob(jobType); 
    } 
} 

最後に、このジョブファクトリを使用するようにQuartzに指示する必要があります。 IScheduler.JobFactoryプロパティーセッターを使用し、IsolatedJobFactoryの新しいインスタンスを指定します。

+0

あなたは本当に独立したジョブクラスが必要ですか?代わりに、appdomainのものを工場に移すことはできませんでしたか?または漏れの原因となります。 – Betty

+0

オリジナルのIJobExecutionContextをマーシャリングせずに(怪しいと思われますが)、IsolatedJobFactoryを必要としない場合は、私の答えを読み直してください。それ以外の場合は、IJobExecutionContext引数を他のAppDomainにマーシャリングできるものに変換できるようにするため、フック(IsolatedJobFactoryのExecuteメソッド)が必要になります。 –

関連する問題