2016-03-07 8 views
5

का निपटारा किया गया है मुझे पूरा होने पर ब्रोकर्ड मैसेज को चिह्नित करने में समस्या है।ब्रोकर्ड मैसेज

सरल कोड है कि तरह काम करता है उम्मीद:

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# वास्तविक वस्तु के लिए कनेक्शन खो

कुछ एफई में अलग वस्तु के समान है, सिर्फ इस मामले में वस्तु ServiceBus से अलग है की तरह लग रहा

संपादित करें:

संदेश क्लिक बटन के बाद ही संदेश को चिह्नित करना मेरे लिए महत्वपूर्ण है। यदि एसी नीचे चला जाता है (या इसी तरह की चीजें) मैं चाहता हूं कि संदेश अभी भी सेवा बस विषय पर बने रहें ताकि अगली बार उपयोगकर्ता ऐप शुरू कर सकें, फिर भी वह उन संदेशों को प्राप्त करेगा जिन्हें उन्होंने संसाधित नहीं किया था।

उत्तर

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. जब डेटा का अंतिम भाग संसाधित हो जाता है, तो सेवाबस से संदेश हटा दें डेटा ठीक से संसाधित किया गया था। – ErroneousFatality

+0

हां। जब तक आप पूरा नहीं कर लेते हैं तब तक आप संदेश पर पूर्ण() को कॉल करना बंद कर देते हैं। –

+0

अगर मैं गलत हूं तो क्षमा करें, लेकिन यह वही है जो ओपी कर रहा है। वह एक शब्दकोश में संदेश बचाता है ताकि एसिंक प्रसंस्करण खत्म हो जाने के बाद वह पूर्ण कॉल कर सके। आपने अनुशंसा की कि वह इसके बजाय ऐसा न करें और केवल उस डेटा को सहेज लें जो वह संसाधित कर रहा है। एसिंक प्रक्रिया के बाद संदेश पर पूरा कैसे होगा? – ErroneousFatality

0

ServiceBus LockToken पर एक नजर डालें।

आप कॉल कर सकते हैं पूर्ण (lockToken)

+0

अभी भी वही अपवाद _brokeredmessage का निपटारा किया गया है _ – topolm

2

यह बहुत निहित है और नहीं के रूप में तक मुझे पता है दस्तावेज में अच्छी तरह से कहा गया है, लेकिन जब आप एक एस.बी. विषय/सदस्यता के लिए सदस्यता, आप केवल BrokeredMessage वस्तु का उपयोग कर सकते OnMessage कॉलबैक प्रतिनिधि के निष्पादन दायरे में आप SubscriptionClient.OnMessage पर आपूर्ति करते हैं।

कॉलबैक लौटने के बाद, BrokeredMessage का निपटारा किया जाता है।

आप संदेश को कैश और यह के रूप में चिह्नित पूरा/छोड़ दिया/deadletter करना चाहते हैं, तो आप BrokeredMessage.LockToken कैश चाहिए, किसी अन्य संपत्ति आप संदेश के मुख्य भाग की तरह की जरूरत के साथ-साथ, और प्रयोग

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

जो एकप्राप्त पैरामीटर के रूप में, जब आप उन्हें पूर्ण रूप से चिह्नित करना चाहते हैं।

संबंधित मुद्दे