我目前正在使用 Play Framework (版本 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: ");
}
}
我试图覆盖 post stop 但它似乎从未被调用过。我也试过 akka.system().isTerminated() 但它没有用。
@Override
public void postStop()
{
Logger.info("MultiCastController - postStop() - stopping thread");
running = false;
}
我一直在寻找的另一个可能的选择有没有办法获得 akka 状态?它正在关闭,所以我可以做类似的事情
而(运行 && akka.system().alive())。我发现如果我收到一条消息,它会崩溃,因为 ebean 服务器已关闭。我什至可以进行黑客攻击并检查它是否以某种方式活着吗?
while(运行&& ebean.server.isalive())
最佳答案
将您的线程创建为守护线程,然后在应用程序退出时它将存在。
或者您可以注册一个回调以在 ActorSystem 关闭时执行:
def registerOnTermination (code: Runnable): Unit
Register a block of code (callback) to run after all actors in this actor system have been stopped.
发件人:http://doc.akka.io/api/akka/2.0.1/#akka.actor.ActorSystem
关于playframework - 如何在关机时停止 akka 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10875101/