我很难将我的BrokeredMessage标记为完整。
工作方式类似于预期的简单代码:
private void OnMessageArrived(BrokeredMessage message)
{
var myObj= message.GetBody<MyObject>();
//do things with myObj
message.Complete();
}当我试图等待用户使用myObj完成时,我得到了异常:
已处理经纪消息
代码如下:
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下降(或类似的事情),我希望消息仍然保留在服务总线主题上,以便下次用户启动应用程序时,他将再次收到他没有处理的消息。
发布于 2016-03-07 15:46:19
您不应该存储经纪消息本身。当您调用.Complete()方法时,根据文件会发生这样的情况:
完成邮件的接收操作,并指示应将消息标记为已处理和删除。
您应该做的是将MyObject类型的对象存储在字典中,因为代理消息在完成后将被销毁。
private Dictionary<long, MyObject> ReceivedMessages;
ReceivedMessages = new Dictionary<long, MyObject>();在相关代码中:
var myObj= message.GetBody<MyObject>();
ReceivedMessages.Add(myObj.Id, myObj);发布于 2017-09-03 07:54:27
据我所知,这是非常隐含的,并且在文档中没有很好地说明,但是当您订阅SB主题/订阅时,您只能访问您提供给BrokeredMessage的OnMessage回调委托的执行范围内的SubscriptionClient.OnMessage对象。
一旦回调返回,BrokeredMessage就会被释放。
如果要缓存消息并将其标记为完整/放弃/死信,则应缓存BrokeredMessage.LockToken以及您需要的任何其他属性(如消息正文),并使用
SubscriptionClient.CompleteSubscriptionClient.AbandonSubscriptionClient.Deadletter当您想要将LockToken标记为完整时,将它们作为参数接收。
发布于 2018-03-21 07:48:27
我发现,如果您正在执行异步方法,消息将被分派,并且等待发生时,消息已经被释放,这是同一个问题。我只希望能早点找到这篇文章。
https://stackoverflow.com/questions/35847496
复制相似问题