2011-02-23 170 views
4

我已經安裝了Quartz .NET並創建了Quartz數據庫。我需要用我自己的自定義數據來擴展Quartz作業存儲。例如,當我通過Quartz API添加作業時,我需要在同一個數據庫事務中向我自己的自定義表中添加附加信息。我知道在Quartz中有一個名爲JobStoreCMT的類,但是我一直沒有找到任何簡明的例子來說明如何向Quartz提供NHibernate創建的事務。集成Quartz .NET和NHibernate

+0

我不認爲這是Quartz.Net的有效用例。你可以說得更詳細點嗎?你是否想要將其他自定義數據傳遞給Quartz.Net作業,還是想更新自己的數據庫?請記住,在您的NHibernate事務關閉後,Quartz.Net作業可能會很長時間觸發,因此您無法在作業中重複使用現有事務(您可以做的最好的做法是在作業中打開一個新會話,持有ISessionFactory)。 – yorah 2011-03-03 18:05:25

回答

1

我對JobStoreCMT的理解是,您使用.NET 2.0中引入的System.Transactions命名空間中的類聲明瞭所有事務。幸運的NHibernate的與這些交易運作良好,以及,所以你會把你的Quartz操作和NHibernate的操作在一個單一的TransactionScope,像下面這樣:

using (var ts = new TransactionScope()) { 

    // do something with your scheduler here, eg 
    _scheduler.ScheduleJob(someJobDetail, someTrigger); 

    // create an NHibernate session that will be part of the same transaction 
    using (var session = _sessionFactory.OpenSession()) { 

     // perform actions on session here, but do *not* make use of 
     // NHibernate transaction methods, such as ISession.BeginTransaction(), 
     // because the transaction is controlled via the TransactionScope instance. 

    } 

    ts.Complete(); 
} 

上面的代碼假定別處以下瓦爾聲明和初始化:

Quartz.IScheduler _scheduler; 
NHibernate.ISessionFactory _sessionFactory; 

上面的代碼示例沒有包含詳細信息,但這是一般的想法。

您可能遇到的一個問題是,上述代碼將需要分佈式事務,因爲Quartz JobStoreCMT類創建一個數據庫連接,並且NHibernate會話創建另一個數據庫連接。雖然有可能(至少在SQL Server中)有兩個不同的數據庫連接共享相同的事務,但我的理解是,System.Transactions的當前實現將通過打開第二個連接將事務升級爲分佈式事務。這將對性能產生重大影響,因爲分佈式事務比簡單事務慢得多。