是否可以在單獨的AppDomain中運行Quartz.NET作業?如果是這樣,這怎麼能實現呢?如何在單獨的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);
}
}
您可能需要創建的IJobExecutionContext
的實現,從MarshalByRefObject
和代理繼承調用到原始context
對象。考慮到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
的新實例。
你是否真的需要孤立的工作課程,不能將應用程序的東西移到工廠嗎?或者會導致泄漏。 – Betty
只是重新閱讀我的答案,我認爲如果你可以離開而不編組原始的IJobExecutionContext(這似乎令人懷疑),那麼你將不需要IsolatedJobFactory。否則,你將需要一個鉤子(即IsolatedJobFactory中的Execute方法)來允許你將IJobExecutionContext參數轉換爲可以編組到另一個AppDomain的東西。 –
- 1. 在Quartz.Net中運行作業
- 2. 如何讓Quartz.net作業在單線程的公寓中運行?
- 3. 如何從單獨的程序集中創建Quartz.NET運行作業?
- 4. Quartz.NET - 作業不運行?
- 5. Quartz.Net中的長時間運行作業
- 6. 如何在單獨的AppDomain中運行靜態方法?
- 7. 如何在單獨的AppDomain中運行方法?
- 8. 從一個單獨的程序集執行Quartz.NET作業
- 9. 在Quartz.net中從正在運行的作業中獲取數據
- 10. 在Quartz.net中的作業執行時間
- 11. 在Quartz.net中,一次運行一個作業的一個實例
- 12. ReportViewer是否在單獨的AppDomain中運行?
- 13. 如何在cron作業中依次運行單獨的PHP文件?
- 14. 每個SSIS作業是否在它自己的AppDomain下運行?
- 15. Quartz.net作業調度
- 16. 在ADOStore運行作業時出現Quartz.net錯誤
- 17. 是否可以在UI線程上運行quartz.net作業?
- 18. 在Quartz.net中,如何在使用單個IJob時阻止同時運行的作業?
- 19. 管道的運行部件作爲單獨作業
- 20. 如何檢查所有作業是否在關機前完成運行? - Quartz.net
- 21. 如何強制quartz.net作業完成
- 22. 如何用Quartz.Net暫停/恢復作業
- 23. Quartz.NET計劃程序AppDomain
- 24. Quartz.NET - 已暫停的作業
- 25. 如何在ASP.NET MVC中運行作業?
- 26. 如何在php中運行cron作業
- 27. 單獨在節點上運行某些Jenkins作業
- 28. 在Quartz.Net中調度依賴作業
- 29. 是否可以強制並行作業在單獨的Sidekiq進程中運行?
- 30. 如何發佈獨立腳本作爲cron作業運行?
爲什麼你需要這樣做?你的使用場景是什麼?如果您將調度程序作爲主應用程序的獨立Windows服務運行,那麼這還不夠嗎? – yorah
運行時代碼隔離是主要原因。我有一些我想運行的無關工作(除其他外);但有一個共同的管理區域。 Quartz工作只是大型企業集成系統的一部分。 –