1

春の統合を使用して、実行時間の長いアクションを切り離して、ユーザーへの応答を高速化しようとしています。

このリクエストにより、データベースに GPS 位置エントリが作成されます。逆ジオコーディング サービスによって、その GPS 位置のアドレスを取得する http 要求を実行したいと考えています。これには数秒かかることがあるので、後で/並行して実行したいと考えています。

Spring Integration はこれに最適ですが、私が抱えている問題は、並列実行中のサービスが高速化されている場合、ポジション エントリをデータベースに保存するときに競合が発生することです。

Spring Integration で永続オブジェクトを処理する方法に関するベスト プラクティスはありますか? メインのリクエストが処理されるまでオブジェクトをロックする必要がありますか?

アップデート:

基本的に、位置オブジェクト (疑似 Java コード) を操作する 2 つのメソッドがあります。

MVC コントローラーによって呼び出される Service クラスにあるもの:

void createPosition(float longitude, float latitude) {
  Position position = new Position(longitude, latitude);
  positionDao.save(position);
  locationChannel.send(new GenericMessage<Position>(position));
}

それは、locationChannel にアタッチされた ServiceActivator によって呼び出される Service クラスにあります。

void getAddressForPosition(Position) {
  position.setAddress(/* get address via http request from openstreet or google */);
  positionDao.save(position);
}
4

1 に答える 1

0

あなたがそれをやり遂げることができれば、ポジションの作成も2番目のスレッドに委任します. このようにして、作業単位の両方の部分が同じトランザクションで発生する可能性があり、オーケストレーションについて心配する必要はありません。

  1. Web スレッド: リクエストの受信
  2. Web スレッド: 仕事のメッセージを送信
  3. Web スレッド: 応答を返す
  4. サービス スレッド: 位置を作成
  5. サービス スレッド: アドレスで位置を強化する

3 から 4.5 の間の順序保証はありません。その後、クライアントは別のリクエストでポジションが正しく作成されたかどうかを確認できます。

重要な考慮事項は、作業を冪等にすることです。これにより、重複の危険を冒さずに問題が発生した場合にメッセージを再送信できます。

于 2010-07-08T20:19:18.180 に答える