我已经安装了Quartz .NET并创建了Quartz数据库。我需要用我自己的自定义数据来扩展Quartz作业存储。例如,当我通过Quartz API添加作业时,我需要在同一个数据库事务中向我自己的自定义表中添加附加信息。我知道在Quartz中有一个名为JobStoreCMT的类,但是我一直没有找到任何简明的例子来说明如何向Quartz提供NHibernate创建的事务。集成Quartz .NET和NHibernate
4
A
回答
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的当前实现将通过打开第二个连接将事务升级为分布式事务。这将对性能产生重大影响,因为分布式事务比简单事务慢得多。
我不认为这是Quartz.Net的有效用例。你可以说得更详细点吗?你是否想要将其他自定义数据传递给Quartz.Net作业,还是想更新自己的数据库?请记住,在您的NHibernate事务关闭后,Quartz.Net作业可能会很长时间触发,因此您无法在作业中重复使用现有事务(您可以做的最好的做法是在作业中打开一个新会话,持有ISessionFactory)。 – yorah 2011-03-03 18:05:25