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

4
我希望使用WebJobs替换我的现有控制台应用程序。该控制台应用程序使用/参数样式语法接受5个参数之一,我目前在我的VM上使用Windows计划程序运行它。每个计划都使用特定的参数运行应用程序。有些作业每5分钟运行一次,其他作业每6小时运行一次。
当我上传包含控制台应用程序及其依赖项的ZIP文件时,我原本以为可以向应用程序提供命令行参数。但实际情况并非如此。
例如,如果我创建一个批处理文件(名为Send-Emails.bat),然后创建一个名为Send-Emails的新WebJob,则似乎会运行批处理文件。这还好,但这意味着我需要创建5个不同的WebJobs(再次强调,这不是问题),并且上传5次ZIP文件,每次上传一个不同的调用具有参数的控制台的批处理文件。
这最后一步似乎非常低效,并且很快就会成为维护噩梦。如何部署这样的系统也会产生问题。
这似乎是一个基本的场景,我认为Azure团队设计WebJobs就是为了解决这个问题。有人在这方面取得了成功吗?如果可能的话,我宁愿不更改我的代码,并且使用API从我的Web应用程序调用WebJobs似乎也不是理想的选择。
2个回答

3

1
感谢您的回答,马丁。关于一个工作任务,我的预定任务在不同的时间间隔内运行(一些每5分钟运行一次,而其他一些则每6小时只运行一次)。 - Paul
你可以将作业设置为有状态的,以便记住上次运行不同任务的时间。然后,如果您每5分钟运行一次作业,它将每次运行不同的任务集。 - Martin Prikryl

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。
另一种选择是使用一些环境变量而不是命令行参数。根据作业名称,在特定的环境变量中查找参数的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接