Azure Scheduler发送至Service Bus主题的消息,如何提取原始输入内容?
解决Azure Scheduler发送Service Bus消息时的额外元数据问题
我之前也碰到过这个问题!当Azure Scheduler往Service Bus主题发送消息时,它确实会自动给你输入的内容套一层元数据封装,导致你接收时拿到的不是纯粹的原始消息。
先搞清楚问题根源
Azure Scheduler发送的消息体其实是一个结构化的JSON对象,里面既包含了你在Message属性里输入的内容,还附带了Scheduler自身的作业信息(比如JobId、JobStartTime这些)。举个例子,你输入的是"用户提交的订单数据",实际收到的消息体可能长这样:
{ "JobId": "a1b2c3d4-xxxx-xxxx-xxxx-1234567890ab", "JobName": "MyOrderPushJob", "JobStartTime": "2024-05-20T14:30:00Z", "Message": "用户提交的订单数据" }
方法一:解析JSON提取原始内容
最直接的方式就是解析这个JSON对象,取出Message字段的值就行。这里以C#为例给你演示:
- 先定义一个匹配Scheduler消息结构的类(用来序列化解析):
public class SchedulerMessageWrapper { public string JobId { get; set; } public string JobName { get; set; } public DateTime JobStartTime { get; set; } public string Message { get; set; } // 这就是你要的原始消息内容 }
- 接收消息时进行解析:
// 读取Service Bus消息体 var messageBody = await receivedMessage.Body.ReadAsStringAsync(); // 反序列化为定义好的类 var wrappedMessage = JsonSerializer.Deserialize<SchedulerMessageWrapper>(messageBody); // 提取原始内容 var originalMessage = wrappedMessage.Message;
如果不想定义实体类,也可以用动态解析的方式快速获取:
var messageBody = await receivedMessage.Body.ReadAsStringAsync(); var jsonDoc = JsonDocument.Parse(messageBody); var originalMessage = jsonDoc.RootElement.GetProperty("Message").GetString();
方法二:用自定义属性绕过封装
如果你不想处理JSON解析,还可以换一种发送方式:
- 在Azure Scheduler的配置页面,不要在Message属性里填内容,而是切换到
Custom Properties区域,添加一个自定义属性(比如键设为OriginalContent,值设为你要发送的消息)。 - 接收消息时,直接从消息的自定义属性中读取:
var originalMessage = receivedMessage.ApplicationProperties["OriginalContent"].ToString();
这种方式下,消息体是空的,你要的内容直接存在自定义属性里,完全不会有额外封装。
内容的提问来源于stack exchange,提问作者Per B
相关产品推荐
相关产品推荐

