Playframework 使用Akka和Websockets播放框架
我通过Play2.1设置了一个简单的websocket连接,连接到javascript前端 我在服务器上有一个随机数生成循环,它生成一个随机数并通过websocket发送出去。随机数生成是在一个无休止的while循环中执行的。我创建了一个Akka Actor,它只需通过创建的websocket发送它接收到的消息 问题 在while循环中,它生成在每次迭代中通过websocket发送的随机数,它从不通过websocket发送任何内容。当我实际限制循环以使其实际结束时,所有生成的数字都会在while循环结束时发送,而不会在每次迭代中实时发送。我不知道如何让它工作,以便它在每次迭代中发送 请参阅下面的代码 具有随机数生成器功能的游戏框架应用程序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
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());