gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:50:42 24 4
gpt4 key购买 nike

我习惯在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com