1

我想按照他们调用会话 bean 的顺序执行客户端请求。但有时第二个请求在第一个请求之前成功执行。

是否可以使用 ejb2 无状态会话 Bean 执行顺序客户端请求?

public generate(){
    .................
    update()
    .............
}
private update(){

  debugLog(" update query for "+id);

   //code for update query

  debugLog(" execute update query for "+id);


}

当我同时发送两个请求时,我得到了像..

 update query for 16
 update query for 16
 execute update query for 17
 execute update query for 16

但我想像这样连续执行它

update query for 16
 update query for 16
 execute update query for 16
 execute update query for 17
4

1 回答 1

1

EJB-3.x 特定:

  • 您需要单例 bean - @Singleton,在这里您使用的是无状态 bean,它可能以随机顺序并行和独立地执行请求。

  • 现在按顺序对事件进行排序,您必须根据您的要求在类/方法级别使用锁定机制。

    默认情况下,带有注释的 bean@Singleton是容器管理的,并且使用锁定模式LockType.WRITE,可以显式应用@ConcurrencyManagement(CONTAINER)。如果客户端正在调用任何方法,则所有其他请求都必须等待前一个调用返回。

    您还可以在方法级别使用 进行注释@Lock(LockType.WRITE)。因此,调用顺序将与客户端调用它们的顺序有关。

EJB-2.x 特定:

  • 您必须自己创建单例,因为注释不可用。

  • 不确定 EJB-2.x 中的容器管理并发,但同步入口方法肯定会有所帮助,因为它在内部调用其他方法。

    编辑:将 bean 的请求委托给单例实用程序类并适当地同步方法。因此,它将解决无状态 bean 的池化和同步问题。

于 2012-03-27T12:13:00.733 回答