2012-04-16 8 views
5

मेरे पास एक अक्का अभिनेता है जो यादृच्छिक डेटा को मान्य करता है और उस डेटा के शो समय के आधार पर इसमें कुछ बदलाव करता है और इसे अपडेट करता है। वर्तमान में क्या मैं कर रहा हूँ एक नियंत्रक के अंदर इस कोड का उपयोग है:प्ले फ्रेमवर्क 2.0 प्रोग्राम लॉन्च पर एक अक्का अभिनेता को निर्धारित करता है

static ActorRef instance = Akka.system().actorOf(new Props(ValidateAndChangeIt.class)); 
static { 
    Akka.system().scheduler().schedule(
     Duration.Zero(), 
     Duration.create(5, TimeUnit.MINUTES), 
     instance, "VALIDATE" 
    ); 
} 

एक नियंत्रक के अंदर इस का उपयोग कर के साथ समस्या यह किसी एक पेज है कि नियंत्रक अभिनेता शुरू करने के लिए द्वारा कार्रवाई का उपयोग करने की है, और है यह अगर ऐसा नहीं होता है, सबकुछ रुक जाता है।

क्या सर्वर शुरू करने पर ऐसा करने का कोई तरीका है? मैं वास्तव में नहीं जानता कि यह कैसे व्यवहार करता है अगर अभिनेता अपवाद उत्पन्न करता है। क्या यह भविष्य के कार्यक्रमों को रोकता है या यह जारी रहता है? यदि ऐसा नहीं होता है, तो क्या किसी भी दुर्घटना या त्रुटि के मामले में अभिनेता को फिर से शेड्यूल करने का कोई तरीका है?

उत्तर

13

सर्वर स्टार्टअप पर अपने कोड चलाने के लिए, Global object पर एक नज़र डालें:

public class Global extends GlobalSettings { 

    @Override 
    public void onStart(Application app) { 
    ActorRef instance = Akka.system().actorOf(new Props(ValidateAndChangeIt.class)); 
    Akka.system().scheduler().schedule(
     Duration.Zero(), 
     Duration.create(5, TimeUnit.MINUTES), 
     instance, "VALIDATE" 
    ); 
    } 

} 
+0

ty इससे बहुत मदद मिलती है –

1

प्ले फ्रेमवर्क एक नौकरी की जो समय-निर्धारण से हो सकता है एक तरह से प्रदान करता है: अपने नियंत्रक से onStart() विधि करने के लिए कोड के लिए कदम Global.java में किए गए बिना स्पष्ट रूप से इसका आविष्कार किया।

public class Global extends GlobalSettings { 

    private Cancellable scheduler; 

    @Override 
    public void onStart(Application app) { 
     super.onStart(app); 
     schedule(); 
    } 

    @Override 
    public void onStop(Application app) { 
    //Stop the scheduler 
     if (scheduler != null) { 
      scheduler.cancel(); 
      this.scheduler = null; 
     } 
    } 
    private void schedule() { 
     try { 
      ActorRef helloActor = Akka.system().actorOf(new Props(HelloActor.class)); 
      scheduler = Akka.system().scheduler().schedule(
        Duration.create(0, TimeUnit.MILLISECONDS), //Initial delay 0 milliseconds 
        Duration.create(30, TimeUnit.MINUTES),  //Frequency 30 minutes 
        helloActor, 
        "tick", 
        Akka.system().dispatcher(), null); 
     }catch (IllegalStateException e){ 
      Logger.error("Error caused by reloading application", e); 
     }catch (Exception e) { 
      Logger.error("", e); 
     } 
    } 
} 

और अभिनेता बनाने के लिए, HelloActor.java onReceive पद्धति पर, आप ईमेल भेजने आदि

public class HelloActor extends UntypedActor { 

    @Override 
    public void onReceive(Object message) throws Exception { 
     // Do the processing here. Or better call another class that does the processing. 
     // This method will be called when ever the job runs. 
     if (message.equals("tick")) { 
      //Do something 
      // controllers.Application.sendEmails(); 
     } else { 
      unhandled(message); 
     } 
    } 
} 

आशा इस मदद करता है, डेटा की प्रक्रिया कर सकते हैं।

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

  • कोई संबंधित समस्या नहीं^_^