2016-07-08 6 views
7

Я начал читать документацию Hangfire и ничего не нашел о ограничениях задач.Ограничения по запланированным задачам (или как выполняется сохранение задач)?

Как заявлено, задачи (или задания) где-то хранятся.

Поскольку они являются просто делегатами, единственное, что может быть сохранено, насколько я понимаю, является делегатом «тело» (IL?). Но могут быть замыкания, которые обеспечивают некоторый контекст для задачи, например, некоторые внешние службы, которые могут потребовать загрузки дополнительных сборок для запуска их кода и т. Д.

Как Hangfire справляется с этим?
Может ли задача содержать какие-либо инструкции в ее теле или какие-либо ограничения?

ответ

1

Когда вы создаете задание, он вызывает Job.FromExpression, если вы передаете ему что-либо иное, кроме выражения вызова метода, оно выдает исключение. Таким образом, единственное, что вы можете передать в BackgroundJob.Enqueue, это одна строка, в которой эта строка вызывает функцию.

Затем он сериализует их тип объекта и все параметры передаются в JSON с использованием JobHelper.ToJson. Когда вы передаете экземпляр класса, экземпляр не сериализуется, только тип есть, если выполнение пересекает границы процесса, оно потеряет внутреннее состояние.

Вы можете прочитать на статье в блоге на сайте блог старого замедленного воспламенения «Are your methods ready to run in background?»

+0

Спасибо за ответ и ссылку на статью! Я думаю, у меня есть мое объяснение, и вывод заключается в том, что методы работы/задачи очень * ограничены их содержанием. Нужно передать ** все ** состояние, необходимое для выполнения задания. Если нужно какое-то динамическое состояние, он должен получить его из состояния, которое было сериализовано при планировании заданий (например, идентификатор пропущенной записи в базе данных или имя файла/путь). Я немного разочарован - это очень важные вещи, которые должны быть размещены поверх домашней страницы Hangfire. – Dennis

0

Похоже, что механизм основан на Expression для операций планирования, а библиотека предназначена для «внутреннего» (в процессе) исполнения в основном на веб-сайтах ASP.Net.

Смысл, все сборки, необходимые для выполнения запланированной операции, должны быть уже загружены в пространство памяти веб-приложений, поскольку они необходимы для планирования задания (приложение не было скомпилировано, если в нем отсутствовали Type от сборку, на которую не ссылались).

Надеюсь, что все станет понятным!

+0

«приложение будет не собрало, если он пропускал тип из сборки, которая не ссылается» - I означает динамическую сборку, например некоторые сценарии на основе плагинов, когда точные сборки плагинов неизвестны во время компиляции. – Dennis