2016-03-07 31 views
5

我在編輯BrokeredMessage時遇到了麻煩。BrokeredMessage配置

簡單的代碼,就像預期:

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

    //do things with myObj 

    message.Complete();    
} 

當我試圖等待用戶與MyObj中我去完成例外:

brokeredmessage已經佈置

以下代碼:

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掉電(或類似事件),我希望消息仍然保留在服務總線主題,以便下次用戶啓動應用程序時,他將再次收到他未處理的消息。

回答

2

您不應該存儲中介消息本身。當調用.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); 
+0

你能否推薦一個解決這個問題的案例: 1.收到的消息,它的數據被分解併發送到異步處理。我們希望鎖定該消息,直到其數據由獲取它的用戶處理。 2.如果發生異常或用戶退出程序,解鎖消息,以便其他用戶稍後可以處理它 3.如果/當處理最後一條數據時,請從ServiceBus中刪除消息,因爲它的數據正確處理。 – ErroneousFatality

+0

是的。您不要在消息中調用Complete(),直到完成。 –

+0

對不起,如果我錯了,但這正是OP正在做的。他將消息保存在字典中,以便在異步處理結束後可以調用Complete。 你建議他不要那樣做,只保存他正在處理的數據。那麼他會如何在異步過程之後調用完成消息? – ErroneousFatality

0

看看ServiceBus LockToken。

可以調用完成(lockToken)

+0

仍然相同的異常_brokeredmessage已處置_ – topolm

2

這是很含蓄,並在文件中沒有說明還有據我所知,但是當你訂閱SB主題/訂閱,你只能訪問BrokeredMessage對象在您提供給SubscriptionClient.OnMessageOnMessage回叫委託的執行範圍內。

一旦回調返回,BrokeredMessage被丟棄。

如果你希望緩存的消息,並標記爲完成/放棄了/死信,你應該緩存BrokeredMessage.LockToken,你需要像郵件正文中的任何其他財產一起,並使用

  • SubscriptionClient.Complete
  • SubscriptionClient.Abandon
  • SubscriptionClient.Deadletter

其接收LockToken作爲參數,當你想把它們標記爲完整時。

相關問題