Quartz.NETジョブを別のAppDomainで実行することはできますか?もしそうなら、これはどのように達成できますか?別のAppDomainでQuartz.NETジョブを実行するにはどうしたらいいですか?
答えて
免責事項:私はこれを試していない、単なるアイデアです。そして、このコードはどれもコンパイルされていません。
実際のジョブのラッパーを作成するカスタムジョブファクトリを作成します。このラッパーに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
の新しいインスタンスを指定します。
あなたは本当に独立したジョブクラスが必要ですか?代わりに、appdomainのものを工場に移すことはできませんでしたか?または漏れの原因となります。 – Betty
オリジナルのIJobExecutionContextをマーシャリングせずに(怪しいと思われますが)、IsolatedJobFactoryを必要としない場合は、私の答えを読み直してください。それ以外の場合は、IJobExecutionContext引数を他のAppDomainにマーシャリングできるものに変換できるようにするため、フック(IsolatedJobFactoryのExecuteメソッド)が必要になります。 –
- 1. Quartz.NET実行ジョブを別のアセンブリから作成するにはどうすればよいですか?
- 2. 各SSISジョブは、自身のAppDomainで実行されますか?
- 3. UIスレッドでquartz.netジョブを実行できますか?
- 4. javaを使用して既存のsqoopジョブを実行するにはどうしたらいいですか?
- 5. Clockworkジョブを手動で実行するにはどうしたらいいですか?
- 6. キューワーカーでcronジョブを実行するにはどうしたらいいですか? (laravel 5.3)
- 7. WebサイトのルートURLをQuartz.NETジョブから取得するにはどうすればよいですか?
- 8. 別のジョブが完了したらジョブをトリガーするにはどうすればよいですか?
- 9. Quartz.Net - 今すぐジョブを実行し、ADODataStoreのトリガーとジョブを削除する
- 10. Jenkinsジョブを実行するにはどうすればいいですか?
- 11. 別のPythonモジュールから__main__を実行するにはどうしたらいいですか?
- 12. 別のPHPバージョンでcronjob経由でcakephpシェルを実行するにはどうしたらいいですか?
- 13. 隔週のジョブをスケジュールするにはどうしたらいいですか?
- 14. 個別のappdomainでmvcビューを実行
- 15. IdleでPythonを実行するにはどうしたらいいですか?
- 16. エディタでmongodbを実行するにはどうしたらいいですか?
- 17. 宣言的パイプラインで別のジョブからジョブを開始するにはどうすればよいですか?
- 18. SQLエージェントまたはジョブからexeファイルを実行するにはどうすればよいですか?
- 19. ローカルMavenプロジェクトを別のマシンで実行するにはどうしたらいいですか?
- 20. Quartz.NetのLog4NetからNLogに切り替えるにはどうしたらいいですか?
- 21. マスターブランチのファイルを実行するにはどうしたらいいですか?
- 22. AppDomain、アセンブリ.exeまたは.dllを実行していますか?
- 23. サーブレットプログラムを実行するにはどうしたらいいですか?
- 24. com.apple.tools.info-plist-utilityを実行するにはどうしたらいいですか?
- 25. RailsのAmazon EC2インスタンスで長期実行ジョブを実行するにはどうすればよいですか?
- 26. NUnitで別のappdomainでユニットテストを実行する
- 27. 正しいブランチでブートを確実に実行するにはどうしたらいいですか?
- 28. Quartz.Netのすべてのジョブとスケジュールを定期的に再ロードするにはどうしたらいいですか?
- 29. スキャナでnextDouble()を実行するにはどうしたらよいですか?
- 30. wpfアプリケーションを実行した後にAppDomainをアンロードできない
なぜあなたはそれをする必要がありますか?あなたの使用シナリオは何ですか?あなたのメインアプリケーションとは別のWindowsサービスとしてスケジューラを実行する場合は、十分ではありませんか? – yorah
ランタイムコードの分離が主な理由です。私には(他のものの中でも)実行したい無関係の仕事がたくさんあります。共通の管理領域を持っています。 Quartzジョブは、大規模なエンタープライズ統合システムの一部にすぎません。 –