我对此的理解显然是错误的,任何澄清都会有所帮助。
我认为将[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}");
}
当我迈步时,我遇到了冲突错误。
我不明白的是什么?
已解决 - 更多信息
以下是我为解决这个问题所做的工作,就像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}");
我在上面找到文档的链接:
https://github.com/Azure/azure-webjobs-sdk/wiki/Queues#config
Singleton并不意味着它会一个接一个地运行它,而主要是关于实例化Web作业类的实例。
如果您只需要一次运行一个,则可以对静态变量使用锁定以防止代码执行多次。但无论如何我不会建议,你必须看看为什么会有冲突错误