Playframework 如何在关机时停止akka线程

Playframework 如何在关机时停止akka线程,playframework,playframework-2.0,akka,Playframework,Playframework 2.0,Akka,我目前正在使用play框架(版本2.0.1)。 我的应用程序需要侦听udp广播消息。因此,我需要一个新线程来监视套接字并接收所需的字节。 在研究play框架之后,Akka系统似乎被用来处理线程/作业。 所以我实现了一个新的后台akka任务来读取我的套接字。见下文。一切都按照我的预期进行,我能够在后台任务中接收到我想要的数据。 我遇到的问题是当我关闭服务器时。在开发过程中,按Control D键。它会显示消息“[info]play-Shutdown application default Akka

我目前正在使用play框架(版本2.0.1)。 我的应用程序需要侦听udp广播消息。因此,我需要一个新线程来监视套接字并接收所需的字节。 在研究play框架之后,Akka系统似乎被用来处理线程/作业。 所以我实现了一个新的后台akka任务来读取我的套接字。见下文。一切都按照我的预期进行,我能够在后台任务中接收到我想要的数据。 我遇到的问题是当我关闭服务器时。在开发过程中,按Control D键。它会显示消息“[info]play-Shutdown application default Akka system.”但随后会挂起并且永远不会关闭我的后台线程

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: ");
    }
}
我曾试图超越后停止,但它似乎从来没有被调用。我也试过akka.system().isTerminated(),但不起作用

@Override
public void postStop()
{
    Logger.info("MultiCastController - postStop() - stopping thread");
    running = false;
}
我一直在寻找的另一个可能的选择是,有没有办法获得阿克卡州?它正在关闭,所以我可以做类似的事情

while(正在运行&&akka.system().alive()。我发现,如果我收到消息,它会崩溃,因为ebean服务器已经关闭。我甚至可以做一个黑客,看看它是否还活着


在(运行&&ebean.server.isalive()时)

将您的线程创建为守护进程线程,然后在应用程序退出时它将存在

或者,您可以注册一个回调,以便在ActorSystem关闭时执行:

def注册表终止(代码:Runnable):单位

注册一个代码块(回调)以在该actor系统中的所有actor都已完成后运行 停下来


From:

您可以覆盖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