2011-08-15 24 views
5

Tôi đang cố triển khai các công việc với thử lại ngữ nghĩa bằng cách sử dụng Akka. Nếu một công nhân thất bại (ném một ngoại lệ) trong công việc của mình, ngoài việc khởi động lại nó, tôi muốn gửi lại công việc mà nó đang làm việc.Giám sát viên Akka tùy chỉnh cơ bản trong Java

Cách tiếp cận tôi đang cố gắng là một người giám sát tùy chỉnh, nhưng tôi không thể yêu cầu công ty khởi động lại nhân viên thất bại. ví dụ. Chạy mã sau với Akka 1.1.3 và bạn sẽ không bao giờ thấy thông báo khởi động lại:

import akka.actor.ActorRef; 
    import akka.actor.UntypedActor; 
    import akka.actor.UntypedActorFactory; 
    import akka.config.Supervision; 

    import static akka.actor.Actors.actorOf; 
    import static java.lang.System.out; 

    public class Supervisor extends UntypedActor { 
     private ActorRef worker; 

     public static class Worker extends UntypedActor { 
      @Override 
      public void onReceive(Object message) { 
       throw new RuntimeException("croak"); 
      } 

      public void preRestart(Object reason) { 
       out.println("supervisor is restarting me!"); 
      } 

      public void postRestart(Object reason) { 
       out.println("supervisor restarted me."); 
      } 
     } 

     public static void main(String[] args) { 
      ActorRef supervisor = actorOf(new UntypedActorFactory() { 
       public UntypedActor create() { 
        return new Supervisor(); 
       } 
      }); 

      supervisor.start(); 
      supervisor.sendOneWay("job"); 
     } 

     @Override 
     public void preStart() { 
      getContext().setFaultHandler(new Supervision.OneForOneStrategy(
       new Class[]{RuntimeException.class}, 
       3, 
       1000 
     )); 

      // why doesn't the compiler like this line? 
      // worker = actorOf(Worker.class); 

      worker = actorOf(new UntypedActorFactory() { 
       public UntypedActor create() { 
        return new Worker(); 
       } 
      }); 

      getContext().startLink(worker); 
     } 

     @Override 
     public void onReceive(Object message) { 
      worker.sendOneWay(message); 
     } 
    } 

Bất kỳ ý tưởng nào tôi đang làm sai?

Cảm ơn!

+0

Cũng đã thử điều khai báo cơ bản nhất mà tôi có thể thử - không may mắn! https://gist.github.com/1147998 – spieden

Trả lời

6

Đây là những chữ ký chính xác cho các phương pháp khởi động lại trong Worker diễn viên:

@Override 
    public void preRestart(Throwable reason) { 
     out.println("supervisor is restarting me!"); 
    } 

    @Override 
    public void postRestart(Throwable reason) { 
     out.println("supervisor restarted me."); 
    } 

Và tôi không nhận được bất kỳ lỗi biên dịch cho các dòng nhận xét-out.

+0

Ok, điều đó đã xảy ra và cũng giải thích tại sao ví dụ khai báo của tôi không hoạt động. Đối với một số lý do IDE của tôi phàn nàn rằng các chữ ký mới không ghi đè lên một phương thức trong lớp cơ sở, trong khi các chữ cái gốc với Object làm. Một số loại vấn đề tương tác Java/Scala trong IntelliJ tôi đoán vậy. Cảm ơn bạn! – spieden

+0

@dacc nhận thấy rằng cũng như trong IntelliJ 10.5 –