Интеграция Quartz .NET с NHibernate - PullRequest
4 голосов
/ 23 февраля 2011

Я установил Quartz .NET и создал базу данных Quartz. Мне нужно расширить хранилище заданий Quartz моими собственными данными. Например, когда я добавляю задание через API-интерфейс Quartz, мне нужно добавить дополнительную информацию в мои собственные пользовательские таблицы в той же транзакции базы данных. Я знаю, что в Quartz есть класс JobStoreCMT, но я не смог найти кратких примеров, показывающих, как предоставить Quartz транзакцию, которую создает NHibernate.

1 Ответ

2 голосов
/ 01 декабря 2011

Мое понимание JobStoreCMT заключается в том, что вы объявляете все свои транзакции, используя классы в пространстве имен System.Transactions, которое было представлено в .NET 2.0. К счастью, 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 обновит транзакцию до распределенной транзакции с открытием второго соединения. Это существенно повлияет на производительность, поскольку распределенная транзакция значительно медленнее, чем простая транзакция.

...