L'obtention d'un Service à Exécuter à l'Intérieur de l'Azur Rôle de Travailleur
J'ai un service windows que j'ai besoin de migrer sur Azure en tant que Travailleur Rôle. Tout s'appuie très bien dans mon Azure solution. Cependant, quand je télécharge tout seul le rôle commence. Le rôle de travailleur instance est coincé à vélo entre les deux statuts, sans jamais commencer.
- D'attente pour le rôle de départ...
- Rôle stabilisateur...
Depuis l'instance, ne parvient pas à démarrer je soupçonne mon problème se situe quelque part dans mon WorkerRole.cs code. Vous trouverez ci-dessous le code. J'ai aussi inclus le code du service dans le cas où il est pertinent pour la question. Qu'ai-je fait de mal?
C'est mon WorkerRole.cs fichier:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Threading;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Diagnostics;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure.StorageClient;
using System.ServiceProcess;
namespace SBMWorker
{
public class WorkerRole : RoleEntryPoint
{
public override void Run()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service1()
};
ServiceBase.Run(ServicesToRun);
//Thread.Sleep(Timeout.Infinite);
}
}
}
C'est mon Service1.cs code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using Lesnikowski.Mail;
namespace SBMWorker
{
public partial class Service1 : ServiceBase
{
private System.Timers.Timer mainTimer;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
try
{
//config the timer interval
mainTimer = new System.Timers.Timer(foo.Framework.Configuration.SecondsToWaitBeforeCheckingForEmailsToProcess * 1000);
//handling
mainTimer.Elapsed += new System.Timers.ElapsedEventHandler(mainTimer_Elapsed);
//startup the timer.
mainTimer.Start();
//log that we started
foo.Framework.Log.Add(foo.Framework.Log.Types.info, "SERVICE STARTED");
}
catch (Exception ex)
{
try
{
foo.Framework.Log.Add(ex, true);
}
catch{throw;}
//make sure the throw this so the service show as stopped ... we dont want this service just hanging here like
//its running, but really just doing nothing at all
throw;
}
}
protected override void OnStop()
{
if (mainTimer != null)
{
mainTimer.Stop();
mainTimer = null;
}
//log that we stopped
foo.Framework.Log.Add(foo.Framework.Log.Types.info, "SERVICE STOPPED");
}
void mainTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
mainTimer.Stop();
bool runCode = true;
if (runCode)
{
try
{
//call processing
foo.Framework.EmailPackageUpdating.ProcessEmails();
}
catch(Exception ex)
{
try
{
//handle error
foo.Framework.Log.Add(ex, false);
}
catch { throw; }
}
}
mainTimer.Start();
}
}
}
Pourquoi ne pas vous mettre un try/catch autour de tout et journal de l'exception? (J'ai l'habitude de le faire de cette façon: blog.smarx.com/posts/printf-here-in-the-cloud.) ce serait beaucoup plus facile à corriger que la lecture du code et d'essayer de deviner.
Aussi, faut-il travailler quand vous de l'exécuter localement sous l'émulateur de calcul?
Je me suis séparé de rôle de travail dans une nouvelle solution (séparé de mon rôle web) et j'obtiens un message d'erreur plus spécifique. Quand je le lance en local il me dit "Impossible de démarrer le service de la ligne de commande ou d'un débogueur. Un Service Windows doit d'abord être installé (à l'aide de installutil.exe) et puis a commencé avec la ServerExplorer, les Services Windows l'outil d'Administration ou de la commande NET START."
Oh, peut-être bien ce qu'il dit est vrai. Est-ce de travailler dans une application console (oublier de Windows Azure pour l'instant)?
Il fonctionne comme un service windows si vous l'installez sur un serveur. Je n'étais pas celui qui l'a écrit, mais je suis en train de le réutiliser en tant que travailleur.
Aussi, faut-il travailler quand vous de l'exécuter localement sous l'émulateur de calcul?
Je me suis séparé de rôle de travail dans une nouvelle solution (séparé de mon rôle web) et j'obtiens un message d'erreur plus spécifique. Quand je le lance en local il me dit "Impossible de démarrer le service de la ligne de commande ou d'un débogueur. Un Service Windows doit d'abord être installé (à l'aide de installutil.exe) et puis a commencé avec la ServerExplorer, les Services Windows l'outil d'Administration ou de la commande NET START."
Oh, peut-être bien ce qu'il dit est vrai. Est-ce de travailler dans une application console (oublier de Windows Azure pour l'instant)?
Il fonctionne comme un service windows si vous l'installez sur un serveur. Je n'étais pas celui qui l'a écrit, mais je suis en train de le réutiliser en tant que travailleur.
OriginalL'auteur hughesdan | 2011-08-11
Vous devez vous connecter pour publier un commentaire.
Je pense que la racine de votre problème est que vous ne pouvez pas installer un service par programme dans les rôles Azure. Vous devez utiliser un .cmd script de démarrage et la InstallUtil pour installer correctement le service, alors vous pouvez le démarrer à partir du script ou de votre code (pense que le script est souvent préféré pour ordre d'exécution des raisons).
Voici un blog sur la façon de le faire: http://blogs.msdn.com/b/golive/archive/2011/02/11/installing-a-windows-service-in-a-worker-role.aspx
Voici un autre blog qui prend un peu différent (création d'une .Net application qui exécute l'installation, mais comme une partie du script de démarrage): http://www.bondigeek.com/blog/2011/03/25/runninginstalling-a-windows-service-in-an-azure-web-role/
Espère que ça aide
OriginalL'auteur OperatorOverload