我正在将Azure Function应用程序与服务总线触发器一起使用,以读取服务总线并处理服务总线消息的内容。服务总线接收JSON序列化的对象,然后我将JSON消息反序列化回Function App中的对象。但是,由于某种原因,每当有东西发送到服务总线时,触发器就会触发两次,其中一个是JSON消息,另一个是包含“服务总线消息”文本的消息。
我不知道是什么导致第二条消息,所以我想到的只是反序列化服务总线消息,当它因“服务总线消息”而失败时,我将捕获异常并忽略它。但是,我认为这不是处理此问题的正确方法,JSON反序列化中的实际错误将被忽略。处理第二条消息的正确方法是什么?
示例代码:
using Newtonsoft.Json;
public static void Run(string myQueueItem, ILogger log, out SendGridMessage mailMessage)
{
MyClass myObject = null;
try
{
myObject = JsonConvert.DeserializeObject<MyClass>(myQueueItem);
// do stuff
}
catch (JsonException je)
{
// ignore this exception
}
catch (Exception e)
{
// handle the other exceptions and send an alert
}
}
编辑:在原始文章中我没有提到的一件事是我也有一个SendGrid输出。我不知道为什么这会对触发器产生什么影响,所以我将其遗漏了。但是,我现在添加它,以防万一它可能是出于某些奇怪的原因。
编辑2:添加了突出显示该问题的完整工作代码
// Sender
using System;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.ServiceBus;
using Newtonsoft.Json;
namespace myapp
{
class Program
{
static void Main(string[] args) => MainAsync().GetAwaiter().GetResult();
static async Task MainAsync()
{
string serviceBusConnectionString = "<your servicebus connectionstring>";
string queueName = "<your queue name>";
IQueueClient queueClient = new QueueClient(serviceBusConnectionString, queueName);
string messageBody = JsonConvert.SerializeObject(new Test());
var message = new Message(Encoding.UTF8.GetBytes(messageBody));
await queueClient.SendAsync(message);
await queueClient.CloseAsync();
}
class Test
{
public string Text { get; set; } = "test";
}
}
}
// Receiver
#r "Newtonsoft.Json"
using System;
using System.Threading.Tasks;
using Newtonsoft.Json;
public static void Run(string myQueueItem, ILogger log)
{
try
{
Test test = JsonConvert.DeserializeObject<Test>(myQueueItem);
log.LogInformation($"C# ServiceBus queue trigger function processed message: {test.Text}");
}
catch (Exception e)
{
log.LogInformation($"Exception: {e.Message}");
}
}
class Test
{
public string Text { get; set; } = "test";
}
结果:
2019-11-04T08:38:10.544 [Information] Executing 'Functions.test' (Reason='This function was programmatically called via the host APIs.', Id=06e10006-baa6-430f-b5db-9a5eae5c154c)
2019-11-04T08:38:10.659 [Information] Exception: Unexpected character encountered while parsing value: S. Path '', line 0, position 0. // This here is caused by "Service bus message"
2019-11-04T08:38:10.659 [Information] Executed 'Functions.test' (Succeeded, Id=06e10006-baa6-430f-b5db-9a5eae5c154c)
2019-11-04T08:39:02.582 [Information] Executing 'Functions.test' (Reason='New ServiceBus message detected on 'test'.', Id=5d7622a7-cc8d-44c9-8720-626fdbb8cabb)
2019-11-04T08:39:02.583 [Information] Trigger Details: MessageId: 13bba779fd524fa1a0098acd6634aded, DeliveryCount: 1, EnqueuedTime: 11/4/2019 8:39:02 AM, LockedUntil: 11/4/2019 8:39:07 AM
2019-11-04T08:39:02.584 [Information] C# ServiceBus queue trigger function processed message: test // This here is the actual message
2019-11-04T08:39:02.584 [Information] Executed 'Functions.test' (Succeeded, Id=5d7622a7-cc8d-44c9-8720-626fdbb8cabb)
答案 0 :(得分:0)
根据我的测试,触发器不会被触发两次。
namespace ServiceBusTrigger
{
public static class Function1
{
[FunctionName("Function1")]
public static void Run([ServiceBusTrigger("myqueue", Connection = "ServiceBusConnection")]string myQueueItem, ILogger log)
{
log.LogInformation($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
var myMessage = JsonConvert.DeserializeObject<MyMessage>(myQueueItem);
log.LogInformation($"ID: {myMessage.id}\tContent:{myMessage.content}");
}
}
}
手动发送消息,并获得以下输出:
Pause Clear Expand
2019-11-04T08:18:56.837 [Information] Executing 'Function1' (Reason='New ServiceBus message detected on 'myqueue'.', Id=7fb37483-b9a3-4c19-baa3-235b419bb585)
2019-11-04T08:18:56.837 [Information] Trigger Details: MessageId: c00a8e41-d883-4620-992f-6b9b4fdae320, DeliveryCount: 1, EnqueuedTime: 11/4/2019 8:18:56 AM, LockedUntil: 11/4/2019 8:19:26 AM
2019-11-04T08:18:56.838 [Information] C# ServiceBus queue trigger function processed message: {"id":"1","content":"abc"}
2019-11-04T08:18:56.838 [Information] ID: 1 Content:abc
2019-11-04T08:18:56.839 [Information] Executed 'Function1' (Succeeded, Id=7fb37483-b9a3-4c19-baa3-235b419bb585)
那么,您能否检查您的服务总线生产商以查看是否发送了其他消息。
您只能停止功能应用程序,手动发送消息并在门户上检查:
如果一切正常,则应该只有1条活动消息。
更新