如何在没有"始终开启"的情况下保持Azure WebJob的运行

Kir*_*ran 10 azure azure-web-sites azure-webjobs azure-webjobssdk

我有一个与网站相关联的连续webjob,我在共享模式下运行该网站.我不想转到Always On选项,因为我的应用程序并不需要.我只想在给我的网站打电话时处理这条消息.

我的问题是,几分钟后工作仍然停止,即使我每隔5分钟在我的网站上不断调用一个虚拟保持方法,该方法将消息发布到由该webjob监视的队列中.

我的webjob是一个使用WebJob SDK构建的简单控制台应用程序,它具有这样的代码

JobHost host = new JobHost(new JobHostConfiguration(storageConnictionSttring));
host.RunAndBlock();
Run Code Online (Sandbox Code Playgroud)

消息处理函数如下所示:

public static void ProcessKeepAliveMessages([QueueTrigger("keepalive")] KeepAliveTrigger message)
{
    Console.WriteLine("Keep Alive message called on :{0}", message.MessageTime);
}
Run Code Online (Sandbox Code Playgroud)

该作业的消息日志基本上说

[03/05/2015 18:51:02 > 4660f6: SYS INFO] WebJob is stopping due to website shutting down
Run Code Online (Sandbox Code Playgroud)

我不介意这种情况是否会发生,但是当网站开始下一次保持活动时,webjob就不会启动.所有消息都排队,直到我进入管理仪表板或SCM门户,如下所示

https://mysite.scm.azurewebsites.net/api/continuouswebjobs
Run Code Online (Sandbox Code Playgroud)

我可以看到这样的状态:

[{"status":"Starting","detailed_status":"4660f6 - Starting\r\n","log_url":"https://mysite.scm.azurewebsites.net/vfs/data/jobs/continuous/WebJobs/job_log.txt","name":"WebJobs","run_command":"mysite.WebJobs.exe","url":"https://mysite.scm.azurewebsites.net/api/continuouswebjobs/WebJobs","extra_info_url":"https://mysite.scm.azurewebsites.net/azurejobs/#/jobs/continuous/WebJobs","type":"continuous","error":null,"using_sdk":true,"settings":{}}]
Run Code Online (Sandbox Code Playgroud)

如果有人能帮我理解这里出了什么问题,我真的很感激.

小智 20

我遇到了类似的问题.我有一个网站(共享模式)和一个相关的webjob(连续类型).看着webjob日志,我发现约15分钟后作业进入停止状态.不活动并停止对触发消息做出反应.这似乎与连续工作概念的概念相矛盾,但显然,要让它真正持续运行,您必须订阅付费网站.你得到你所付出的...

也就是说,我的网站只需要每隔几天使用一次,并且在共享模式下运行非常有意义.我不介意该网站需要一些额外的时间来开始 - 只要它自动重启.webjob的问题是一旦停止它就不会自动重启.所以,我的目标是通过网站重新启动它.

我注意到,仅仅从Azure管理门户查看webjob即可启动它.按照这种思路,我发现获取webjob属性足以将其切换到运行状态.唯一的技巧是如何以编程方式获取属性,以便重新启动网站也将重新启动webjob.

由于必须对对fetch webjob属性的调用进行身份验证,因此第一步是转到Azure管理门户并下载网站发布配置文件.在发布配置文件中,您可以找到身份验证凭据:用户名(通常为$ <website_name>)和userPWD(密码的哈希值).把它们复制下来.

这是一个将获取webjob属性并将其唤醒(如果尚未运行)的函数:

class Program
{
    static void Main(string[] args)
    {
        string websiteName = "<website_name>";
        string webjobName = "<webjob_name>";
        string userName = "<from_publishing_profile>";
        string userPWD = "<from_publishing_profile>";
        string webjobUrl = string.Format("https://{0}.scm.azurewebsites.net/api/continuouswebjobs/{1}", websiteName, webjobName);
        var result = GetWebjobState(webjobUrl, userName, userPWD);
        Console.WriteLine(result);
        Console.ReadKey(true);
    }

    private static JObject GetWebjobState(string webjobUrl, string userName, string userPWD)
    {
        HttpClient client = new HttpClient();
        string auth = "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(userName + ':' + userPWD));
        client.DefaultRequestHeaders.Add("authorization", auth);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        var data = client.GetStringAsync(webjobUrl).Result;
        var result = JsonConvert.DeserializeObject(data) as JObject;
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用类似的功能获取您网站中的所有webjobs(使用端点https:// <website_name> .scm.azurewebsites.net/api/webjobs).您还可以查看返回的JObject以验证webjob和其他属性的实际状态.


Ami*_*ple 14

如果您希望WebJob不停止,则需要确保您的scm站点存活.

因此,保持活动请求应该转到https://sitename.scm.azurewebsites.net,这些请求需要进行身份验证(使用部署凭据进行基本身份验证).

  • @AmitApple看来你必须去https://mysite.scm.azurewebsites.net/basicauth而不是去https://mysite.scm.azurewebsites.net. (2认同)