2016-04-14 3 views
0

Webクライアントは応答を待つ間ブロックされますが、サーバー上で何もブロックされず、サーバーリソースを使用して他のクライアントを処理できます。クライアントをブロックせずに長いブロックタスクを実行するフレームワークを再生

クライアント要求の中には、サーバーが長いブロックタスクを実行する必要があるものがあります。別のスレッドプールで実行できることを理解しています。
しかし、私はまた、クライアントがブロックされることを望んでいません。クライアントにただちに返信したいだけです(例:OKはあなたの厚い長いブロックタスクを持っています)。クライアントは、私が実行中であることを知る必要があるタスク実行の結果を得ることには気をつけません。

この動作をどのように実装できますか?

私はジョブキューを作成し、ジョブキューを処理するために別のスレッドを使用できると思います。プレイコントローラーがジョブをキューに追加するだけで、もう一方のスレッドはジョブをキューから実行します。私はそれをすべきか?アクカの俳優を使うべきですか? (私はそれを学ぶ必要があるでしょうアッカを知らない)

答えて

1

コールバック

これは、すべてのコールバックを開始します。

あなたはきっと、この見てきました:これはJavaScriptでコールバックを定義している

Something.save(function(err) { 
    if (err) { 
    //error handling 
    return; 
    } 
    console.log('success'); 
}); 

を - 非同期に実行されようとしている何かを。彼らの構文、実装、および何もないので、コールバックはあなたの友人ではありません。彼らは

約束この文脈において

恐ろしい コールバック地獄につながることができ乱用:ES6で約束

Something.save() 
    .then(function() { 
    console.log('success'); 
    }) 
    .catch(function() { 
    //error handling 
    }) 

約束は「ES6-もの」ではありませんが、彼らは何年も前から存在しています、ES6がそれらをあなたに連れてきています。約束は素晴らしいです、あなたもそれらをチェーンすることができます:

saveSomething() 
    .then(updateOtherthing) 
    .then(deleteStuff) 
    .then(logResults); 

しかし、十分に精神的には非同期です。あなたが最終的に時間を見つけることができますプレイ2.xで、今日のよう

  • very well supported
  • 素晴らしいサポート
  • 全二重TCP
  • のWebSocket

    のWebSocket私が推薦するものですアッカを学ぶために);

これで、PlayアプリケーションへのWebSocket接続を開くクライアントを作成できます。サーバー側では、handle WebSocket connections either with Akka actors(私はこれをお勧めします)またはストリームのコールバックを使用できます。アクタを使用することは本当に簡単で楽しいです - あなたはActorを定義します - そして誰かがWebSocket接続を開く瞬間、このアクタのインスタンスが生成され、WebSocketチャンネルで受け取ったすべてのメッセージが俳優によって受信されます周囲を意識することなくビジネスロジックに集中し、メッセージを送り返すことができます - Akkaが優れているもの。

関連する問題