gpt4 book ai didi

java - 带有进度条示例 PlayFramework 2 的长时间运行过程

转载 作者:IT老高 更新时间:2023-10-28 20:41:36 27 4
gpt4 key购买 nike

我正在尝试实现一个长时间运行的后台进程,该进程在用户访问页面时生成。我想显示任务的进度,就像在这个例子中一样:http://web.archive.org/web/20130122091205/http://www.lunatech-research.com/archives/2011/10/31/progressbar-jqueryui-websockets-playframework

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

最佳答案

在阅读了所有 Akka Java 文档后 http://doc.akka.io/docs/akka/2.0.1/intro/getting-started-first-java.html我想出了这个似乎效果很好。

系统首先创建一个唯一的 Actor 来处理“报告”(当加载生成页面时)。这个actor生成一个子actor,它会向父actor报告它的进度。然后通过 JavaScript 轮询父 Actor 以获取子线程的状态。

一旦 child 完成,它就会终止,一旦 parent 检测到 child 完成,它就会自行终止。

以下是所有代码,如果我以错误的方式进行此操作,请随时将我拆散! (可以在 Actors 中存储状态吗?!?)

Controller 代码:

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

}
}

child Actor :

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

使用长轮询 JavaScript 的 View 页面:

@(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>

}

关于java - 带有进度条示例 PlayFramework 2 的长时间运行过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11398495/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com