4

Appengine では Java マルチスレッドが許可されないため、既存のマルチスレッド コードをプラットフォームに移行するにはどうすればよいでしょうか。

たとえば、次のコードがあります。

    Thread t = new Thread() {
        public boolean alive = true;
        public void run() {
            while (alive) {
                try {
                    Thread.sleep(5000);    
                    getNewNotifications();
                } catch (InterruptedException e) {
                    //  Do nothing
                } catch (IOException e) {
                } 
            }
        }
    };
    t.start()

関数 getNewNotification() はいくつかの Rest/HTTP 呼び出しを行います。これには、無期限に戻る可能性のある他のプロセスが含まれる場合があります。解決策を読みましたTask Queueが、この単純なコードを App Engine に適したコードに変換するにはどうすればよいでしょうか?

上記のコードは、タスク キューを使用してどのように実装されていますか? たとえば、getNewNotifications()5 秒ごとに呼び出します。

そして、その関数はサーバーからいくつかの結果を取得し、結果を解析してから、結果に基づいて必要なアクティビティ/作業を実行します。

4

4 に答える 4

6

Java appengine でスレッドを作成できます。

ThreadManager.createThreadForCurrentRequest(new Runnable(){...});

https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/ThreadManagerを参照してください

リクエストが完了すると、フロントエンド スレッドは中断されて強制終了されますが、生成されたバックエンド スレッドは好きなだけ実行できます。また、InterruptedException をキャッチしたときは何もしないでください。この例外を飲み込むと、インスタンスがオンラインのままになり、より多くの費用がかかる可能性があります。

コードを Runnable とタスク キューで動作させたい場合は、Runnable と DeferredTask の両方を実装するだけです。どちらのインターフェイスも同じメソッド シグネチャを持っています。遅延タスクをディスパッチするには、単に QueueFactory.getQueue("queueName").add( TaskOptions.Builder.withPayload(YourDeferredTask)); を実行します。

于 2012-04-29T17:59:44.063 に答える
2

バックエンドにも興味があるかもしれません。バックエンドはバックグラウンドスレッド(実験的機能)として実行できるため、以前と同じようにポーリングに使用できます。ただし、可能であれば、タスクを使用する方がおそらく効率的です。通知がアプリの他の部分から送信されている場合は、通知を作成する代わりに、タスクを直接作成できます。

于 2012-04-29T16:16:00.903 に答える
1

コードを定期的に実行する必要があるため、cronをお勧めします。

コードをサーブレットのget(..)メソッド内に配置し、( 経由でweb.xml) Url にマップし、この Url を定期的に呼び出すように cron を設定するだけです。

于 2012-04-29T17:46:44.663 に答える
1

予算に応じて (バックエンドの請求を確認してください)、スケジュールされたタスクを使用してこれを達成することもできます。

cron.xmlファイルでタスクを指定します。

<?xml version="1.0" encoding="UTF-8"?>
<cronentries>
  <cron>
    <url>/getNewNotifications</url>
    <description>Get new notifications every 5 minutes</description>
    <schedule>every 5 minutes</schedule>
  </cron>
</cronentries>

もちろん、サーブレット (または使用しているフレームワーク) を URL にマップする必要があります/getNewNotifications

また、 URL が安全であることも確認する必要があります(通常、ユーザーがその URL を呼び出すことは望ましくありません)。

于 2012-04-29T17:48:48.380 に答える