azure queuetrigger中的单例不能按预期工作

问题描述 投票:1回答:1

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

我认为将[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

azure azure-webjobs azure-queues
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.