【问题标题】:Track actions of several users in a singleton bean在单例 bean 中跟踪多个用户的操作
【发布时间】:2016-12-08 10:29:57
【问题描述】:

我找到了几个资源来帮助我解决这个问题,但我似乎无法混合所有成分以满足我的需求。

我想“锁定”一个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)
    }

    <...>
}

  • 抚摸需要一段时间
  • Cats 在 DB 中保留一个状态:ALREADY_PETTEDNOT_PETTED。一旦它被拍过,它就不能再被抚摸了。我什至想过从数据库中加载Cat 并即时检查其状态,但我认为这样会增加网络流量。
  • 如何利用 synchronized 关键字、@Lock 注释等概念
  • 不,我没有使用 Spring
  • 不,这不是网络应用
  • 是的,我确实缺乏 EE 知识。我在快速学习的过程中提出这个问题。

【问题讨论】:

    标签: java jakarta-ee ejb ejb-3.1 java-ee-7


    【解决方案1】:

    EJB 单例在底层具有锁定机制,默认情况下,所有 bean 方法都通过写锁序列化。 EJB Singletons 上的默认并发模型是:@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER),这是默认的,不需要用 this 来注解单例。当容器并发管理发挥作用时,正如我之前所说的,每个方法都是写锁定的。如果您想更好地控制单例方法,您可以使用 @Lock(LockType.READ) 注释它们,这意味着可以同时访问该方法,而没有人持有 bean 上的写锁,或者 @Lock(LockType.WRITE) 提供独占访问当前线程。

    或者,您可以使用 Bean 并发管理。在这种情况下,您应该使用:@ConcurrencyManagement(ConcurrencyManagementType.BEAN) 注释您的单例类。 在这种情况下,您使用 synchronized 和其他 Java 并发特性。对于我的大部分需求,Container Managed 并发已经绰绰有余了。

    上面代码片段的另一个说明是@Local 似乎不合适,我的猜测是CatBean_Facade 应该用@Local 注释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多