2012-04-16 25 views
5

Rastgele verileri onaylayan ve bu verinin gösterim zamanına göre bazı değişiklikler yapan ve güncelleyen bir Akka aktörüm var. Şu anda ne yaptığımı bir denetleyici içinde bu kodu kullanarak geçerli:Play Framework 2.0, sunucu başlangıcında bir Akka Aktör programlıyor

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

bir denetleyici içinde bu kullanarak sorun birisi aktör başlatmak için bu denetleyici tarafından işlenen bir sayfaya erişmeye vardır ve o bu eğer olmaz, her şey duraklatılmış kalır.

Sunucu başlangıcında bunu yapmanın bir yolu var mı? Aslında aktörün bir istisna oluşturması durumunda nasıl davrandığını bilmiyorum. Gelecekteki programları durdurur mu yoksa devam eder mi? Olmadığı takdirde, herhangi bir çarpışma veya hata durumunda aktörün yeniden programlanmasını sağlamanın bir yolu var mı?

sunucu başlangıçta kodunuzu çalışan için

cevap

13

, Global object bakmak:

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 bu çok yardımcı olur –

1

Çal Çerçeve olabilen bir işin zamanlama ile bir yol sağlar: onStart() yöntemine denetleyicinizdeki kodu taşımak Açıkça çağırmadan Global.java'da yapılır.

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); 
     } 
    } 
} 

Ve Erkek Oyuncu oluşturmak

, onReceive yöntem üzerinde de HelloActor.java , vb, bu yardımcı olur

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); 
     } 
    } 
} 

Umut e-postalar göndermek, verilerin işlenmesini yapabilirsiniz.

İlgili konular