2012-07-09 25 views
22

Tôi đang cố gắng triển khai quy trình nền chạy dài được sinh ra khi người dùng truy cập trang. Tôi muốn hiển thị tiến độ của tác vụ giống như trong ví dụ này: http://web.archive.org/web/20130122091205/http://www.lunatech-research.com/archives/2011/10/31/progressbar-jqueryui-websockets-playframeworkQuy trình chạy dài với thanh tiến trình Ví dụ PlayFramework 2

Có ai biết hướng dẫn về PlayFramework 2.0 (sử dụng AKbu sẵn có) không? Cái này dành cho 1,2

Trả lời

21

Sau khi đọc tất cả Tài liệu Akka cho Java http://doc.akka.io/docs/akka/2.0.1/intro/getting-started-first-java.html tôi đã nghĩ ra điều này có vẻ hoạt động tốt.

Hệ thống hoạt động bằng cách trước tiên tạo một diễn viên duy nhất để xử lý "báo cáo" (khi trang tạo được tải). Diễn viên này sinh ra một diễn viên con báo cáo tiến trình của nó trở lại với phụ huynh. Sau đó, diễn viên chính sẽ được thăm dò ý kiến ​​thông qua JavaScript cho trạng thái của chuỗi con.

Khi trẻ đã hoàn thành, nó sẽ bị chấm dứt và khi Cha mẹ phát hiện đứa trẻ đã kết thúc, nó tự chấm dứt.

Dưới đây là tất cả mã, vui lòng xé toạc tôi nếu tôi đã đi sai đường này! (Is it OK để lưu trữ nhà nước diễn viên?!?)

Mã điều khiển:

public class Application extends Controller { 


public static Result generateReport() 
{ 
    //create akka job 

    //we should really create the actor with UUID name so that someone can't guess 
    //and use the API to view the status of other peoples jobs, it be fairly easy 
    //to guess as it goes $a,$b,$c etc... 
    ActorRef myActor = Akka.system().actorOf(new Props(MyGeneratorMaster.class)); 

    System.out.println(myActor.path()); 
    myActor.tell(new ConfigMessage("blarg message")); 

    return ok(generating.render("blarg","title",myActor.path().name())); 
} 

public static Result status(String uuid) 
{ 
    uuid = "akka://application/user/"+uuid; 
    ActorRef myActor = Akka.system().actorFor(uuid); 

    if(myActor.isTerminated()) 
    { 
       return ok("Report Generated - All Actors Terminated") ; 
    } 
    else 
    { 

     return async(
       Akka.asPromise(ask(myActor,new StatusMessage(), 3000)).map(
         new F.Function<Object,Result>() { 
          public Result apply(Object response) { 

           if(response instanceof ResultMessage) 
           { 
            return ok(((ResultMessage) response).getResult()); 
           } 
           return ok(response.toString()); 
          } 
         } 
       ) 
     ); 

    } 
} 

The Master Diễn viên:

public class MyGeneratorMaster extends UntypedActor { 

    private int completed = 0; 

    @Override 
    public void postStop() { 
     super.postStop(); 
     System.out.println("Master Killed"); 
    } 

    @Override 
    public void onReceive(Object message) throws Exception { 
     if (message instanceof actors.messages.ConfigMessage) { 
      ConfigMessage config = (ConfigMessage) message; 

      System.out.println("Received Config:" + config.getConfig()); 

      //Need to spawn child actor here.. 
      ActorRef child = this.getContext().actorOf(new Props(MyGeneratorChildWorker.class)); 

      //make the child thread do stuff 
      child.tell(new ConfigMessage("doSomething!")); 

      child.tell(akka.actor.PoisonPill.getInstance());//kill the child after the work is complete... 

     } else if (message instanceof StatusUpdate) { 
      System.out.println("Got Status Update"); 
      completed = ((StatusUpdate) message).getProgress(); 
     } else if (message instanceof StatusMessage) { 
      System.out.println("Got Status Message"); 
      getSender().tell(new ResultMessage("Status: " + completed + "%"), getSelf()); 

      if(completed == 100) 
      { 
       //kill this actor, we're done! 
       //could also call stop... 
       this.getSelf().tell(akka.actor.PoisonPill.getInstance()); 
      } 
     } else { 
      System.out.println("unhandled message"+message.toString()); 
      unhandled(message); 
     } 

    } 
} 

Các diễn viên trẻ:

public class MyGeneratorChildWorker extends UntypedActor { 

    @Override 
    public void postStop() { 
     super.postStop();  
     System.out.println("Child Killed"); 
    } 

    @Override 
    public void onReceive(Object message) throws Exception { 

     if (message instanceof ConfigMessage) { 

      System.out.println("Created Child Worker"); 

      System.out.println("Doing Work:"); 
      try { 

       for (int i = 0; i <= 100; i++) { 


        //update parent 
        this.context().parent().tell(new StatusUpdate(i)); 
        long j = 1; 
        //waste loads of cpu cycles 
        while (j < 1E8) { 
         j = j + 1; 
        } 
       } 
      } catch (Exception ex) { 

      } 
      System.out.println("Done Work:"); 


     } else 
      unhandled(message); 
    } 
} 

Trang xem có JavaScript bỏ phiếu dài:

@(message: String)(title: String)(id: String)@main(title) { 

<h2>@message</h2> 

     <script type="text/javascript"> 

      function getPercentage() 
      { 

       $.ajax({ 
        type: "GET", 
        url: "/status/@id", 
        dataType: "html", 
        success: function(html) 
         { 
         $('#status').html(html); 


         } 
       }); 

      } 

      $(document).ready(function() { 


      setInterval("getPercentage()",100); 
      }); 



     </script> 

     <div id="status"> 

     </div> 

} 
+2

Có vẻ tốt, tôi sẽ thử. Chơi thật tuyệt, nhưng những thứ như thế này có rất ít mẫu mã. – Steve

+3

tôi biết, nó rất bực bội! –

+1

"Có OK để lưu trữ trạng thái trong diễn viên?!?" Các diễn viên là một trong số ít nơi có thể lưu trữ tiểu bang. – EECOLOR

Các vấn đề liên quan