我目前正在使用play框架(版本2.0.1)。 我的应用程序需要收听udp广播消息。所以我需要一个新的线程来监视套接字并接收所需的字节。 在查看播放框架后,似乎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状态?它正在关闭所以我可以做类似
的事情while(running&& akka.system()。alive())。我发现,如果我收到一条消息,它会因为ebean服务器已经关闭而崩溃。我甚至可以做一个黑客攻击并检查它是否还活着吗?
while(running&& ebean.server.isalive())
答案 0 :(得分:3)
将您的线程创建为守护程序线程,然后在应用程序退出时它将存在。
或者你可以注册一个在ActorSystem关闭时执行的回调:
def registerOnTermination(代码:Runnable):单位
注册一个代码块(回调),以便在此actor系统中的所有actor之后运行 停止。
来自:http://doc.akka.io/api/akka/2.0.1/#akka.actor.ActorSystem
答案 1 :(得分:0)
您可以覆盖Global.onStop以向您的演员发送停止消息。如果运行得太晚,您可以在列表的早期注册一个插件,以便在Play开始关闭后立即发送该停止消息:
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