最善の解決策は、更新プログラムがこれを既に認識しており、「差分」データ、つまり変更されたデータまたは相違点のみを取得することです。これが不可能な場合は、最新の更新をロールバックするしかありません。このためには、以前の更新を保存して、元に戻して新しい更新をプッシュできるようにする必要があります。このようなものが動作するはずです:
public class Updater
{
private static Price prevUpdate = null;
public static synchronized void updatePrice(Price update)
{
if (prevUpdate != null)
{
rollbackUpdate(prevUpdate);
}
sendPriceUpdate(update); //takes a long time
prevUpdate = update;
}
}
static
このクラスのオブジェクトをインスタンス化する必要はないと思うので、これを に変更しました。私には静的サービスのように見えます。私が間違っている場合 (たとえば、異なるスレッドが異なるアップデータを使用したいため、異なる更新を追跡する場合)、変更してください。
これはスレッドセーフですが、sendPriceUpdate()
時間がかかると、updatePrice()
メソッドで多くのスレッドがロックされる可能性があります。また、これはスローされる例外を考慮していないため、これを考慮する必要があります。
私がコメントで言ったように、これは(非常に?)悪い解決策ですが、どれが最後か、または最後がいつ到着するかわからない場合は、これが唯一の解決策です。ソフトウェアの再設計により、この状況が解決されるか、より高いレベルで解決される可能性があります (を呼び出す前にupdatePrice()
) 。