天青队列触发中的单例未按预期工作

时间:2019-02-23 19:49:09

标签: azure azure-webjobs azure-queues

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

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

1 个答案:

答案 0 :(得分:0)

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

如果您一次只需要运行一次,则可以对静态变量使用锁,以防止代码多次执行。 但是我还是不建议这样做,而您必须查看为什么有冲突错误