我想执行客户端请求,以便他们调用会话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
答案 0 :(得分:1)
EJB-3.x具体:
你需要单例bean - @Singleton
,这里你使用的是无状态bean,它可以并行执行。独立于随机顺序的请求。
现在按顺序对事件进行排序,您必须根据您的要求在类/方法级别使用锁定机制。
默认情况下,使用@Singleton
注释的bean是容器管理的&使用锁定模式LockType.WRITE
,显式可以应用@ConcurrencyManagement(CONTAINER)
。如果客户端正在调用任何方法,则所有其他请求都必须等待先前的调用返回。
您还可以使用@Lock(LockType.WRITE)
在方法级别进行注释。因此,调用的顺序将与客户端调用它们的顺序相关。
EJB-2.x具体:
您必须自己创建单身,因为注释不可用。
不确定EJB-2.x中的容器管理并发,但同步入口方法肯定有帮助,因为它在内部调用其他方法。
编辑:将来自bean的请求委托给单例实用程序类&适当地同步方法。因此它将同时解决这个问题。与无状态bean同步问题。