2010-06-01 20 views
7

के साथ सर्वर फार्म वातावरण में टाइमर नौकरियों को तैनात करने के लिए सर्वोत्तम अभ्यास मेरे पास एक टाइमर नौकरी है जो मैं पूरे खेत के लिए प्रति दिन केवल एक बार दौड़ना चाहता हूं। मैंएकाधिक WFE

  1. इसे एकाधिक WFE वातावरण में तैनात कैसे करें? क्या मैं प्रत्येक WFE में stsadm -o deploysolution कमांड चलाता हूं, या सिर्फ वह जहां मैं इसे चलाने के लिए चाहता हूं?
  2. मुझे सुविधा को सक्रिय करना चाहिए? क्या इसे केवल एक विशेष डब्ल्यूएफई से सक्रिय किया जाना चाहिए?
  3. SPJobLockType का मूल्य क्या होना चाहिए।

उत्तर

7

ऐसा लगता है कि आपको खेत की स्कॉप्ड सुविधा की आवश्यकता है, जो इस नौकरी को चलाने वाली सेवा स्थापित करता है। यहां बताया गया है कि मैंने यह कैसे किया (एक सहकर्मी द्वारा लिखित कोड का उपयोग करके, ईमानदार होने के लिए, लेकिन वह एसओ में नहीं है)।

फीचर इवेंट रिसीवर के साथ एक सुविधा.एक्सएमएल फ़ाइल बनाएं।

<Feature 
    Id="..." 
    Title="..." 
    Description="..." 
    Scope="Farm" 
    Version="1.0.0.0" 
    Hidden="FALSE" 
    ReceiverAssembly="XXX.FarmService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxx" 
    ReceiverClass="XXX.FarmService.XXXFarmFeatureEventReceiver" 
    xmlns="http://schemas.microsoft.com/sharepoint/"> 
</Feature> 

घटना रिसीवर के अंदर:

public override void OnFeatureActivated(SPFeatureReceiverProperties properties) 
    { 
     try 
     { 
      SPFarm farm = SPFarm.Local; 

      // Get Service, if it already exists 
      JobService myService = null; // JobService is a subclass of SPService 
      foreach (SPService service in farm.Services) 
      { 
       if (String.Compare(service.Name, JobService.XXXServiceName, true) == 0) 
       { 
        myService = (service as JobService); 
        break; 
        } 
       } 

       if (cegService == null) 
       { 
        // Create service 
        myService = new JobService(farm); 
        myService.Update(); 

        // Create service instances 
        JobServiceInstance myServiceInstance; // JobServiceInstance is a subclas of SPServiceInstance 
        foreach (SPServer server in farm.Servers) 
        { 
         myServiceInstance = new JobServiceInstance(server, myService); 
         myServiceInstance.Update(); 
        } 
       } 

       // Dayly schedule 
       SPDailySchedule schedule = new SPDailySchedule(); 
       schedule.BeginHour = 1; 
       schedule.EndHour = 1; 
       schedule.BeginMinute = 0; 
       schedule.EndMinute = 59; 

       // Our own job; JobCheckDocDates is a subclass of SPJobDefinition 
       JobCheckDocDates newJob = new JobCheckDocDates(cegService, null, SPJobLockType.Job); 
       newJob.Schedule = schedule; 
       newJob.Update(); 
       myService.JobDefinitions.Add(newJob); 
       myService.Update(); 
      } 
      catch (Exception e) 
      { 
       Logger.Error("[" + properties.Feature.Definition.DisplayName + "] Error during feature activation", e); 
      } 
     }   

यह एक सेवा खेत में हर सर्वर पर उपलब्ध बनाता है।

उपवर्गों पर कुछ और जानकारी:

public class JobCheckDocDates: Common.BaseJob 
{ 
    /// <summary> 
    /// The job name 
    /// </summary> 
    public static string JobName = "XXX job"; 

    /// <summary> 
    /// Constructor 
    /// </summary> 
    public JobCheckDocDates() : base() { } 

    /// <summary> 
    /// Constructor 
    /// </summary> 
    /// <param name="service"></param> 
    /// <param name="server"></param> 
    /// <param name="lockType"></param> 
    public JobCheckDocDates(SPService service, SPServer server, SPJobLockType lockType) 
      : base(JobName, service, server, lockType) { } 

...

और निश्चित रूप से विधि निष्पादित।

public class JobService : SPService 
{ 
    public static string XXXServiceName = "XXX Service"; 

