我对此的理解显然是错误的,任何澄清都将是有帮助的。
我认为将[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
答案 0 :(得分:0)
Singleton并不意味着它将一个接一个地运行它,而主要是关于为Web作业类实例化实例。
如果您一次只需要运行一次,则可以对静态变量使用锁,以防止代码多次执行。 但是我还是不建议这样做,而您必须查看为什么有冲突错误