gpt4 book ai didi

azure - azure 队列触发器中的单例未按预期工作

转载 作者:行者123 更新时间:2023-12-03 04:13:54 25 4
gpt4 key购买 nike

我对此的理解显然是错误的,任何澄清都会有帮助。

我认为将 [Singleton] 添加到 Web 作业会强制它一个接一个地运行。事实似乎并非如此。

这是我非常基本的测试代码(针对包含大约 149 条消息的队列)

      [Singleton] //just run one at a time
public static void ProcessQueueMessage([QueueTrigger("datatrac-stops-to-update")] string message, TextWriter log)
{
monitorEntities mDb = new monitorEntities();

//go get the record
int recordToGet = Convert.ToInt32(message);
var record = (from r in mDb.To_Process where r.Id == recordToGet select r).FirstOrDefault();

record.status = 5;
mDb.SaveChanges();

Console.WriteLine($"Finished record {message}");
}

当它运行时,我在控制台上看到: enter image description here

当我跨过它时,我遇到了冲突错误。

我不明白什么?

已解决 - 更多信息

这就是我为解决这个问题所做的,就像 Haitham 在他的回答中所说的那样 [Singleton] 指的是 webjob 本身正在运行的实例数 - 而不是每个实例处理的项目数。

这是通过修改我的 Main 来解决的,例如:

 static void Main(string[] args)
{
var config = new JobHostConfiguration();
config.Queues.BatchSize = 2;

当设置为 1 时,一次仅运行 1 个。当像上面一样设置为 2 时,修改以下代码:

 public static void ProcessQueueMessage([QueueTrigger("datatrac-stops-to-update")] string message, TextWriter log)
{
var threadID = Thread.CurrentThread.ManagedThreadId;

Console.WriteLine($"{threadID} : started record {message}");

产生此行为(这是预期的): enter image description here

我在上面找到文档的链接:

https://github.com/Azure/azure-webjobs-sdk/wiki/Queues#config

最佳答案

Singleton并不意味着它会一个接一个地运行它,而是主要是实例化Web作业类的实例。

如果一次只需要运行一个,可以对静态变量使用锁来防止代码执行多次。但无论如何我都不建议这样做,你必须看看为什么会出现冲突错误

关于azure - azure 队列触发器中的单例未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54845550/

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