Пользовательское задание таймера не работает в производственной среде

У меня есть библиотека документов под названием «Документы в производстве». Я написал задание таймера для отправки электронных писем на основе столбцов в библиотеке.

В среде dev все было хорошо, но задание таймера в prod дает мне исключения. Любые идеи?

        Entering monitored scope (Timer Job Corporate Policies - Reminder Emails)

Метод Execute определения задания CorporatePolicyReminders.DailySchedule (ID 3586f4d2-1bc1-4770-b5b8-4c2c578ee8d5) вызвал исключение. Дополнительная информация приведена ниже. В экземпляре объекта не задана ссылка на объект.

Трассировка стека исключений:
в CorporatePolicyReminders.CorporatePolicyReminders.SendCorporateReminder(SPWeb web)
в CorporatePolicyReminders.DailySchedule.Execute(Guid contentDbId)
в Microsoft.SharePoint.Administration.SPTimerJobInvokeInternal.Invoke(SPJobDefinition jd, Guid targetInstanceId, Логическое значение isTimerService, Int32 и результат)

Выход из контролируемой области (корпоративные политики задания таймера — электронные письма с напоминаниями). Время выполнения = 364,288198639771

Метод SendCorporateReminers

 public void SendCorporateReminder(SPWeb web)
{
    SPList lstComplaint = Helper.GetList(web, "Documents", Helper.ListType.Library);

    if (lstComplaint != null)
    {
        string query = "<Where><Eq><FieldRef Name='DocFormat' /><Value Type='Choice'>Policy</Value></Eq></Where>";
        SPListItemCollection colRecords = Helper.ExecuteQueryRecursive(lstComplaint, query, null, 2000);

        if (colRecords != null && colRecords.Count > 0)
        {
            foreach (SPListItem item in colRecords)
            {

                DateTime Expires = Helper.GetSPFieldDateTimeValue(item, "Expires");
                String Title = Helper.GetSPFieldTextValue(item, "Title");
                SPFieldUserValueCollection userResp = Helper.GetUsers(item, "Contact");
                TimeSpan totaldays = DateTime.Now.Date - Expires.Date;
                Int32 days = totaldays.Days;
                String emailtemplatekeyA = "AEmail" + days.ToString();
                String emailtemplatekeyB = "BEmail" + days.ToString();
                String respToEmail = String.Empty;


                if (userResp != null && userResp.Count > 0)
                {
                    foreach (SPFieldUserValue user in userResp)
                    {
                        if (!string.IsNullOrEmpty(respToEmail))
                            respToEmail += ",";
                        respToEmail += user.User.Email;
                    }
                }
                HandleEmails handleEmail = new HandleEmails();
                handleEmail.AddValueToPlaceholder(HandleEmails.EmailPlaceHolders.SendingTypeValue.EmailRecipient, PlaceHolder.USERRESP.ToString(), respToEmail);
                handleEmail.AddValueToPlaceholder(HandleEmails.EmailPlaceHolders.SendingTypeValue.OTHER, PlaceHolder.TITLE.ToString(), Title);
                handleEmail.AddValueToPlaceholder(HandleEmails.EmailPlaceHolders.SendingTypeValue.OTHER, PlaceHolder.EXPDT.ToString(), Expires.ToShortDateString());
                handleEmail.AddValueToPlaceholder(HandleEmails.EmailPlaceHolders.SendingTypeValue.OTHER, PlaceHolder.ID.ToString(), item.ID.ToString());
                handleEmail.SendMail(web, emailtemplatekeyA);
                handleEmail = new HandleEmails();
                handleEmail.AddValueToPlaceholder(HandleEmails.EmailPlaceHolders.SendingTypeValue.EmailRecipient, PlaceHolder.USERRESP.ToString(), respToEmail);
                handleEmail.AddValueToPlaceholder(HandleEmails.EmailPlaceHolders.SendingTypeValue.OTHER, PlaceHolder.TITLE.ToString(), Title);
                handleEmail.AddValueToPlaceholder(HandleEmails.EmailPlaceHolders.SendingTypeValue.OTHER, PlaceHolder.EXPDT.ToString(), Expires.ToShortDateString());
                handleEmail.AddValueToPlaceholder(HandleEmails.EmailPlaceHolders.SendingTypeValue.OTHER, PlaceHolder.ID.ToString(), item.ID.ToString());
                handleEmail.SendMail(web, emailtemplatekeyB);
            }
        }
    }
}`

person user28455    schedule 06.06.2014    source источник
comment
Каковы исключения, которые он дает вам?   -  person Adrian Hristov    schedule 06.06.2014


Ответы (1)


Я нашел проблему и решил ее. Лицо, чей идентификатор пользователя больше не действителен, - это связаться с лицом документа (он находится в столбце контактов для библиотеки, которую я создаю по таймеру). Таким образом, задание таймера генерирует исключение (ссылка на объект не указывает на экземпляр объекта.) всякий раз, когда оно пытается прочитать столбец «Контакт» документа. я понял это, изменив свой код, как показано ниже, и удалил этого человека из этого столбца.

    Helper.WriteUlsInformation("Item processing:" + i.ToString(), TraceSeverity.Verbose);
                    DateTime Expires = Helper.GetSPFieldDateTimeValue(item, "Expires");
                    Helper.WriteUlsInformation("Expires:" + Expires.ToString(), TraceSeverity.Verbose);
                    String Title = Helper.GetSPFieldTextValue(item, "Title");
                    Helper.WriteUlsInformation("Title:" + Title, TraceSeverity.Verbose);
                    SPFieldUserValueCollection userResp = Helper.GetUsers(item, "Contact");
                    Helper.WriteUlsInformation("UserResp read" , TraceSeverity.Verbose);
                    TimeSpan totaldays = DateTime.Now.Date - Expires.Date;
                    Int32 days = totaldays.Days;
                    Helper.WriteUlsInformation("Days:"+ days.ToString(), TraceSeverity.Verbose);
                    String emailtemplatekeyA = "AEmail" + days.ToString();
                    String emailtemplatekeyB = "BEmail" + days.ToString();
                    String respToEmail = String.Empty;
person user28455    schedule 10.06.2014