将 Quartz .NET 与 NHibernate 集成

anv*_*lis 5 .net nhibernate quartz.net

我已经安装了 Quartz .NET 并创建了 Quartz 数据库。我需要使用我自己的自定义数据扩展 Quartz 作业存储。例如,当我通过 Quartz API 添加作业时,我需要在同一个数据库事务中向我自己的自定义表添加附加信息。我知道 Quartz 中有一个名为 JobStoreCMT 的类,但是我找不到任何简洁的示例来展示如何为 Quartz 提供 NHibernate 创建的事务。

Joh*_*ery 3

我对 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();
}
Run Code Online (Sandbox Code Playgroud)

上面的代码假设在其他地方声明并初始化了以下变量:

Quartz.IScheduler _scheduler;
NHibernate.ISessionFactory _sessionFactory;
Run Code Online (Sandbox Code Playgroud)

上面的代码示例没有提供详细信息,但这是总体思路。

您可能遇到的一个问题是,上述代码需要分布式事务,因为 Quartz JobStoreCMT 类创建一个数据库连接,而 NHibernate 会话创建另一个数据库连接。尽管(至少对于 SQL Server)可以让两个不同的数据库连接共享同一个事务,但我的理解是,System.Transactions 的当前实现将在打开第二个连接时将事务升级为分布式事务。这将对性能产生重大影响,因为分布式事务比简单事务慢得多。