2011-10-28 22 views
1

私はJava RESTfulウェブサービスを持っています。これは別のプロセスによって約10秒ごとに呼び出されます。条件が正しい場合、Webサービスは潜在的に広範なETLプロセス(たとえば10〜20秒)を実行する必要があります。しかし、ペイロードが正常にWebサービスに配信されたことを呼び出しアプリケーションにすぐに戻したいと考えています。要件のワーカースレッドが続行されている間、メインスレッドはRESTfulなWebサービスで終了できますか?

概要:

  • 検証認証および入力パラメータ。
  • 検証が失敗した場合は、XMLでエラーを返します。
  • スレッドを開始してETLプロセスを実行します。プロセスは特定の条件下でのみ進められます。
  • 配信されたペイロードを示すXMLと、渡された入力の検証を返します。

私はこれをコード化しており、正しく動作しているようです。しかしそれは正しいとは思わない。作成したスレッドは、メインのWebサービススレッドより長く実行される可能性があります。

誰もがこれを行うためのよりよい方法を教えたいですか?

答えて

1

これはまさに正しい方法です。解決策について「正しいと思わない」とは何ですか?

私の唯一の提案は、あなたは単にワイルド・ニーのスレッドを起動してはならないということです。これらのETLプロセス・スレッドを管理する、ある種の共有ExecutorServiceが必要です。実行されているもの、実行中のもの、およびバックグラウンドプロセスの数を制限/制御する機能(および不正な実行を処理する可能性がある)を表示することができます。

また、起動されたプロセスの「jobId」を生成し、呼び出し元に返すこともできます。クライアントがジョブのステータスを確認するために使用できるAPIを呼び出すことができます。あなたは成功を戻したいようですねしかし、我々はペイロードがWebサービスに正常に配信されたことを示す、すぐに呼び出し元のアプリケーションに を返したい

+0

ありがとうございます。私はシングルトンでExecutorServiceを実装しました。スレッドの結果を追跡し、後で暴走スレッドをチェックするためのコードを導入できるように、スレッドクラスでもCallable <>インターフェイスを使用しています。 – BigRedBettaFish

0

... ...

/失敗メッセージは、検証の直後に送信され、成功した要求の応答が含まれている場合は、再度送信されます。

これはうまくいかない技術的な理由はありませんが、典型的なRESTful Webサービスエクスチェンジでは、1つのリクエストに対して2つの応答を返す可能性があるため、これは、おそらくあなたやあなたの会社ではないクライアントを混乱させるでしょう。

最初のサービス要求で返されたチケットと非同期に照会できる追加のコールバックサービスを実装することをお勧めします。これには、トランザクションの結果を返すのを待っているときにサービス1をブロックしないという追加の利点があります。

あなたの負荷が低い限り、トランザクションの別のスレッドを起動しても問題ありません。スレッドが高すぎると、スレッドを開始できなくなったときにリクエストのタイムアウトが始まります。

0

代わりに、タスクの実行とタスクの実行の責任を分けることができます。Webサービスがリクエストを受け取り検証しますが、すぐに実行するためにスレッドを生成する代わりに、外部ストアに永続性を保存することができます。

次に、cronで実行される簡単なスケジュールタスク(Quartz)を使用して、新しいタスクを取得して実行します。

このアプローチの利点は、デカップリングが強化され、システムの柔軟性が向上していることです(Webサービスがダウンしてもタスクの実行には影響しません)。コンは、システム内で動きのある部品(コンポーネント)です。

どのような場合でも、現在の設定が正しく動作し、適切な軌道に乗っています。

関連する問題