Java 具有进度条示例PlayFramework 2的长时间运行流程

Java 具有进度条示例PlayFramework 2的长时间运行流程,java,playframework-2.0,akka,Java,Playframework 2.0,Akka,我正在尝试实现一个长时间运行的后台进程,该进程是在用户访问页面时产生的。我希望显示任务的进度,如本例所示: 有人知道PlayFramework 2.0(使用内置AKKA)的教程吗?这是针对1.2的在阅读了所有Akka Java文档之后,我想到了这个似乎很好用的方法 系统的工作方式是首先创建一个唯一的参与者来处理一个“报告”(在加载generate页面时)。此参与者生成一个子参与者,该子参与者将其进度报告给父参与者。然后,通过JavaScript轮询父参与者以了解子线程的状态 一旦子项完成,它就会

我正在尝试实现一个长时间运行的后台进程,该进程是在用户访问页面时产生的。我希望显示任务的进度,如本例所示:


有人知道PlayFramework 2.0(使用内置AKKA)的教程吗?这是针对1.2的

在阅读了所有Akka Java文档之后,我想到了这个似乎很好用的方法

系统的工作方式是首先创建一个唯一的参与者来处理一个“报告”(在加载generate页面时)。此参与者生成一个子参与者,该子参与者将其进度报告给父参与者。然后,通过JavaScript轮询父参与者以了解子线程的状态

一旦子项完成,它就会终止;一旦父项检测到子项完成,它就会自行终止


下面是所有代码,如果我走错了路,请随意撕碎我!(可以将状态存储在Actors中吗?!)

控制器代码:

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

    }
}
儿童演员:

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);
    }
}
公共类MyGeneratorChildWorker扩展了UntypedActor{
@凌驾
公共空邮站(){
super.postStop();
System.out.println(“儿童死亡”);
}
@凌驾
public void onReceive(对象消息)引发异常{
if(配置消息的消息实例){
System.out.println(“创建的童工”);
System.out.println(“正在工作:”);
试一试{

对于(int i=0;我看起来不错,我会尝试一下。Play很棒,但像这样的东西只有很少的代码示例。我知道,这非常令人沮丧!“可以在Actors中存储状态吗?!?”Actors是少数可以存储状态的地方之一。
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);
    }
}
@(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>

}