3

我们有一个 Azure Web 角色,它需要监视服务总线队列以获取对早期请求的响应(然后将通过 SignalR 将其传输到客户端)。

起初我们想在 WebRole.OnStart() 中使用消息泵 (QueueClient.OnMessage)。然而,我们已经成长为非常喜欢 WebJobs SDK,尤其是它如何让程序员摆脱一些较低级别的实现和仪表板。

由于各种原因,我们希望保留 Web 角色而不是切换到网站。那么问题来了:如何在 Azure Web Role 中使用 WebJobs SDK?在一个小实验中,我们在 WebRole.cs 中修改了 Web Role 的 OnStart(),如下:

public class WebRole : RoleEntryPoint
{
    public override bool OnStart()
    {
        JobHostConfiguration config = new JobHostConfiguration()
        {
            ServiceBusConnectionString = "...", 
            StorageConnectionString = "...",
            DashboardConnectionString = "..."
        };

        JobHost host = new JobHost(config);
        host.RunAndBlock();

        return base.OnStart();
    }

    public static void ProcessQueueMessage([ServiceBusTrigger("MyQueue")] string inputText)
    {
        Trace.WriteLine(inputText);
    }
}

这似乎工作正常,但我们很难评估它对 Web 角色的影响。会不会有后果?也许是在扩展 Web 角色?

谢谢。

4

1 回答 1

3

WebJobs SDK 在 WebRole 中应该可以正常工作。

我对您的实现有一个建议:不要阻止该OnStart方法。而不是调用RunAndBlock,使用Start/ StartAsync。这不会阻止该方法,并将为作业主机创建一个单独的线程。

可能看起来像(不确定它是否编译):

public class WebRole : RoleEntryPoint
{
   private JobHost host;

   public override bool OnStart()
   {
       JobHostConfiguration config = new JobHostConfiguration()
       {
           ServiceBusConnectionString = "...", 
           StorageConnectionString = "...",
           DashboardConnectionString = "..."
       };

       host = new JobHost(config);
       host.Start();

       return base.OnStart();
   }

   // Not sure if this is the signature of OnStop
   // or even if this method is called this way
   public override bool OnStop()
   {
       host.Stop();
       return base.OnStop();   
   }

   public static void ProcessQueueMessage([ServiceBusTrigger("MyQueue")] string inputText)
   {
       Trace.WriteLine(inputText);
   }

}

于 2014-10-24T16:28:55.800 回答