我有一个简单的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立即发送数据?
答案 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());