4

現在、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())

4

2 に答える 2

3

スレッドをデーモン スレッドとして作成すると、アプリケーションの終了時に存在します。

または、ActorSystem がシャットダウンしたときに実行されるコールバックを登録できます。

def registerOnTermination (コード: Runnable): Unit

このアクター システム内のすべてのアクターが停止した後に実行するコード ブロック (コールバック) を登録します。

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

于 2012-06-04T11:51:59.587 に答える
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
于 2013-02-01T14:16:09.513 に答える