2012-06-04 78 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