¿Cómo puedo obtener una referencia a un objeto SPWEB SpeciFC en un trabajo de temporizador personalizado?

sharepoint.stackexchange https://sharepoint.stackexchange.com/questions/14815

  •  16-10-2019
  •  | 
  •  

Pregunta

Tengo un trabajo de temporizador personalizado que importa datos de una fuente externa a una lista específica en una web específica en mi instalación de SharePoint 2010. Ese es el trabajo solo es relevante para una lista en una web.

Estoy teniendo un diablo obteniendo una referencia a esa web (y, por lo tanto, a la lista) dentro de mi SPJobDefinition clase.

Podría codificar la ruta del sitio y obtenerlo con un nuevo comando SPSIT ("SomeUrl"), pero preferiría obtenerlo del contexto del trabajo de alguna manera para que funcione sin problemas en mis entornos de desarrollo, prueba y producción. .

Intenté pasar el sitio Guid en el SPEventreceiver que programa el trabajo, pero cada vez que mi SPJobDefinition El objeto se crea, parece estar utilizando el constructor sin parámetros en lugar del que usé en el SPEventReciever.FeatureActivated manipulador.

Así que mi pregunta es esta:
¿Cómo puedo obtener una referencia al objeto spweb (o alternativamente un objeto spsite) desde el interior del SPJobDefinition.Execute() ¿método?

¿Fue útil?

Solución

Creo que ha creado un trabajo de temporizador de aplicaciones web. Si no, es posible que desee hacer eso. Ver referencia (Paso 2, bala no 7)

Y luego, como se describe en el Paso 2, el elemento 10 de la bala en el enlace anterior, puede escribir código como este:

public override void Execute(Guid targetInstanceId)
{
  // Execute the timer job logic.
  SPWebApplication webApp = this.Parent as SPWebApplication;
  SPList taskList = webApp.Sites[0].RootWeb.Lists["Tasks"];     
}

ACTUALIZACIÓN: Además de eso, en su evento característico, es posible que desee verificar si la colección del sitio (o sitio) en la que se activa la función tiene la lista en la que actuará el trabajo del temporizador. En caso afirmativo, solo cree una instancia del trabajo de temporizador de la aplicación web.

Otros consejos

Tenga un constructor en su trabajo que recibe una URL SPWEB o String, y luego almacene la URL web y la URL de la lista y cualquier otra propiedad que desee como propiedad persistida en el trabajo.

Recomiendo crear una función con escolta web para instalar el trabajo del temporizador y crearlo con un nombre que tenga la identificación web que se agrega (por la singularidad en caso de que desee el trabajo en múltiples redes). El evento activado de la función tendría la web y todas sus propiedades allí para poder pasar al constructor del trabajo.

Vea mi publicación de blog para obtener más información sobre exactamente esto:http://spmonkeypoint.wordpress.com/2011/11/14/custom-sharepoint-2010-timer-job

Aquí está el listado de código de esa publicación:

using System;
using System.Runtime.InteropServices;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;

namespace MonkeyPoints.TimerJobs
{
    [Guid("6DD003C3-2861-4F63-B974-D2653E713A74")]
    public class CustomTimerJob : SPJobDefinition
    {
        [Persisted]
        public string WebUrl;

        [Persisted]
        public string ListUrl;

        public CustomTimerJob() : base() { }

        public CustomTimerJob(SPWeb web, string listUrl) : this(JobName(web), web, listUrl) { }

        public CustomTimerJob(string jobName, SPWeb web, string listUrl)
            : base(jobName, web.Site.WebApplication, null, SPJobLockType.Job)
        {
            this.WebUrl = web.Url;
            this.ListUrl = listUrl;
        }

        protected static string JobName(SPWeb web)
        {
            return "CustomTimerJob_" + web.ID;
        }

        protected override bool HasAdditionalUpdateAccess()
        {
            return true;
        }

        public override void Execute(Guid targetInstanceId)
        {
            try
            {
                using (var site = new SPSite(WebUrl))
                using (var web = site.OpenWeb())
                {
                    // process whatever you need to on this list
                }
            }
            catch (Exception ex)
            {
                SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory(this.Name, TraceSeverity.Unexpected, EventSeverity.Error), TraceSeverity.Unexpected, ex.Message, ex.StackTrace);
            }
        }

        public static void Install(SPWeb web, string listUrl, SPSchedule schedule)
        {
            using (SPSite site = new SPSite(web.Site.ID, web.Site.SystemAccount.UserToken))
            using (SPWeb eweb = site.OpenWeb(web.ID))
            {
                site.AllowUnsafeUpdates = true;
                eweb.AllowUnsafeUpdates = true;
                Uninstall(eweb);
                var syncJob = new CustomTimerJob(eweb, listUrl);
                syncJob.Schedule = schedule;
                syncJob.Update();
            }
        }

        public static void Uninstall(SPWeb web)
        {
            var jobName = JobName(web);
            foreach (SPJobDefinition job in web.Site.WebApplication.JobDefinitions)
            {
                if (job.Name == jobName)
                    job.Delete();
            }
        }

        public static void RunNow(string webUrl, string listUrl)
        {
            using (SPSite site = new SPSite(webUrl))
            using (SPWeb web = site.OpenWeb())
            {
                var job = new CustomTimerJob(web, listUrl);
                job.Execute(Guid.Empty);
            }
        }
    }
}

Puede crear una página para configurar una configuración en la aplicación web y luego usar la configuración de la aplicación web para controlar el SPWEB utilizado.

Para hacer esto, implementaría una página de solicitud en SharePoint. Lo pondría a disposición en Central Admin (probablemente utilizando un control de AplicationsElector de web para elegir qué aplicación web para establecer el valor).

(La razón por la que haría esto en el administrador central es que actualizar las propiedades de la aplicación web requiere acceso de escritura a la base de datos de configuración, y solo puede tener esto en el administrador central, dependiendo de su configuración)

Luego, en 'Guardar' para ti, nuevo porque tendrías algo como:

protected WebApplicationSelector _selector = ...

public void SaveIt() {
  SPWebAppliction webApp = _selector.CurrentItem;
  webApp.Properties["MyWeb"] = "SomeValue";
  webApp.Update();
}

Luego, en el trabajo del temporizador, debería poder acceder a las propiedades de la aplicación web y leer el valor que necesita.

En su código TimerJob, puede iterar a través de todas las colecciones de sitios en la aplicación web de contexto y verificar la existencia de un elemento de bolsa de propiedad personalizada en la red raíz (deberá agregar esto usted mismo) que contiene la URL (del servidor pariente) a una SPWEB en esa colección de sitios.

Licenciado bajo: CC-BY-SA con atribución
scroll top