Playframework 使用Akka和Websockets播放框架

Playframework 使用Akka和Websockets播放框架,playframework,websocket,akka,playframework-2.1,Playframework,Websocket,Akka,Playframework 2.1,我通过Play2.1设置了一个简单的websocket连接,连接到javascript前端 我在服务器上有一个随机数生成循环,它生成一个随机数并通过websocket发送出去。随机数生成是在一个无休止的while循环中执行的。我创建了一个Akka Actor,它只需通过创建的websocket发送它接收到的消息 问题 在while循环中,它生成在每次迭代中通过websocket发送的随机数,它从不通过websocket发送任何内容。当我实际限制循环以使其实际结束时,所有生成的数字都会在while

我通过Play2.1设置了一个简单的websocket连接,连接到javascript前端

我在服务器上有一个随机数生成循环,它生成一个随机数并通过websocket发送出去。随机数生成是在一个无休止的while循环中执行的。我创建了一个Akka Actor,它只需通过创建的websocket发送它接收到的消息

问题

在while循环中,它生成在每次迭代中通过websocket发送的随机数,它从不通过websocket发送任何内容。当我实际限制循环以使其实际结束时,所有生成的数字都会在while循环结束时发送,而不会在每次迭代中实时发送。我不知道如何让它工作,以便它在每次迭代中发送

请参阅下面的代码

具有随机数生成器功能的游戏框架应用程序

  public class Application extends Controller {


// Default MqTT Messages Actor
static ActorRef defaultMqttActor = Akka.system().actorOf(new Props(WebsocketHandle.class));



public static WebSocket<String> realTimeChartConnection() {
    return new WebSocket<String>() {
        // called when the websocket is established
        public void onReady(WebSocket.In<String> in,
                WebSocket.Out<String> out) {
            // register a callback for processing instream events
            in.onMessage(new Callback<String>() {
                public void invoke(String event) {
                    System.out.println(event);
                }
            });

            System.out.println("Websocket Connection ready ...");

            WebsocketHandle.setWebsocketOut(out);
            sendRandomNumbers();

        }
    };
}

public static void sendRandomNumbers() {

    int prev = 50;
    while (true) {
        int y = (int) (prev + Math.random() * 10 - 5);
        if (y < 0)
            y = 0;
        if (y > 100)
            y = 100;

        defaultMqttActor.tell(""+y);
        System.out.println(""+y);
        try {
            Thread.currentThread();
            Thread.sleep(30);
        } catch (Exception e) {
            System.out.println(e.getStackTrace());
        }
    }
}
WebsocketHandle

static ActorRef defaultMqttActor = Akka.system().actorOf(new Props(WebsocketHandle.class));
public class WebsocketHandle extends UntypedActor {

public static WebSocket.Out<String> outStream;

    public static void setWebsocketOut(WebSocket.Out<String> out){
       outStream = out;
    }

    public void onReceive(Object message) throws Exception {

       outStream.write((String)message);

    }
public类WebsocketHandle扩展了UntypedActor{
公共静态WebSocket。向外扩展;
公共静态无效设置WebSocket输出(WebSocket.Out){
流出=流出;
}
public void onReceive(对象消息)引发异常{
输出流。写入((字符串)消息);
}
}

如您所见,参与者只是简单地发送它在“onReceive”中接收到的消息。随机数生成循环只是“告诉”生成的数字。我不明白为什么它不通过websocket异步发送消息


似乎Websocket正在缓冲结果。。。如何让websocket立即发送数据?

我怀疑,由于您从websocket响应的
onReady
方法中启动了一个有限循环,因此它的线程永远不会被释放,消息也不会排队发送,直到循环结束

您正在寻找的可能是一个调度程序。它允许定期或延迟后向参与者发送消息。 改编自Akka官方文件:


我怀疑,由于您从WebSocket响应的
onReady
方法中启动了一个有限循环,因此它的线程永远不会被释放,消息也不会排队,直到循环结束才会发送

您正在寻找的可能是一个调度程序。它允许定期或延迟后向参与者发送消息。 改编自Akka官方文件:


我不知道这是否与您的问题相似,但请注意这些静态方法,尤其是actor中的
setWebsocketOut
。请显示更多的代码。我现在已经添加了完整的代码。虽然它没有告诉你任何新的东西。。。我所拥有的只是我正在使用的核心函数,但现在我展示了整个application.java。这就是所有的代码。我不知道这是否与您的问题相似,但要注意这些静态方法,尤其是actor中的
setWebsocketOut
。请显示更多的代码。我现在已经添加了完整的代码。虽然它没有告诉你任何新的东西。。。我所拥有的只是我正在使用的核心函数,但现在我展示了整个application.java。这就是全部代码。
Akka.system().scheduler().schedule(Duration.create(50, TimeUnit.MILLISECONDS),
  new Runnable() {
    @Override
    public void run() {
      defaultMqttActor.tell("" + Math.random() * 10 + 5, null);
    }
}, system.dispatcher());