2011-02-23 172 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的当前实现将通过打开第二个连接将事务升级为分布式事务。这将对性能产生重大影响,因为分布式事务比简单事务慢得多。