c# - 像 WebJob 这样的队列上的 Azure WorkerRole 触发器

标签 c# azure azure-worker-roles azure-webjobs azure-queues

我习惯在 Azure 上使用 webjob 触发 Azure 队列。它就像一个魅力。

Azure tutorial webjob + queue

static void Main(string[] args)
{
    JobHost host = new JobHost();
    host.RunAndBlock();
}

public static void ProcessQueueMessage([QueueTrigger("logqueue")] string logMessage, TextWriter logger)
{
    logger.WriteLine(logMessage);
}

queueTrigger 的真正好处是,在消息触发的过程未完成之前,消息将保持不可见(而不是删除)。因此,如果您关闭 webjob(例如,对于 webjob 更新),该消息将在队列中可见(稍稍超时后),由更新的 webjob 处理(完美)。

现在我想做同样的事情,但以 worker 的角色。今天我确实喜欢这个。

while (true)
{
     var cloudMessage = await sourceImportationQueue.GetMessageAsync();
     if (cloudMessage != null)
           sourceImportationQueue.DeleteMessage(cloudMessage);
      // process my job (few hours)
     else
           await Task.Delay(1000 * 5);
}

但是如果我在工作期间停止工作人员,我就会丢失消息。那么我怎样才能像webJob触发那样呢?

最佳答案

最后我找到了一个简单的解决方案。在运行几个小时的作业之前,我启动了一个任务 KeepHiddenMessageAsync 来更新消息的超时时间。在超时结束之前,完成消息的新更新。如果出现问题,则消息将达到超时并且消息将变得可见。

        private bool jobIsComplete;

        private void Run()
        {
             while (true)
            {
                 jobIsComplete = false;
                 //get the message
                 var cloudMessage = await queue.GetMessageAsync();

                 if (cloudMessage != null)
                        //run the task to keep the message until end of the job and worker role stopping for an update for example 
                       var keepHiddenMessageTask = KeepHiddenMessageAsync(cloudMessage);

                        //
                        // process my job (few hours)
                        //

                      jobIsComplete = true;
                      await keepHiddenMessageTask;
                      await _queue.DeleteMessageAsync(cloudMessage);
                 else
                       await Task.Delay(1000 * 5);
            }
        }

        private async Task KeepHiddenMessageAsync(CloudQueueMessage iCloudQueueMessage)
        {
            while (true)
            {
                //Update message and hidding during 5 new minutes
                await _queue.UpdateMessageAsync(iCloudQueueMessage, TimeSpan.FromMinutes(5), MessageUpdateFields.Visibility);

                //Wait 4 minutes
                for (int i = 0; i < 60 * 4; i++)
                {
                    if (JobIsComplete)
                        return;
                    else
                        await Task.Delay(1000);
                }
            }
        }

关于c# - 像 WebJob 这样的队列上的 Azure WorkerRole 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31070147/

相关文章:

c# - 通过 C# Web Service 获取更新的 APK 版本并安装

c# - 如何触发ServiceBusTrigger?

azure - 如何使用 --label-filter 和 external-dns 来过滤 kubernetes 中的入口

concurrency - 如何在 Windows Azure 上使用我的辅助角色中的所有核心?

c# - OutOfMemory Exception C# 使用线程时

c# - MySql.Data.MySqlClient.MySqlException :“Access denied for user ' hobo' @'49.70.207.34'(使用密码 : YES)”

c# - javascript window.event 为空?

c# - 机器人在何处/何时为每个用户进行新对话

Windows 更新 2 月 10 日后,Azure 角色未启动

azure - WorkerRole.cs 的目的是什么