1

シナリオは次のとおりです。

Apache CXFを使用して、Webサービスをクライアントに公開しています。リクエストを受け取って処理した後、処理されたメッセージヘッダーにシーケンス番号を追加する必要があり、MQを介して別のプログラムに転送します。また、私はSpringを使用してBeanの管理とインジェクションを処理しています。

DBを使用せずにシーケンスを管理するための最良の方法は何ですか(シーケンス管理のためだけにDBをインストールすると、膨大なオーバーヘッドと肥大化が発生するようです)。解決策がファイル(プロパティファイル?)を使用することである場合、例外が発生した場合に一貫性を選択するにはどうすればよいですか?また、複数のリクエストが同時に到着した場合、シーケンスが一貫している必要があります。

4

3 に答える 3

2

すべてが同じクラスローダー内で機能する場合は、AtomicLongプライベートフィールドを使用してシングルトンを作成できます。

于 2012-10-30T07:56:51.527 に答える
1

そのサービスにインスタンスが1つしかない場合は、からのタイムスタンプSystem.currentTimeMillis()。ほとんどの場合、これで十分です。文字列を識別子として使用できる場合は、タイムスタンプ文字列とナノ秒単位の時間を使用することをお勧めします。同時にサービスを提供するWebサービスの複数のインスタンスがある場合は、おそらく単一のカウンターが必要になります。

private static long counter = 0;
private static synchronized long nextCounter() {
    return counter++;
}

(もちろん、オーバーフローをチェックする必要があります)

ほとんどの場合、私は両方の組み合わせを使用します。

于 2012-10-30T07:57:03.483 に答える
1

MQを使用して転送するので、自分で追跡するのではなく、MQシーケンスメカニズムだけではどうでしょうか。

自分自身を追跡したい場合は、(同期された)シングルトンの数字を調べる必要があります。また、再起動後にシーケンスを維持したい場合は、永続性メカニズム必要になります(ただし、必ずしもDBである必要はありません)。このサービスを提供するためにMQキューを設計できると確信していますが、それは非常に不均衡です;-)

したがって、最初にMQシーケンスを見てください。

乾杯、

于 2012-10-30T07:53:19.790 に答える