いくつか問題があります。
たとえば、First と Second という 2 つのアクションがあります。
executor サービスを使用して 100000 の非同期リクエストを action First と actions Second に送信する簡単なユーティリティを作成しました。
最初のアクションでは、次のことを行います。
HitCounter.increment();
ActionContext.getContext().getSession().put("counter", HitCounter.getAtomicCounter());
return Action.SUCCESS;
2番目のアクションでは、次のことを行います。
System.out.println("From session: "+ActionContext.getContext().getSession().get("counter"));
System.out.println("Actual:"+ HitCounter.getAtomicCounter());
return Action.SUCCESS;
そして、私が見る出力(そしてそれは本当に私を怒らせます):
From session: 2
Actual: 69352
この Fitst アクション/Second アクションをブラウザからのみ使用し、同時要求が来ない (負荷ユーティリティによって生成された) しばらくすると、結果は実際の値に「安定」します。したがって、同時実行の問題があります。
Struts2 での同時実行性の問題を回避するために使用すべき標準的な方法はありますか?
PS HitCounter は、フィールドが 1 つしかなく、AtomicInteger であるため、スレッド セーフです。
PPS HitCounter の実現:
public class HitCounter {
private static AtomicInteger counter = new AtomicInteger(0);
public static void increment() {
counter.incrementAndGet();
}
public static int getAtomicCounter() {
return counter.get();
}
}
PPPS Thread.yield(); を削除しました。しかし、それは役に立ちませんでした。:(