7

मैं बैकएंड सेवा में लॉग भेजने के लिए जीसीएम नेटवर्क मैनेजर का उपयोग करने की कोशिश कर रहा हूं। हमारे पास एक घंटा है जो हर घंटे चल रहा है जो वनऑफ टास्क बनाता है, जब निष्पादित किया जाता है, तो लॉग संदेश के साथ बैकएंड सेवा को कॉल करेगा।जीसीएम नेटवर्क मैनेजर नौकरियां खोना

यह काम करता है, लेकिन कार्यों की एक बड़ी मात्रा खो जाती है (आधा से अधिक रास्ता)। सबसे पहले, मैंने सोचा कि इसका हमारे बैकएंड, या नेटवर्क के साथ कुछ करना है, लेकिन फ़ाइल लॉगिंग का एक टन जोड़ने के बाद, यह पता चला है कि इन कार्यों के लिए सेवा में रुनटास्क कभी ट्रिगर नहीं किया जाता है (लेकिन वे निश्चित रूप से निर्धारित हो रहे हैं। ?, फिर

GcmNetworkManager.getInstance(context).schedule(new OneoffTask.Builder() 
    .setService(AvroLogService.class) 
    .setExtras(bundle) 

    // A mandatory tag which identifies the task 
    // We add a unique hash to the tag to make sure that 
    // tasks are logged and not thrown away as dupes. 
    // See: http://stackoverflow.com/q/34528960/304262 
    .setTag(java.util.UUID.randomUUID().toString()) 

    // Persist to disk, even across boots: 
    .setPersisted(true) 

    // Sets a time frame for the execution of this task in seconds. 
    // This specifically means that the task can either be 
    // executed right now, or at latest at a certain point: 
    .setExecutionWindow(0, TWO_WEEKS_IN_SECONDS) 
    .build()); 

इस काम करता है, लेकिन संदेशों का ही हिस्सा के लिए: इन खो रहे हैं मैं एपीआई गलतफहमी हूँ, या OneoffTasks बस विश्वसनीय नहीं है

यह कैसे OneoffTask शेड्यूल किया गया है है। संदेश जो बाद में खो गए हैं, उपरोक्त कोड निश्चित रूप से निष्पादित किया गया है (मैंने इसे सत्यापित करने के लिए फ़ाइल लॉगिंग जोड़ा है), लेकिन कभी भी correspo नहीं है खोने वाले लोगों के लिए टर्नटास्क चालू हो गया।

मैं सत्यापित किया है कि:

  1. प्रकट नेटवर्क प्रबंधक लागू करने की मार्गदर्शिका के अनुसार अद्यतन किया जाता है (https://developers.google.com/cloud-messaging/network-manager)
  2. AvroLogService (मेरी सेवा) फैली हुई है GcmTaskService
  3. यह onRunTask
  4. एप्लिकेशन है ओवरराइड करता है RECEIVE_BOOT_COMPLETED अनुमति।
  5. AvroLogServiceStartCommand पर ओवरराइड नहीं करता है।

मैं खो गया हूं। क्या कोई इस पर अंतर्दृष्टि साझा कर सकता है?

+0

आप अतिरिक्त [अतिरिक्त के लिए यह [गिटहब पोस्ट] (https://github.com/google/gcm/issues/67) देखना चाह सकते हैं 'जीसीएमनेटवर्क प्रबंधक' के उपयोग पर अंतर्दृष्टि और उदाहरण। यदि आपने ऐसा नहीं किया है, तो 'onRunTask()' के अंदर अपने कार्य निष्पादन के लिए तर्क प्रदान करने की आवश्यकता के बारे में पोस्ट में उल्लेख किया गया था और आपको उस राज्य का ट्रैक रखना होगा जिसे आपको उस विशेष कार्य के लिए आवश्यक है आपको क्या चाहिए। – Teyam

+0

मदद करने की कोशिश करने के लिए धन्यवाद, लेकिन उस पोस्ट ने इस मुद्दे के लिए कोई प्रासंगिक अंतर्दृष्टि प्रदान नहीं की है। पोस्ट कार्यों को डेटा पास करने के बारे में पोस्ट वार्ता, और मैं setExtras कार्यक्षमता का उपयोग कर रहा हूं (जो प्रश्न में पोस्ट लिखा गया था, तब मौजूद नहीं था), लेकिन यह इस मुद्दे के लिए वास्तव में प्रासंगिक नहीं है। समस्या यह है कि ऑनरटस्क के अंदर कोड अंतःस्थापित नहीं किया जाता है। अर्थात। इसे कई बार निष्पादित किया जाता है, लेकिन यह कई कतारबद्ध कार्यों को भी खो देता है। ऐसा लगता है कि कार्यों का एक बड़ा प्रतिशत बस खो गया है और कभी भी सफलतापूर्वक कतारबद्ध नहीं होने पर, कभी भी RunTask पर नहीं पहुंचता है। –

उत्तर

0

जैसा कि मुझे लगता है कि आपका निरंतर TWO_WEEKS_IN_SECONDS वास्तव में 2 सप्ताह का मतलब है। इस मामले में आप किसी भी समय समय से 2 सप्ताह तक निष्पादन के लिए योग्य हैं। तो, इस कार्य को हर घंटे निष्पादित नहीं किया जाना चाहिए। एक घंटे की सीमा में निष्पादन खिड़की स्थापित करने के लिए प्रयास करें या और भी कम (.setExecutionWindow(0, HALF_AN_HOUR_IN_SECONDS))

google api docs

+0

क्या होता है यदि कार्य उस समय निष्पादित नहीं हो सकता है? –

+0

मेरे अनुभव से, ज्यादातर मामलों में जब उस समय में शर्तों को पूरा नहीं किया जाता है तो विंडो कार्य स्थगित कर दिया जाएगा, लेकिन मुझे यह साबित करने के लिए कोई आधिकारिक दस्तावेज़ नहीं मिल रहा है। –

0

देखें निष्पादन समय सीमा से ऊपर जवाब बड़ा करने के लिए हो सकता है के रूप में। साथ ही मुझे लगता है कि आप समय-समय पर ईवेंट निष्पादित करना चाहते हैं, इसके बजाय PerionicTask.Builder का उपयोग करने के लिएऑनटास्क.बिल्डर

+0

हां, आवधिक कार्य अच्छा प्रतिस्थापन हो सकता है, लेकिन ध्यान दिया जाए कि इसे डोज़ के दौरान निष्पादित नहीं किया जा सकता है। –

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