2016-12-08 14 views
0

私はこの問題を解決するためにいくつかのリソースを見つけましたが、私のニーズに合うようにすべての要素を混ぜ合わせることはできません。シングルトンBeanの複数のユーザーの行動を追跡する

Cat(または複数の場合もあります)は、他のユーザーからの嫌がらせを「ロック」したいと思っています。また、呼び出し元にフィードバックを提供し、APIの前に誰が呼び出しているかを伝えたいと思っています。


@Local 
@Singleton // or @Stateful? 
public class CatPetterBean_Local implements CatBean_Facade 
{ 
    /** 
    * Key - The ID of the Cat 
    */ 
    final private ConcurrentHashMap<Integer, User> pettingState = new ConcurrentHashMap<>(); 

    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    @Override 
    public GzipROWithMsg<Object> pet(final ImmutableSet<Integer> catIds) 
    { 
     checkIfTheyAreBeingPetted_AndThrowRuntimeExec(catIds); 

     <...> 

     // After petting, they will be saved by the caller bean (e.g. CatPetterBeanImpl) 
    } 

    <...> 
} 

  • ペッティングは
  • Catの時間がかかるDB状態を保持:ALREADY_PETTEDNOT_PETTED。それがすでに叩かれたら、再び撫でることはできません。私はDBからCatをロードし、その状態をオンザフライでチェックすることさえ考えましたが、それはそのようなネットワークトラフィックが多いと思います。私は​​キーワードのような概念を利用することができますどのよう
  • @Lock注釈
  • いいえ、私は春
  • を使用していないいいえ、これはWebアプリケーション
  • ではありませんはい、私は不足のEEの知識を行います。私はこの問題を早期学習の過程で尋ねています。

答えて

0

EJBシングルトンはロック機構を備えています。デフォルトでは、すべてのBeanメソッドは書込みロックによってシリアル化されています。 EJB Singletonsのデフォルトの並行性モデルは次のとおりです。@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)、これがデフォルトであり、これでシングルトンに注釈を付ける必要はありません。私が言ったように、コンテナの並行処理の管理が行われているときは、すべてのメソッドがロックされています。シングルトンメソッドをより細かく制御したい場合は、それらを@Lock(LockType.READ)で注釈を付けることができます。つまり、誰もBeanに書き込みロックを保持していない間にメソッドに同時にアクセスできます。つまり、@Lock(LockType.WRITE)現在のスレッドへのアクセス。

また、Bean並行性管理を使用することもできます。この場合、シングルトンクラスに@ConcurrencyManagement(ConcurrencyManagementType.BEAN)というアノテーションを付ける必要があります。 この場合、synchronizedやその他のJava並行処理機能を使用します。ほとんどの私の必要性Container Managed並行処理は十分以上でした。

上記のコード断片のもう一つの注意点は、@ Localが適切ではないと思われることです。私の推測では、CatBean_Facadeに@ Localを注釈する必要があります。

関連する問題