如何制作连续的WebJob?

时间:2014-04-23 13:08:20

标签: c# azure azure-webjobs

我创建了一个Azure WebJob,如以下脚本中所示,该项目从Azure存储队列中取出项目,然后将其存储到Azure表中。该过程在1或2秒内完成运行,但它在一分钟内仅运行几次(偶尔在大约10分钟内停止运行)。总的来说,它不能很好地运作。

我错过了什么?也许我混合了触发器工作和连续工作,但很难找到合适的样品。

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("started at {0}", DateTime.Now.ToString("s"));

        // Continuous job should have infinite loop.
        while(true){
            var host = new JobHost();
            host.RunAndBlock();
        }
    }

    public static void ProcessQueueMessage([QueueInput("blogqueue")] string json)
    {
        var storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings    ["StorageConnectionString"].ConnectionString);
        var tableClient = storageAccount.CreateCloudTableClient();

        // Store it to Azure Table Storage
        // omitted...

        Console.WriteLine("Received JSON: {0}", json);
    }

3 个答案:

答案 0 :(得分:6)

一些评论:

  1. 您不需要while(true)声明。 RunAndBlock内部已经有一个while循环,它将阻止它。
  2. 您不需要手动检索表格。您可以绑定到表格,如示例here
  3. 中所示
  4. 您可以绑定到存储帐户,无需手动从配置文件中读取连接字符串并创建实例。
  5. 以下是绑定到存储帐户的示例:

    public static void ProcessQueueMessage([QueueInput("blogqueue")] string json, CloudStorageAccount) 
    {
        ...
    }
    

    这是一个疯狂的猜测但是,从您的代码中,似乎存储连接字符串存储在配置文件中的StorageConnectionString中。 JobHost要求(1)运行时连接字符串和数据存储在AzureJobsDataAzureJobsRuntime中(如here所述)或(2)传递连接字符串作为JobHost构造函数的参数。我认为这就是崩溃的原因。

答案 1 :(得分:3)

只需在ProjectName / Properties / webjob-publish-settings.json

中更改发布设置即可
"runMode": "OnDemand"  =>  "runMode": "Continuous"

答案 2 :(得分:2)

要使连续的WebJob正常工作,您需要在网站的配置选项卡中启用“始终开启”。

“Always On”功能仅适用于Basic / Standard网站计划,如果未启用,WebJob可能会在一段时间后停止运行。