将控制台应用程序转换为Azure webjobs

时间:2014-09-12 06:15:23

标签: .net azure console-application azure-webjobs

我对使用WebJobs替换现有的控制台应用程序感兴趣。控制台应用程序使用/参数样式语法接受5个参数中的1个,我目前在VM上使用Windows Scheduler运行该语法。每个计划都使用特定参数运行应用程序。有些工作每5分钟运行一次,其他工作每6小时运行一次。

当我上传包含我的控制台应用程序及其依赖项的ZIP时,我希望能够为应用程序提供命令行参数。这似乎并非如此。

如果我创建一个批处理文件(例如,名为Send-Emails.bat),然后创建一个名为Send-Emails的新WebJob,则它似乎运行批处理文件。这没关系,但这意味着我需要创建5个不同的WebJobs(同样不是问题)并上传ZIP 5次,每个都有一个不同的批处理文件,用调用参数调用控制台。

这最后一步似乎非常低效,很快就会成为维护的噩梦。如何部署这样的系统也会产生问题。

这似乎是一个基本场景,我认为Azure团队设计了WebJobs。有人有这个成功吗?如果可能的话,我不想改变我的代码,并且使用API​​从我的Web应用程序调用WebJobs似乎也不太理想。

2 个答案:

答案 0 :(得分:3)

很少有建议:

答案 1 :(得分:1)

虽然不是一个完美的解决方案,因为它仍然涉及调度程序,但下面的解决方案有一些优点。让我先描述它是如何工作的:

您有一个使用WebJobs SDK的WebJob。在这项工作中,您有5种不同的功能,每种功能对应您想要的每项工作。这些功能中的每一个都侦听不同的存储队列。然后,您有5个调度程序(每个函数一个),它将消息放入与需要调用的函数相对应的队列中。

此解决方案的优点是您可以在不触及作业代码的情况下更改功能的时间表,并将所有作业/功能放在一个位置。

以下是webjob的一些示例代码:

public static void Main()
{
    using (JobHost host = new JobHost())
    {
        host.RunAndBlock();
    }
}

public static void SendEmailFunction(
    [QueueTrigger("send-email-function-trigger")] string message,
    TextWriter log,
{
    log.WriteLine("sending an email");
    // Send email
}

public static void DoSomethingElse(
    [QueueTrigger("do-something-else-trigger")] string message
    TextWriter log)
{
    log.WriteLine("Doing something else");
}

// ... more functions ...

然后,如果您有一个SendEmail调度程序将消息放入" send-email-function-trigger",则会触发SendEmailFunction。


另一种选择是使用一些环境变量而不是命令行参数。根据作业名称,您可以在特定环境变量中查找参数的值。

相关问题