c# - BrokeredMessage 已处置

标签 c# servicebus brokeredmessage

我无法将我的 BrokeredMessage 标记为 Complete。

按预期工作的简单代码:

 private void OnMessageArrived(BrokeredMessage message)
 {
     var myObj= message.GetBody<MyObject>();

     //do things with myObj

     message.Complete();            
 }

当我尝试等待用户完成 myObj 时,出现异常:

brokeredmessage has been disposed

代码如下:

 private Dictionary<long, BrokeredMessage> ReceivedMessages;      
 ReceivedMessages = new Dictionary<long, BrokeredMessage>();

 private void OnMessageArrived(BrokeredMessage message)
 {
     var myObj= message.GetBody<MyObject>();
     ReceivedMessages.Add(myObj.Id, message);

     //do things with myObj      
 }

 private void Button_Click(object sender, RoutedEventArgs e)
 {
     // get myObj on which user clicked

     ReceivedMessages[myObj.Id].Complete();
     ReceivedMessages.Remove(myObj.Id);        
 }

在我看来,ServiceBus 以某种方式失去了与 c# 中实际对象的连接

类似于 EF 中的分离对象,只是在这种情况下对象与 ServiceBus 分离

编辑:

只有在用户单击按钮后才将消息标记为完整对我来说很重要。 万一 AC 出现故障(或类似情况),我希望消息仍保留在Service Bus Topic 上,这样下次用户启动应用时,他将再次收到他未处理的消息。

最佳答案

您不应存储中介消息本身。当您调用 .Complete() 方法时,会发生以下情况 according to the documentation :

完成消息的接收操作并指示消息应标记为已处理和删除

您应该做的是将 MyObject 类型的对象存储在您的字典中,因为代理消息将在完成后被销毁。

private Dictionary<long, MyObject> ReceivedMessages;      
ReceivedMessages = new Dictionary<long, MyObject>();

在相关的代码中:

 var myObj= message.GetBody<MyObject>();
 ReceivedMessages.Add(myObj.Id, myObj);

关于c# - BrokeredMessage 已处置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35847496/

相关文章:

读取通过 Rest API 发送的数据时,Azure 服务总线 BrokeredMessage GetBody 方法抛出 SerializationException

c# - Java和c#中 protected 成员的区别

C# max() 不返回自然最高值

c# - 如何找到哪台计算机发送打印作业?

azure - 有没有办法以编程方式创建 Azure ServiceBus 主题

java - 从服务总线队列读取死信消息

C# 套接字接收方法不接收数据

通过 AZURE JAVA SDK 访问 Azure 服务总线 SAS

azure - 检测并删除 Azure 服务总线上的孤立队列、主题或订阅