2014-06-06 3 views
0

프로덕션 환경에서 Documents라는 문서 라이브러리가 있습니다. 라이브러리의 열을 기반으로 전자 메일을 보내기위한 타이머 작업을 작성했습니다.사용자 지정 타이머 작업이 프로덕션에서 작동하지 않습니다.

모든 것이 dev 환경에서는 좋았지 만 prod의 타이머 작업이 예외를 제공합니다. 어떤 아이디어?

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

작업 정의 CorporatePolicyReminders.DailySchedule (ID-3586f4d2-1bc1-4770 b5b8-4c2c578ee8d5)의 실행 방법은 예외가 발생했습니다. 자세한 내용은 아래에 나와 있습니다. 개체 참조가 개체의 인스턴스로 설정되지 않았습니다.

예외 스택 추적 :
CorporatePolicyReminders.CorporatePolicyReminders.SendCorporateReminder (SPWeb 웹)에서 CorporatePolicyReminders.DailySchedule.Execute (GUID contentDbId) Microsoft.SharePoint.Administration.SPTimerJobInvokeInternal.Invoke에서
(SPJobDefinition JD, 가이 드 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); 
      } 
     } 
    } 
}` 
+0

예외는 무엇입니까? –

답변

0

나는이 문제를 발견하고 그 사용자 ID가 더 이상 유효 문서의 사람에게 연락이다 (그는 내가 만드는 오전 라이브러리에 대한 접촉 컬럼에 it.Person 해결 타이머 작업). 따라서 타이머 작업은 문서의 연락처 열을 읽으려고 할 때 예외를 던지고 있습니다 (개체 참조가 개체의 인스턴스로 설정되지 않음). 나는 아래 코드를 수정하여 그 열에서 그 사람을 삭제했다.

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;