1

我是游戏框架的新手,我已经创建了一个应用程序来轻松管理帖子和评论。现在作为概念证明,我想实现一个 websocket 来在页面中推送实时评论(添加、更新和删除)。

我的想法是在我的控制器的其余操作中发送更新消息,但是,我不知道什么是最好的方法(akka?)

编辑。目前我将使用 Akka,但我不知道如何设置基本的 POC。

我已经改变了我的 Application.java :

package controllers;

import play.*;
import play.mvc.*;

import views.html.*;
import java.util.*;

import akka.MyWebSocketActor;
import play.libs.F.*;
import play.mvc.WebSocket;

public class Application extends Controller {

    public static Result index() {
        return ok(index.render("Your new application is ready."));
    }

    // ///////////////////////////////////////////////////////////////////////////
    //
    // Socket and Actors definition 
    //
    // ///////////////////////////////////////////////////////////////////////////
    public static WebSocket<String> socket() {
        return WebSocket.withActor(MyWebSocketActor::props);
    }
    // ///////////////////////////////////////////////////////////////////////////
    //
    // Socket and Actors definition 
    //
    // ///////////////////////////////////////////////////////////////////////////

}

我写了一个简单的 MyWebSocketActor.java 为:

package akka;

import akka.actor.*;


public class MyWebSocketActor extends UntypedActor {

    public static Props props(ActorRef out) {
        return Props.create(MyWebSocketActor.class, out);
    }

    private final ActorRef out;

    public MyWebSocketActor(ActorRef out) {
        this.out = out;
    }

    public void onReceive(Object message) throws Exception {
        if (message instanceof String) {
            out.tell("I received your message: " + message, self());
        }
    }
}

不幸的是,我遇到了编译错误:

! @6ipf58l8c - Internal server error, for (GET) [/] ->

play.PlayExceptions$CompilationException: Compilation error[error: cannot find symbol]
    at play.PlayReloader$$anon$1$$anonfun$reload$2$$anonfun$apply$14$$anonfun$apply$16.apply(PlayReloader.scala:304) ~[na:na]
    at play.PlayReloader$$anon$1$$anonfun$reload$2$$anonfun$apply$14$$anonfun$apply$16.apply(PlayReloader.scala:304) ~[na:na]
    at scala.Option.map(Option.scala:145) ~[scala-library-2.10.3.jar:na]
    at play.PlayReloader$$anon$1$$anonfun$reload$2$$anonfun$apply$14.apply(PlayReloader.scala:304) ~[na:na]
    at play.PlayReloader$$anon$1$$anonfun$reload$2$$anonfun$apply$14.apply(PlayReloader.scala:298) ~[na:na]
    at scala.Option.map(Option.scala:145) ~[scala-library-2.10.3.jar:na]
    at play.PlayReloader$$anon$1$$anonfun$reload$2.apply(PlayReloader.scala:298) ~[na:na]
    at play.PlayReloader$$anon$1$$anonfun$reload$2.apply(PlayReloader.scala:296) ~[na:na]
    at scala.util.Either$LeftProjection.map(Either.scala:377) ~[scala-library-2.10.3.jar:na]
    at play.PlayReloader$$anon$1.reload(PlayReloader.scala:296) ~[na:na]
    at play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvider.scala:104) ~[play_2.10-2.2.3.jar:2.2.3]
    at play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvider.scala:102) ~[play_2.10-2.2.3.jar:2.2.3]
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) ~[scala-library-2.10.3.jar:na]
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) ~[scala-library-2.10.3.jar:na]
    at scala.concurrent.forkjoin.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1361) ~[scala-library-2.10.3.jar:na]
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) ~[scala-library-2.10.3.jar:na]
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) ~[scala-library-2.10.3.jar:na]
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) ~[scala-library-2.10.3.jar:na]
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) ~[scala-library-2.10.3.jar:na]

这似乎与:

    return WebSocket.withActor(MyWebSocketActor::props);
                    ^

在 Application.java 文件中。我错过了什么?

4

1 回答 1

0

是的,您可以使用 akka actor 来实现 websocket 以进行实时更新。

播放网络套接字

除此之外,typesafe 还提供了一个聊天模板。你可以从中得到这个想法:

聊天模板

于 2014-07-15T12:00:01.140 回答