    public override string DisplayName 
    { 
     get 
     { 
      return XXXServiceName; 
     } 
    } 

    public override string TypeName 
    { 
     get 
     { 
      return "XXX Service Type"; 
     } 
    } 

    /* An empty public constructor required for serialization. */ 
    public JobService() { } 

    public JobService(SPFarm farm) 
      : base(XXXServiceName, farm) 
    {   
    } 
} 


    public class JobServiceInstance : SPServiceInstance 
    { 
     /// <summary> 
     /// Eos Service Instance Name 
     /// </summary> 
     public static string XXXServiceInstanceName = "XXXServiceInstance"; 

     /// <summary> 
     /// Manage Link 
     /// </summary> 
     private SPActionLink _manageLink; 

     /// <summary> 
     /// Provision Link 
     /// </summary> 
     private SPActionLink _provisionLink; 

     /// <summary> 
     /// Unprovision Link 
     /// </summary> 
     private SPActionLink _unprovisionLink; 

     /// <summary> 
     /// Roles 
     /// </summary> 
     private ICollection<string> _roles; 

     /// <summary> 
     /// Manage Link 
     /// </summary> 
     public override SPActionLink ManageLink 
     { 
      get 
      { 
       if (_manageLink == null) 
       { 
        _manageLink = new SPActionLink(SPActionLinkType.None); 
       } 
       return _manageLink; 
      } 
     } 

     /// <summary> 
     /// Provision Link 
     /// </summary> 
     public override SPActionLink ProvisionLink 
     { 
      get 
      { 
       if (_provisionLink == null) 
       { 
        _provisionLink = new SPActionLink(SPActionLinkType.ObjectModel); 
       } 
       return _provisionLink; 
      } 
     } 

     /// <summary> 
     /// Unprovision Link 
     /// </summary> 
     public override SPActionLink UnprovisionLink 
     { 
      get 
      { 
       if (_unprovisionLink == null) 
       { 
        _unprovisionLink = new SPActionLink(SPActionLinkType.ObjectModel); 
       } 
       return _unprovisionLink; 
      } 
     } 

     /// <summary> 
     /// Roles 
     /// </summary> 
     public override ICollection<string> Roles 
     { 
      get 
      { 
       if (_roles == null) 
       { 
        _roles = new string[1] { "Custom" }; 
       } 
       return _roles; 
      } 
     } 

     /// <summary> 
     /// Empty constructor 
     /// </summary> 
     public JobServiceInstance() : base() { } 

     /// <summary> 
     /// Constructor 
     /// </summary> 
     /// <param name="server">The server</param> 
     /// <param name="service">The Eos service</param> 
     public JobServiceInstance(SPServer server, JobService service) 
      : base(XXXServiceInstanceName, server, service) 
     { 
     } 

अब, केंद्रीय व्यवस्थापक में, सर्वर पर संचालन/सेवाएं पर जाएं। वांछित सर्वर चुनें और सेवा शुरू करें।

प्रश्नों की अपनी सूची का उत्तर देने के लिए: 1. WFE के स्वतंत्र रूप से केवल एक बार समाधान को तैनात करें। 2. चूंकि सुविधा खेत-स्कॉप्ड है, इसे केंद्रीय व्यवस्थापक में सक्रिय किया जाना चाहिए। 3. SPJobLockType SPJobLockType.Job

यह वही नहीं है जो आपने कल्पना की थी, लेकिन यह सुविधा का उपयोग करने के बाद भी आपको यह चुनने का लाभ है कि नौकरी कहाँ चलती है (उदाहरण के लिए यदि कोई सर्वर बन जाता है अन्य सामान के साथ अधिभारित)।

ऑनफ्यूचर सक्रिय विधि स्मार्ट हो सकती है और यदि सेवा मौजूद है तो प्रत्येक सर्वर की जांच करें और यदि आवश्यक हो तो इसे जोड़ें। लेकिन OnFeatureDeactivated में प्रत्येक सेवा से सेवा को निकालना आसान है। इसलिए, यदि आप नए सर्वर जोड़ते हैं, तो निष्क्रिय करें फिर सुविधा को पुनः सक्रिय करें।