Как отправлять исключения из заданий таймера Sharepoint?

#sharepoint-2010

#sharepoint-2010

Вопрос:

У меня есть класс MyMainApplication, который является SPIisWebServiceApplication. Итак, он размещен и работает под управлением IIS.

У меня есть пользовательское задание таймера sharepoint, скажем, с именем CustomTimerJob class, который является производным от класса SPJobDefinition. Итак, задания таймера выполняются под OWSTimer.exe

У меня есть два вопроса: [Пожалуйста, смотрите код ниже, чтобы связать вопросы]

  1. Переменные в моем CutomTimerJob, доступны ли они из calle, в моем примере это было бы задание var job = new CustomTimerJob(); job.RunNow(); , будет ли у задания varibale ссылка на выполняемое customeTimerJob и сможет ли оно получить значение job.status ? Я видел, что люди использовали ключевое слово [persisted] для обозначения переменных, чтобы сохранить состояние. Я был бы признателен, если кто-нибудь сможет подробнее рассказать об этом. Почему это используется и как это на самом деле работает, где это сохраняется?

  2. Может ли исключение отправляться обратно вызываемому? Насколько я понимаю, логично, что исключение не будет отправлено обратно вызываемому, поскольку задание таймера выполняется в отдельном процессе. Но, тогда возникает вопрос, когда он выполняет это var job = new CustomTimerJob(); , на что указывает переменная job ?

Написанный мной код выглядит примерно так :

 >     Class MyMainApplication : SPIiWebServiceApplication
>     {
>     // something
>     .
>     .
>     .
>     void some_function()
>     {
>     // Create and run the timer job immediately
>     
>     var job = new CustomTimerJob()
>     job.RunNow();
>     
>     // Give it a bit of time before checking the status
>     Thread.Sleep(5000);
>     
>     // Want to print the status to see if it was changed when it ran 
>     Console.Writeln( job.Status );
>     
>     }
>     
>     }
>     
>     ----------------------
>     
>     class CustomTimerJob : SPJobDefinition
>     {
>     
>     public Boolean status;
>     // something
>     
>     public override void Execute(Guid contentDbId)
>     {
>     status = true;
>     try {
>     // do some processing
>     } catch (Exception) {
>     
>     // Can I throw the exception up from here ? And will the calle get the exception
>     // throw new CustomException(e);
>     
>     }
>     
>     }
  

Я действительно ценю читателей, у которых хватило духу дочитать до этой строки. Слава от меня!

Заранее спасибо.

Ответ №1:

SPJobDefinition.RunNow() Метод только планирует выполнение, которое затем выполняется в контексте OWSTimer.exe процесса. Следовательно, ответы на ваши вопросы таковы:

  1. Нет, они недоступны. Точнее, созданный вами экземпляр — это не тот экземпляр, который будет выполнен, и он даже находится в другом процессе.
  2. Нет, по той же причине исключение не будет распространено на ваше то место, куда вы вызываете RunNow() . Как правило, это плохая практика — разрешать распространение необработанного исключения за пределы пользовательского задания таймера, потому что тогда задание считается неудачным. Если только это не то, что вам нужно для правильной обработки исключений.

Комментарии:

1. Каков наилучший способ узнать, когда завершилось выполнение моего CustomTimerJob? (Это задание таймера runonce, запускаемое RunNow)