#sharepoint-2010
#sharepoint-2010
Вопрос:
У меня есть класс MyMainApplication, который является SPIisWebServiceApplication. Итак, он размещен и работает под управлением IIS.
У меня есть пользовательское задание таймера sharepoint, скажем, с именем CustomTimerJob class, который является производным от класса SPJobDefinition. Итак, задания таймера выполняются под OWSTimer.exe
У меня есть два вопроса: [Пожалуйста, смотрите код ниже, чтобы связать вопросы]
-
Переменные в моем CutomTimerJob, доступны ли они из calle, в моем примере это было бы задание var job = new CustomTimerJob(); job.RunNow(); , будет ли у задания varibale ссылка на выполняемое customeTimerJob и сможет ли оно получить значение job.status ? Я видел, что люди использовали ключевое слово [persisted] для обозначения переменных, чтобы сохранить состояние. Я был бы признателен, если кто-нибудь сможет подробнее рассказать об этом. Почему это используется и как это на самом деле работает, где это сохраняется?
-
Может ли исключение отправляться обратно вызываемому? Насколько я понимаю, логично, что исключение не будет отправлено обратно вызываемому, поскольку задание таймера выполняется в отдельном процессе. Но, тогда возникает вопрос, когда он выполняет это 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
процесса. Следовательно, ответы на ваши вопросы таковы:
- Нет, они недоступны. Точнее, созданный вами экземпляр — это не тот экземпляр, который будет выполнен, и он даже находится в другом процессе.
- Нет, по той же причине исключение не будет распространено на ваше то место, куда вы вызываете
RunNow()
. Как правило, это плохая практика — разрешать распространение необработанного исключения за пределы пользовательского задания таймера, потому что тогда задание считается неудачным. Если только это не то, что вам нужно для правильной обработки исключений.
Комментарии:
1. Каков наилучший способ узнать, когда завершилось выполнение моего CustomTimerJob? (Это задание таймера runonce, запускаемое RunNow)