使用Akka和Websockets播放框架

时间:2013-04-17 05:12:16

标签: playframework websocket akka playframework-2.1

我有一个简单的websocket连接设置,通过Play 2.1连接到javascript前端。

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

问题

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

见下面的代码。

具有随机数生成器功能的Play Framework中的应用程序

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

WebsocketHandle

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

    }

}

正如您所看到的,演员只是发送它在'onReceive'中收到的消息。随机数生成循环只是“告诉”生成的数字。我不明白为什么它不通过websocket异步发送消息。

似乎Websocket正在缓冲结果......我怎样才能让websocket立即发送数据?

1 个答案:

答案 0 :(得分:1)

我怀疑,因为你从WebSocket响应的onReady方法中启动了一个无限循环,所以它的线程永远不会被释放,并且消息排队并且在循环结束之前永远不会被发送。

您正在寻找的可能是一个调度程序。它允许以固定的时间间隔或延迟后向演员发送消息。 改编自官方Akka文档:http://doc.akka.io/docs/akka/snapshot/java/scheduler.html

Akka.system().scheduler().schedule(Duration.create(50, TimeUnit.MILLISECONDS),
  new Runnable() {
    @Override
    public void run() {
      defaultMqttActor.tell("" + Math.random() * 10 + 5, null);
    }
}, system.dispatcher());