Timer lavoro Errore di installazione - Errore nell'acquisizione di riferimento al sito

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

  •  16-10-2019
  •  | 
  •  

Domanda

I Have problema strano intalling personalizzato definizione processo timer per specifiche webapplication.

L'ambiente è 2x WFE + 1x application server.

lo sviluppo e la messa in scena funziona bene (scatole singolo server)

... metodo 'FeatureActivated' per la funzione '6ae97a43-a342-4f66-8416-2b492c88f896' ha generato un'eccezione: Microsoft.SharePoint.SPException: ( questo è il mio errore personalizzato -> ** verificato un errore durante l'installazione Timer Job Definition) - Errore ** ottenendo riferimento al sito - a MyTimerJob.TimerJobInstaller.FeatureActivated (SPFeatureReceiverProperties proprietà) a MyTimerJob.TimerJobInstaller.FeatureActivated (SPFeatureReceiverProperties proprietà) a Microsoft.SharePoint.SPFeature.DoActivationCallout (booleano fActivate, booleano fForce)

Questo accade quando si tenta di attivare la mia funzione di processo timer. Lo fa lo stesso se mi attivarla dall'interfaccia utente o da STSADM ...

Ecco il codice ricevitore e feature.xml

public override void FeatureActivated(SPFeatureReceiverProperties properties)
    {
        try
        {
            const string featureGuid = "6ae97a43-a342-4f66-8416-2b492c88f896";
            const string schedulePropertyName = "ScheduledRunTime";  

            // register the the current web
            SPWebApplication webApp = properties.Feature.Parent as SPWebApplication;

            if (webApp == null)
            {
                throw new SPException("Error obtaining reference to context WebApplication");
            }

            //Verify and check if the job is already in place -> delete job
            foreach (SPJobDefinition job in webApp.JobDefinitions)
            {
                if (job.Name == JOB_NAME)
                    job.Delete();
            }

            // install the job
            MyTimerJob timerJob = new MyTimerJob(JOB_NAME, webApp) { IsDisabled = false };
            //Time
            SPFeatureDefinition timerJobFeature = GetFeatureProperties(featureGuid);

            //Obtain schedule
            SPSchedule schedule = SPSchedule.FromString(timerJobFeature.Properties[schedulePropertyName].Value);

            //Declare schedule
           timerJob.Schedule = schedule;

            timerJob.Update();
        }
        catch (Exception ex)
        {
            throw new SPException("Error occurred while installing Timer Job Definition - " + ex.Message + " - " + ex.StackTrace);
        }
    }


    private static SPFeatureDefinition GetFeatureProperties(string featureGuid)
    {
        if (featureGuid != null)
        {
            //Gets all farm features in the object
            SPFeatureDefinitionCollection farmFeatures = SPFarm.Local.FeatureDefinitions;

            //Gets specifiv feature with GUID
            SPFeatureDefinition featureDefinition = farmFeatures[new Guid(featureGuid)];

            //returns specific propertyValue
            return featureDefinition;
        }
        return null;
    }



    <?xml version="1.0" encoding="utf-8" ?>
<Feature xmlns="http://schemas.microsoft.com/sharepoint/"
         Id="6ae97a43-a342-4f66-8416-2b492c88f896"
         Title="MyTimerJob"
         Description="MyJob"
         Scope="WebApplication"
         Hidden="False"
         Version="1.0.0.0"
         ReceiverAssembly="MyTimerJob, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adc8d8d2b59e51ea"
         ReceiverClass="MyTimer.TimerJobInstaller">
  <Properties>
    <Property Key="ScheduledRunTime" Value="every 1 minutes"/>
  </Properties>
</Feature>
È stato utile?

Soluzione

I risolto il problema modificando il codice contructor simili come segue

linea originale

 // install the job
        MyTimerJob timerJob = new MyTimerJob(JOB_NAME, webApp) { IsDisabled = false };

Linea Modified (opere)

 // install the job
            MyTimerJob timerJob = new MyTimerJob(JOB_NAME, webApp);

