2012-04-29 19 views
4

AppengineはJavaマルチスレッドを許可しないため、既存のマルチスレッドコードをどのようにしてプラットフォームに移行できますか? ()無期限に返すことができるいくつかの他のプロセスを含むことができるいくつかのいくつかのレスト/ HTTP呼び出しを行いAppengineによるマルチスレッド

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:

たとえば私は、次のコードを持っています。私はTask Queueが解決策だと読んだが、この単純なコードをApp Engineフレンドリーなコードに変換するにはどうすればよいですか?

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

この関数は、サーバーから結果を得て結果を解析し、その結果に基づいて行う必要がある作業や作業を実行します。

+0

Eelkeのバックエンドの提案は健全ですが、ポーリングではなくイベント駆動型にする方法があるかどうかを検討してください。実行する作業がある場合にのみ作業を行うと、多くのリソースが節約されます。 –

答えて

1

予算に応じて(バックエンドの請求を確認してください)、Scheduled Tasksでもこれを達成できます。

あなたは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 is secure(通常は、ユーザーがそのURLを呼び出さないようにする必要があります)も確認してください。

+0

私はcronがmaxで1分しか動かないと読んだことがありますか?私はそれを "5秒ごとに"置くと効果がありますか? – xybrek

+0

真。私の悪い。時間や分だけ使用できます。 –

2

backendsに興味があります。バックエンドはバックグラウンドスレッド(実験的機能)として実行できるので、以前のようにポーリングすることができます。しかし、可能であれば、タスクを使用するほうが効率的です。通知がアプリの他の部分から来ている場合は、通知を作成する代わりに直接タスクを作成することができます。

1

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

サーブレットのget(..)メソッド内にコードを入れて、それをUrlにマップし(web.xml経由)、このURLを定期的に呼び出すようにcronを設定します。

+0

しかし、cronジョブは1分間隔でmaxで動作するように制限されています。私は5秒間隔が必要です。 – xybrek

5

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));

関連する問題