gpt4 book ai didi

sharepoint - 在具有多个 WFE 的服务器场环境中部署计时器作业的最佳实践

转载 作者:行者123 更新时间:2023-12-03 16:49:21 24 4
gpt4 key购买 nike

我有一个计时器工作,我只想每天为整个农场运行一次。我如何能

  • 将其部署在多个 WFE 环境中?我是在每个 WFE 中运行 stsadm -o deploysolution 命令,还是只在我想要运行它的地方运行?
  • 我应该在哪里激活该功能?它应该只从特定的 WFE 激活吗?
  • SPJobLockType 的值应该是多少。
  • 最佳答案

    看起来您需要一个农场范围的功能,安装运行此作业的服务。这是我是如何做到的(老实说,使用同事编写的代码,但他不在 SO 中)。

    使用功能事件接收器创建一个 feature.xml 文件。

    <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) { }

    ...

    当然还有 Execute 方法。
    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)
    {
    }

    现在,在 Central Admin 中,转到服务器上的操作/服务。选择所需的服务器并启动服务。

    要回答您的问题列表:
    1. 仅部署一次解决方案,独立于 WFE。
    2. 由于该功能是农场范围的,它应该在 Central Admin 中激活。
    3. SPJobLockType 是 SPJobLockType.Job

    这与您想象的不完全一样,但它的优点是让您可以轻松选择作业的运行位置,即使在您安装该功能很久之后(例如,如果服务器因其他东西而过载)。

    OnFeatureActivated 方法可以更智能,检查每个服务器是否存在服务并在需要时添加它。但是从 OnFeatureDeactivated 中的每个服务中删除服务更简单。因此,如果您添加新服务器,请停用然后重新激活该功能。

    关于sharepoint - 在具有多个 WFE 的服务器场环境中部署计时器作业的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2953585/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com