如何停止在关机的阿卡线程(How to stop an akka thread on shutdow

2019-07-29 17:27发布

我目前使用的播放框架(2.0.1版)。 我的应用程序需要听UDP广播消息。 所以,我需要一个新的线程来监视插座并接收所需的字节数。 展望发挥框架后,它似乎阿卡系统是用来处理线程/职位。 所以,我实现了一个新的背景阿卡的任务,读取我的插座。 见下文。 一切工作我没有料到,我能够接受我想在后台任务中的数据。 我的问题是,当我关闭服务器。 在开发按下Control D.它说消息“[信息]玩 - 关闭应用程序的默认阿卡系统” 但随后挂永不关闭我的后台线程。

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;
}

另一个可能的选项我一直在寻找有没有什么办法让阿卡状态? 它被关闭,所以我可以做这样的事情

而(运行&& akka.system()。活着())。 我发现,如果我不接受它崩溃,因为ebean服务器已关闭的消息。 我甚至可以做黑客,检查是否还活着,不知何故?

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

Answer 1:

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

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

DEF registerOnTermination(代码:可运行):单位

注册代码(回调)的块在这个演员系统中所有演员都被停止后运行。

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



Answer 2:

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


文章来源: How to stop an akka thread on shutdown