Io davvero non so che è andato storto prima, ma che lo fa!

Altri suggerimenti

Nel mio progetto attuale, ho sviluppato una serie di funzionalità in tutto lo spazio del progetto di provisioning. Come parte di questo, ho deciso che come ci sono stati un sacco di attività da svolgere durante la creazione e la configurazione del nuovo sito, lo sviluppo di un Timer di SharePoint di lavoro è stata l'opzione migliore.

lezione appresa Quindi 1 # - Non è possibile a livello di codice creare un processo timer da una funzione di raccolta siti. La ragione di questo è che in genere il pool di applicazioni che si occupa il sito non ha il permesso di scrittura per il database di configurazione. La creazione di un processo timer richiede di essere in grado di scrivere la definizione processo timer nel database di configurazione, quindi se il pool di applicazioni non dispone dei diritti, quindi la creazione del processo non riuscirà.

Quindi, in pratica si deve creare una funzione di applicazioni Web di livello (cioè attivato tramite scheda Gestione applicazioni di Amministrazione centrale) con un metodo ricevitore funzione che crea il processo timer. Per es.

La creazione del processo timer nel codice è in realtà abbastanza semplice. Di seguito è riportato il codice di attivazione funzione / disattivazione:

utilizzando Microsoft.SharePoint; utilizzando Microsoft.SharePoint.Administration; utilizzando Collaboration.Projects.Provisioning; namespace Collaboration.Projects.FeatureCode { /// /// Crea il processo timer che esegue il processo di creazione del sito per le richieste confermate nella lista richiesta di provisioning /// Classe CollabProjectProvisioningTimerJob pubblica: SPFeatureReceiver { public override vuoto FeatureActivated (SPFeatureReceiverProperties proprietà) { applicazione SPWebApplication = properties.Feature.Parent come SPWebApplication; DeleteProvisioningJob (applicazione); // installare il lavoro ProjectSpaceCreationTimerJob provisioningJob = nuovo ProjectSpaceCreationTimerJob (applicazione); pianificazione SPMinuteSchedule = new SPMinuteSchedule () {BeginSecond = 0, EndSecond = 59, intervallo = 30}; provisioningJob.Schedule = pianificazione; provisioningJob.Update (); } public override FeatureDeactivating void (SPFeatureReceiverProperties proprietà) { DeleteProvisioningJob (properties.Feature.Parent come SPWebApplication); } public override vuoto FeatureInstalled (proprietà SPFeatureReceiverProperties) { } public override FeatureUninstalling void (SPFeatureReceiverProperties proprietà) { } /// /// di eliminare il processo di provisioning se esiste /// /// DeleteProvisioningJob private void (applicazione SPWebApplication) { foreach (lavoro SPJobDefinition in application.JobDefinitions) { if (job.Name == ProjectSpaceConstants.ProvisioningJobName) job.Delete (); } } } }

Ora la classe ProjectSpaceCreationTimerJob appena eredita da SPJobDefinition. Di seguito è riportato un frammento di codice (nota che il metodo Execute è la realtà codice che viene eseguito quando viene eseguito il lavoro).

using System; using System.Net; using System.Web; utilizzando Microsoft.SharePoint; utilizzando Microsoft.SharePoint.Administration; utilizzando Collaboration.Projects.Resources; utilizzando Collaboration.Provisioning; utilizzando Collaboration.Common; utilizzando System.Text;

namespace Collaboration.Projects.Provisioning { Classe ProjectSpaceCreationTimerJob pubblica: SPJobDefinition { pubblico ProjectSpaceCreationTimerJob (): base () {} pubblico ProjectSpaceCreationTimerJob (SPWebApplication web) : Base (ProjectSpaceConstants.ProvisioningJobName, web, null, SPJobLockType.Job) { this.title = ProjectSpaceConstants.ProvisioningJobName; }

public override void Execute(Guid targetInstanceId)
{
  // your code goes here
  base.Execute(targetInstanceId);
}

} }

Spero che questo aiuti. L'ho scritto qui in modo che io ricordo in futuro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top