我有一个带有ServiceBusTrigger的Azure函数,该函数在部署到Azure时被调用两次。复制非常容易。只需创建一个新的ServiceBus触发器函数并将一条消息添加到队列中即可。
以下是发送消息的代码:
static async Task Main(string[] args)
{
IQueueClient qc = new QueueClient(_sbConnString, "testing");
string data = "hello";
var msg = new Message(Encoding.UTF8.GetBytes(data));
await qc.SendAsync(msg);
await qc.CloseAsync();
}
功能如下:
[FunctionName("TestTrigger")]
public static void Run([ServiceBusTrigger("testing", Connection = "myConnString")]string myQueueItem, ILogger log)
{
log.LogInformation($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
}
日志流显示以下内容:
2020-03-13T23:51:23.197 [Information] Executing 'Function1' (Reason='New ServiceBus message detected on 'testing'.', Id=1b52f3c0-2497-4473-b5f9-ae406a6dee94)
2020-03-13T23:51:23.198 [Information] Trigger Details: MessageId: 9f2a7af3d4c549bb8202a013c15c0358, DeliveryCount: 1, EnqueuedTime: 3/13/2020 11:51:23 PM, LockedUntil: 3/13/2020 11:51:53 PM
2020-03-13T23:51:23.198 [Information] C# ServiceBus queue trigger function processed message: hello
2020-03-13T23:51:23.198 [Information] Executed 'Function1' (Succeeded, Id=1b52f3c0-2497-4473-b5f9-ae406a6dee94)
2020-03-13T23:51:23.197 [Information] Executing 'Function1' (Reason='New ServiceBus message detected on 'testing'.', Id=1b52f3c0-2497-4473-b5f9-ae406a6dee94)
2020-03-13T23:51:23.198 [Information] Trigger Details: MessageId: 9f2a7af3d4c549bb8202a013c15c0358, DeliveryCount: 1, EnqueuedTime: 3/13/2020 11:51:23 PM, LockedUntil: 3/13/2020 11:51:53 PM
2020-03-13T23:51:23.198 [Information] C# ServiceBus queue trigger function processed message: hello
2020-03-13T23:51:23.198 [Information] Executed 'Function1' (Succeeded, Id=1b52f3c0-2497-4473-b5f9-ae406a6dee94)
我尝试在Mac和Windows(分别为VSCode和VS2019)上创建此文件,并获得相同的结果。当我在VS2019上进行本地调试时,触发器仅被调用一次。
我还使用Service Bus Explorer检查了队列,队列中只有一条消息结束。触发器仅被调用两次。
我想念一些简单的东西吗?查看日志时间戳,它似乎正在并行执行。
答案 0 :(得分:1)
真正的函数实际上将数据导入数据库,由于触发器函数被调用两次,所以我们得到的记录是原来的两倍
您应始终提供详细信息,否则问题将被歪曲且难以回答。在这种情况下,功能中正在进行某些工作可能会导致消息的长时间完成这一事实很重要。这就是可能发生的情况。
您的函数以PeekLock
模式接收消息。该消息在一定时间内租借给消费者。如果您在函数中执行的任何操作花费的时间超过租约时间,则消息将被释放,函数将再次对其进行处理。这将一直持续到锁到期(租约结束)之前完成函数执行或将消息移到死信队列为止。
您应该执行以下操作:
MaxLockDuration
,并确保其长于最大处理时间。