2012-06-04 79 views
4

我目前正在使用播放框架(2.0.1版)。 我的应用程序需要收听udp广播消息。所以我需要一个新线程来监视套接字并接收所需的字节。 看过Play框架后,似乎Akka系统被用来处理线程/作业。 所以我实现了一个新的背景akka任务,它读取我的套接字。见下文。一切工作如何我的预期,我能够在后台任务中接收我想要的数据。 我的问题是当我关闭服务器。在开发中按控制D.它说消息“[信息]播放 - 关机应用程序默认Akka系统。”但后来挂起,从不关闭我的后台线程。如何停止关闭AKK线程

public running = false; 
public void onReceive(Object message) { 
    if (message instanceof SystemConfiguration) { 
     try { 
      InetAddress group = InetAddress.getByName("222.1.1.1"); 
      MulticastSocket socket = new MulticastSocket(54321); 
      socket.joinGroup(group); 
      running = true; 

      while (running) { 
       Logger.info("MultiCastController - waiting to receive message"); 
       byte[] buf = new byte[1000]; 
       DatagramPacket recv = new DatagramPacket(buf, buf.length); 
       socket.setSoTimeout(30000); 
       try { 
        socket.receive(recv); 
        String msgString = new String(recv.getData()).trim(); 
        Logger.info("retreived: " + msgString); 
       } catch (SocketTimeoutException e) { 
        Logger.info("MultiCastController - timed out" 
          + recv.getData().toString()); 
       } 
      } 
     } catch (Exception ex) { 
      Logger.info("Errror message caught: " + ex.toString()); 
     } 
    } else { 
     Logger.info("Error starting multicast receiver incorrect value passed: "); 
    } 
} 

我试过重写post stop,但它似乎永远不会被调用。我也试过akka.system()。isTerminated()但它没有工作。

@Override 
public void postStop() 
{ 
    Logger.info("MultiCastController - postStop() - stopping thread"); 
    running = false; 
} 

我一直在寻找的其他可能的选择是否有任何方法来获得阿卡状态?它正在关闭,所以我可以做类似

while(运行& & akka.system()。alive())。我发现如果我收到一条消息,它会崩溃,因为ebean服务器已关闭。我甚至可以做一次黑客攻击并检查它是否还活着?

而(运行& & ebean.server.isalive())

回答

3

创建线程作为守护线程,那么就会存在时,应用程序退出。

或者当ActorSystem关闭,你可以注册一个回调来执行:

高清registerOnTermination(代码:Runnable接口):单位

注册代码(回调)的块毕竟运行此演员系统中的演员已停止 。

来源:http://doc.akka.io/api/akka/2.0.1/#akka.actor.ActorSystem

0

您可以覆盖Global.onStop发送停止消息到你的演员。如果运行为时已晚,你可以在插件列表中很早就为游戏开始关机注册尽快发送停止消息:

import play.api.Plugin 
import play.api.Application 

class ShutdownObserver(app: Application) extends Plugin { 

    override def onStop() { 
    ... send message to your actor telling it to stop... 
    } 
} 

然后创建您的conf/play.plugins文件,:

1:ShutdownObserver