Получение службы для запуска внутри рабочей роли Azure - PullRequest
10 голосов
/ 12 августа 2011

У меня есть служба Windows, которую нужно перенести на Azure в качестве рабочей роли. Все отлично работает в моем решении Azure. Однако, когда я загружаю все, запускается только веб-роль. Экземпляр рабочей роли зацикливается между двумя следующими состояниями, даже не запускаясь.

  • Ожидание начала роли ...
  • Стабилизирующая роль ...

Поскольку экземпляр не запускается, я подозреваю, что моя проблема лежит где-то в моем коде WorkerRole.cs. Ниже вы найдете этот код. Я также включил код для сервиса на случай, если он имеет отношение к вопросу. Что я сделал не так?

Это мой файл WorkerRole.cs:

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

}
}

Это мой код Service1.cs:

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();
    }
}
}

1 Ответ

6 голосов
/ 15 августа 2011

Я думаю, что корень вашей проблемы в том, что вы не можете программно установить службу в ролях Azure. Вам нужно использовать сценарий запуска .cmd и InstallUtil для правильной установки службы, затем вы можете запустить ее из сценария или из своего кода (думаю, что сценарий часто предпочтителен по причинам порядка выполнения).

Вот сообщение в блоге о том, как это сделать: http://blogs.msdn.com/b/golive/archive/2011/02/11/installing-a-windows-service-in-a-worker-role.aspx

Вот еще одно сообщение в блоге, в котором используется немного другой подход (создание приложения .Net, которое выполняет установку, но опять же как часть сценария запуска): http://www.bondigeek.com/blog/2011/03/25/runninginstalling-a-windows-service-in-an-azure-web-role/

Надеюсь, что поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...