#c# #sitecore #job-scheduling
#c# #ядро сайта #планирование заданий
Вопрос:
Проблема
В настоящее время я пытаюсь настроить запланированную задачу Sitecore в базе данных, используя расписания и команды.
До сих пор я следовалhttp://sdn.sitecore.net/FAQ/Administration/Scheduled tasks.aspx для большей части того, что мне было нужно. Их метод использует: public void WriteToLogFile(Item[] itemArray, CommandItem commandItem, ScheduleItem scheduledItem)
. Я предполагаю, что это элементы, переданные в элементе расписания, сам командный элемент и сам элемент расписания.
У меня есть функция run, которая следует тому же синтаксису: protected void run(Item[] itemArray, CommandItem commandItem, ScheduleItem scheduleditem)
. Однако я получаю исключение, поскольку оно выполняется в моих журналах. Связан стек исключений:http://pastie.org/1847345, но вот вложенное исключение:
Exception: System.NullReferenceException
Message: Object reference not set to an instance of an object.
Source: fhservices at fhservices.twitterPull.run(Item[] itemArray, CommandItem commandItem, ScheduleItem scheduleditem)
Я попробовал принять несколько разных комбинаций параметров, но безуспешно.
Раздел веб-конфигурации планирования:
<scheduling>
<!-- Time between checking for scheduled tasks waiting to execute -->
<frequency>00:01:00</frequency>
<!-- Agent to process schedules embedded as items in a database -->
<agent type="Sitecore.Tasks.DatabaseAgent" method="Run" interval="00:02:00">
<param desc="database">core</param>
<param desc="schedule root">/sitecore/system/tasks/schedules</param>
<LogActivity>true</LogActivity>
</agent>
...
Кто-нибудь знает параметры, которые sitecore отправляет с методами, которые вызываются с помощью этого метода запуска заданий?
Ответ №1:
Согласно фрагменту, на который вы ссылались в SDN, я думаю, вы создаете свой собственный метод, похожий на WriteToLogFile
, но не Run()
. В шаге 4 говорится:
Заполните необходимые поля:
Тип: пользовательские запланированные задачи.Задача 1, пользовательские запланированные задачи
Метод: WriteToLogFile
Тип указывает пространство имен и файл сборки. Метод указывает метод для вызова в указанном классе.
Теперь ваша команда готова к использованию в качестве запланированной задачи.
Итак, вместо вашего Run()
метода назовите его как-нибудь иначе и задайте его в Method
поле команды в Sitecore. Run()
это метод в DatabaseAgent из Sitecore, который выполняется.
Комментарии:
1. Я изменил это на что-то другое ради того, чтобы просто не быть возможным зарезервированным словом. Посмотрим, как это пойдет.
2. Честно говоря, я думаю, что это могло бы решить проблему? 1. Я изменил метод с именем на pull 2. Я изменил это в соответствующей команде. 3. Возникла проблема, потому что я считаю, что VS не создавал отладочную версию. 4. Заменен файл на правильную сборку. 5. Попытался настроить отладку точки останова и добавил ссылку на мой проект Sitecore. 6. Перешел к элементу, чтобы проверить, запущен ли он, он был. 7. Просмотрел журнал, и все прошло успешно на всем протяжении. — Никакой другой код, кроме имени и связанной команды, изменен не был. Не совсем уверен, было ли это «запущено» или нет, но это, казалось, исправило это.
3. Я забыл отметить важное изменение. Я чувствую себя глупо. Метод, который я вызывал, был защищенным, а не общедоступным (оставшимся от копирования и вставки старого метода Page_Load).
Ответ №2:
Похоже, ваша задача действительно запущена. В исключении ничего не упоминается о невозможности найти ваш метод, и исключение происходит из вашего метода tasks. Попробуйте установить точку останова внутри метода и проверить, какой объект равен null.
Просто для справки, параметрами, передаваемыми запланированной задаче, являются элементы, указанные в поле элементы команды, элемент определения команды и элемент определения расписания.
Комментарии:
1. Это то, о чем я подумал. Возможно, глупый вопрос, но я довольно новичок в .Net. Это скомпилированная DLL вне проекта, есть ли способ, которым я все еще могу установить точку останова и иметь возможность отлаживать? Думаю, я зациклился на этом, и мне не пришлось бы спрашивать, могу ли я это сделать.
2. Алистер, мне все еще интересно узнать, как я буду выполнять отладку . библиотеки DLL в моем проекте с Sitecore, если решите написать сообщение в блоге или отправить личное электронное письмо, я был бы безмерно благодарен. Спасибо за помощь.
3. Да, вы можете легко это отладить. Просто убедитесь, что вы выполняете отладочную сборку, чтобы получить файл .pdb в каталоге bin с вашей DLL. Это отладочные символы, необходимые отладчику. Затем в Visual Studio используйте «Прикрепить к процессу» и прикрепите к вашему ASP.NET рабочий процесс … это зависит от вашей версии IIS. Теперь установите свои контрольные точки и вуаля.
4. Извините, я не ответил Алексу. Я подумал, что SO отправит мне электронное письмо, если кто-нибудь прокомментирует мой ответ. В любом случае, Брайан описал выше процесс отладки в DLL, который не является частью вашего основного проекта. Главное — подключиться к процессу, а не запускать отладчик с помощью F5.
Ответ №3:
Что ж… в определении вашего метода указано «выполнить», маленькая буква r. Но в web.config, который вы запустили, используется big R. Sitecore .Чистое отражение здесь, чтобы найти метод, поэтому он будет чувствителен к регистру.
Мои запланированные задачи настроены в System / Tasks, а не в web.config. Работает как по волшебству.
Комментарии:
1. Да. Честно говоря, я также использую System / Tasks. Я считаю, что в моем коде есть что-то неправильное. Для моей задачи также был установлен метод ‘run’. Заглавная буква «R» была всего лишь агентом для DatabaseAgent, через который Sitecore запускает всю систему / задачи. Если вы можете ответить на вопрос в ответ на ответ Алистара, это могло бы помочь мне, если вы знаете, как это сделать. Спасибо!