シングルトンと静的クラスを使用するSpringブートプロジェクト(RESTful Webサービス)では、複数のクライアントがRestControllerを使用する場合、同期問題が発生します。スプリングブートが静的クラスに同期されました
私はライブラリの使用方法を同期メソッドでラップしましたが、無用ですが、同時使用は引き続き発生します...なぜ、どのように同期動作を実現できるのか分かりません。
ありがとうございました!
--- ---ソリューション
@Anthonyは私がReentrantLockのを使用し示唆したように、あなたは以下の実装を見ることができます。
generateModelメソッドの違反アサーションに由来する2番目の問題は、ロギングライブラリの問題(別の問題)のためにエラーメッセージを出力しない方法です。
問題が解決しました。ありがとうございます。
---コード---私は、このサービスは、残りのコントローラ内autowiredされ、generateModel方法があるので、私は@Asyncが必要
@Service
public class ModelingService {
//...
@Async
public Future<Void> model(File file, String message) {
ModelingLocker modelingLocker = new ModelingLocker(message, file);
if (isWellFormed(modelingLocker.synchroModeling()) {
//...
}
return new AsyncResult<>(null);
}
//...
}
内で使用
public class ModelingLocker {
private static final ReentrantLock reentrantLock = new ReentrantLock();
private String modeling;
private File out;
public ModelingLocker(String modeling, File out) {
this.modeling = modeling;
this.out = out;
}
public File synchroModeling() throws EngineException {
reentrantLock.lock();
System.out.println(reentrantLock);
System.out.println(System.identityHashCode(reentrantLock));
try {
long id = Thread.currentThread().getId();
System.out.println(String.format("--start--> Thread=%d %s", id, modeling));
ModelingEngine.generateModel(out);
System.out.println(String.format("<--end-- Thread=%d %s", id, modeling));
} finally {
reentrantLock.unlock();
}
return out;
}
}
長いタスクと私はクライアントに201に答える必要があります
同期メソッドはどこに配置しましたか?どのオブジェクトがロックされていますか?異なるスレッドが同期メソッドを含むクラスの異なるインスタンスをロックする場合、それらはお互いに待たないでしょう。 – Jesper
リエントラントロックは正しい解決策でなければなりませんが、うまくいきません。 –
次に、間違った方法で使用した可能性が最も高いです。試したことを示して、正しく使用しているかどうかを人々がコメントできるようにします。 – Jesper