現在、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;
}
私が探していた他の可能なオプションは、akka状態を取得する方法はありますか? シャットダウンしているので、次のようなことができます
while (実行中 && akka.system().alive())。ebean サーバーがシャットダウンされているため、メッセージを受信するとクラッシュすることがわかりました。ハッキングして、それが何とか生きているかどうかを確認することもできますか?
while(実行中 && ebean.server.isalive())