5

これは私が遭遇する問題であり、設計と実装に関連しています:

POST 要求を受け入れる REST Web サービスがあります。それについて特別なことは何もありません。現在、同期的に応答しています。

ただし、この Web サービスはバックグラウンド プロセスを開始するため、時間がかかる場合があります。

このサービスに 30 分後に応答してほしくありません。

代わりに、すぐに ack 応答をクライアントに返す必要があります (30 分後でも、送信する情報はありません)。

Jersey でそのような動作を実装するにはどうすればよいですか?

ページhttps://jersey.java.net/nonav/documentation/2.0/async.html#d0e6914を読みました。

興味深い読み物でしたが、ACK タイプの応答 (HTTP 200 コードのようなもの) のみを送信する方法が見つかりませんでした。

多分私は非同期と私が実装したい動作と混同しています。

@POST メソッド内で新しいスレッドを作成してバックグラウンド プロセスを処理し、すぐに ACK 応答を返すことができることを理解しました。

しかし、この新しいスレッドは、応答がクライアントに送り返された後も有効ですか?

この WS をどのように実装しますか?

この点を明確にするのを手伝ってくれることを願っています。

4

1 に答える 1

5

リンクしたJersey 2 Asynchronous Server APIは、処理が完了するまでクライアント接続を保持すると思います。非同期処理は実際には Jersey の内部にあり、クライアント エクスペリエンスには影響しません。

ACK を返したい場合は、通常の Jersey メソッドを使用して、作業を別のスレッドに委譲し、すぐに返すことができます。このユースケースには HTTP 202 をお勧めします。

ジャージー 2 の例と同じようにスレッドを作成すると、ジャージー リソース メソッド呼び出しの実行後も存続します。

@POST
public Response asyncPost(String data) {
    new Thread(...).start();
    return Response.status(Response.Status.ACCEPTED).build();
}

とはいえ、アプリ サーバー内でスレッドを作成することは一般的に推奨されません。

EE7 を使用している場合は、JSR-236 http://docs.oracle.com/javaee/7/api/javax/enterprise/concurrent/package-summary.htmlを参照することをお勧めします。

EE6 を使用している場合は、バックグラウンドでメッセージ駆動型 Bean (MDB) によって処理されるキューにメッセージを送信することを検討できます。

于 2013-07-09T22:57:02.667 に答える