如何在没有 "Always On" 的情况下保留我的 Azure WebJob 运行
How can I keep my Azure WebJob running without "Always On"
我有一个与网站相关联的连续网络作业,我运行那个处于共享模式的网站。我不想选择 Always On 选项,因为我的应用程序没有真正的需要。我只想在对我的网站进行调用时处理消息。
我的问题是,即使我每 5 分钟在我的网站上连续调用一个虚拟保持活动方法,将消息发布到由该 webjob 监视的队列,我的工作仍然会在几分钟后停止。
我的 webjob 是一个使用 WebJob SDK 构建的简单控制台应用程序,其代码如下
JobHost host = new JobHost(new JobHostConfiguration(storageConnictionSttring));
host.RunAndBlock();
消息处理函数如下所示:
public static void ProcessKeepAliveMessages([QueueTrigger("keepalive")] KeepAliveTrigger message)
{
Console.WriteLine("Keep Alive message called on :{0}", message.MessageTime);
}
作业的消息日志基本上说
[03/05/2015 18:51:02 > 4660f6: SYS INFO] WebJob is stopping due to website shutting down
我不介意这种情况是否会发生,但是当网站启动下一个保持活动状态的调用时,webjob 并没有启动。在我转到管理仪表板或 SCM 门户之前,所有消息都会排队,如下所示
https://mysite.scm.azurewebsites.net/api/continuouswebjobs
我可以看到这样的状态:
[{"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":{}}]
如果有人能帮助我理解这里出了什么问题,我将不胜感激。
如果您希望 WebJob 不停止,您需要确保您的 scm 站点 有效 。
所以保持活动请求应该发送到 https://sitename.scm.azurewebsites.net 并且这些请求需要进行身份验证(使用您的部署凭据进行基本身份验证)。
我 运行 遇到了类似的问题。我有一个网站(共享模式)和一个关联的网络作业(连续类型)。查看webjob日志,发现job在大约15分钟后进入stopped状态。不活动并停止对触发消息做出反应。这似乎与持续工作概念的概念相矛盾,但显然,要真正持续地 运行ning 你必须订阅付费网站。你得到你所付出的...
也就是说,我的网站需要每隔几天使用一次,运行在共享模式下使用非常有意义。我不介意该站点需要一些额外的时间来启动 - 只要它自动重新启动即可。 webjob 的问题是一旦停止它就不会自行重启。所以,我的目标是用网站重新启动它。
我注意到只要从 Azure 管理门户查看 webjob 就可以启动它。按照这种思路,我发现获取 webjob 属性足以将其切换到 运行ning 状态。唯一的技巧是如何以编程方式获取属性,以便重新启动网站也会重新启动 webjob。
因为必须对获取 webjob 属性的调用进行身份验证,所以第一步是转到 Azure 管理门户并下载网站发布配置文件。在发布配置文件中,您可以找到身份验证凭据:用户名(通常为 $)和 userPWD(密码的哈希值)。把它们抄下来。
这是一个获取 webjob 属性并唤醒它的函数(如果还没有 运行ning):
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;
}
}
您可以使用类似的功能来获取网站中的所有网络作业(使用端点 https://<website_name>.scm.azurewebsites.net/api/webjobs)。您还可以查看返回的 JObject 以验证 webjob 和其他属性的实际状态。
我有一个与网站相关联的连续网络作业,我运行那个处于共享模式的网站。我不想选择 Always On 选项,因为我的应用程序没有真正的需要。我只想在对我的网站进行调用时处理消息。
我的问题是,即使我每 5 分钟在我的网站上连续调用一个虚拟保持活动方法,将消息发布到由该 webjob 监视的队列,我的工作仍然会在几分钟后停止。
我的 webjob 是一个使用 WebJob SDK 构建的简单控制台应用程序,其代码如下
JobHost host = new JobHost(new JobHostConfiguration(storageConnictionSttring));
host.RunAndBlock();
消息处理函数如下所示:
public static void ProcessKeepAliveMessages([QueueTrigger("keepalive")] KeepAliveTrigger message)
{
Console.WriteLine("Keep Alive message called on :{0}", message.MessageTime);
}
作业的消息日志基本上说
[03/05/2015 18:51:02 > 4660f6: SYS INFO] WebJob is stopping due to website shutting down
我不介意这种情况是否会发生,但是当网站启动下一个保持活动状态的调用时,webjob 并没有启动。在我转到管理仪表板或 SCM 门户之前,所有消息都会排队,如下所示
https://mysite.scm.azurewebsites.net/api/continuouswebjobs
我可以看到这样的状态:
[{"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":{}}]
如果有人能帮助我理解这里出了什么问题,我将不胜感激。
如果您希望 WebJob 不停止,您需要确保您的 scm 站点 有效 。
所以保持活动请求应该发送到 https://sitename.scm.azurewebsites.net 并且这些请求需要进行身份验证(使用您的部署凭据进行基本身份验证)。
我 运行 遇到了类似的问题。我有一个网站(共享模式)和一个关联的网络作业(连续类型)。查看webjob日志,发现job在大约15分钟后进入stopped状态。不活动并停止对触发消息做出反应。这似乎与持续工作概念的概念相矛盾,但显然,要真正持续地 运行ning 你必须订阅付费网站。你得到你所付出的...
也就是说,我的网站需要每隔几天使用一次,运行在共享模式下使用非常有意义。我不介意该站点需要一些额外的时间来启动 - 只要它自动重新启动即可。 webjob 的问题是一旦停止它就不会自行重启。所以,我的目标是用网站重新启动它。
我注意到只要从 Azure 管理门户查看 webjob 就可以启动它。按照这种思路,我发现获取 webjob 属性足以将其切换到 运行ning 状态。唯一的技巧是如何以编程方式获取属性,以便重新启动网站也会重新启动 webjob。
因为必须对获取 webjob 属性的调用进行身份验证,所以第一步是转到 Azure 管理门户并下载网站发布配置文件。在发布配置文件中,您可以找到身份验证凭据:用户名(通常为 $ 这是一个获取 webjob 属性并唤醒它的函数(如果还没有 运行ning): 您可以使用类似的功能来获取网站中的所有网络作业(使用端点 https://<website_name>.scm.azurewebsites.net/api/webjobs)。您还可以查看返回的 JObject 以验证 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;
}
}