2009-08-14 10 views
7

मैं जीडब्ल्यूटी और Google ऐप इंजन का उपयोग कर रहा हूं। मेरे पास रिकॉर्ड की सरणी है और मैं उन्हें हर 30 मिनट में अपडेट करना चाहता हूं। में ServiceImpl मैं fallowing कोड है:जीडब्ल्यूटी, Google ऐप इंजन, टाइमर टास्क या सेवा में थ्रेड Impl फेंक अपवाद

new Timer().schedule(new TimerTask(){ 
    @Override 
    public void run() { 
     try { 
      Thread.sleep(30000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     result = updateFeeds(); 
    } 
}, 30000,Long.MAX_VALUE); 

जब मैं आवेदन चलाने के लिए और जब मैं मिलती है:

com.google.gwt.user.server.rpc.UnexpectedException: 
Service method 'public abstract java.util.List org.joke.planet.client.FeedService.loadFeeds()' threw an unexpected exception: 
java.security.AccessControlException: access denied (java.lang.RuntimePermission modifyThreadGroup) 

पहली पंक्ति या चिपकाया कोड पर।

मेरा प्रश्न यह है कि मैं पृष्ठभूमि कार्यकर्ता कैसे बना सकता हूं जो जीडब्ल्यूटी + एपइंजिन सेवा में काम करता है?

उत्तर

3

आप java.util.Timer का उपयोग नहीं कर सकते क्योंकि यह एक सामान्य धागा बनाता है, जिसे AppEngine पर अनुमति नहीं है। हालांकि, अगर आप के रूप में यहाँ प्रलेखित, AppEngine मॉड्यूल एपीआई पृष्ठभूमि धागा सुविधा का उपयोग कर सकते हैं: https://developers.google.com/appengine/docs/java/modules/#Java_Background_threads

नोट है कि आप केवल मैन्युअल रूप से बढ़ाया उदाहरणों पर पृष्ठभूमि धागे का उपयोग कर सकते हैं। इस उदाहरण में, पृष्ठभूमि थ्रेड हर 30 सेकंड में एक संदेश को प्रिंट करता है, हमेशा के लिए:

Thread thread = ThreadManager.createBackgroundThread(new Runnable() { 
    public void run() { 
    try { 
     while (true) { 
     System.err.println("Doing something!"); 
     Thread.sleep(30_000); 
     } 
    } catch (InterruptedException ex) { 
    } 
    } 
}); 
thread.start(); 
6

आप नहीं कर सकते - एक पृष्ठभूमि कार्यकर्ता धागे का तात्पर्य है, और जीई में धागा निर्माण काम नहीं करता है।

जवाब आपके कार्य करने के लिए एक धागा या पृष्ठभूमि कार्यकर्ता बनाने के लिए नहीं है, लेकिन एक विकल्प के रूप में इस http://code.google.com/appengine/docs/java/config/cron.html

+0

धन्यवाद :) मैं इसे देखूंगा। – JOKe

0

भी देखें task queues उपयोग करने के लिए है।

-1

यह मुद्दा केवल ऐप इंजन में नहीं है, बल्कि सामान्यतः किसी भी सर्वलेट कंटेनर में है। जब कोई सेवा पद्धति में होता है (जो आप हमेशा सर्वलेट कंटेनर में होते हैं), तो आप धागे नहीं बना सकते और सोते हैं।

आज के स्केलेबल सेवा दुनिया में, Thread.Sleep एक बुरी बात ....

+3

यह लगभग पूरी तरह से गलत है। एक सामान्य सर्वलेट कंटेनर में पृष्ठभूमि थ्रेड बनाने के लिए यह पूरी तरह से संभव/वांछनीय है जो आवधिक क्रियाएं करता है। आप यह कहने में सही हैं कि Thread.sleep अनुरोध थ्रेड पर बुरा है, लेकिन पृष्ठभूमि धागे पर नहीं। – Geoff

+0

मुझे @Geoff गूंजना है, थ्रेड और नींद का दावा करना() स्केलेबिलिटी के लिए खराब हैं स्थिति के विपरीत काफी विपरीत है। समेकन की शक्ति को अधिकतम करने के लिए अच्छी तरह से नींद महत्वपूर्ण है। यदि आप एकल-थ्रेडेड वातावरण में चल रहे हैं, तो Thread.sleep() एक बुरा विचार है।कहीं और चलाएं, और सीपीयू समय छोड़ने का यही एकमात्र तरीका है जब आपको इसकी आवश्यकता नहीं होती है और एसिंक्रोनस प्रक्रियाओं पर इंतजार करना पड़ता है। – Ajax

3

आप श्रीमान, ऐप्लिकेशन इंजन के काफ़ी नया ThreadManager वर्ग से फायदा हो सकता है है।

https://developers.google.com/appengine/docs/java/backends/overview#background_threads

उपयोग ThreadManager.currentRequestThreadFactory() एक धागा कारखाने जो पैदा धागे को बाधित करता है जैसे ही वर्तमान अनुरोध समाप्त हो गया है, और ThreadManager.backgroundThreadFactory() धागे है कि आप के रूप में के रूप में लंबे समय तक होगा अंडे देने के लिए प्राप्त करने के लिए कृपया (लेकिन केवल बैकएंड पर काम करता है)

फ्रंटेंड अनुरोधों के लिए, अपने थ्रेड का ट्रैक रखने की सलाह दी जाती है, और अगर आप चाहते हैं कि एपेंगिन के अनुरोध फ़िल्टर से पहले उन्हें समाप्त करना चाहते हैं तो उन्हें थ्रेड। जॉइन() पर कॉल करें।

+0

मॉड्यूल के पक्ष में बैकएंड को बहिष्कृत कर दिया गया है; https://developers.google.com/appengine/docs/java/modules/#Java_Background_threads देखें। –

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