2012-03-27 39 views
1

我想执行客户端请求以便他们调用会话bean。但有时第二个请求在第一个请求之前成功执行使用ejb2无状态会话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

您能否提供您的意思的示例代码?这将更容易遵循。 – Prashanth 2012-03-27 11:08:14

+0

请检查编辑的问题 – chetan 2012-03-27 11:18:35

回答

1

EJB-3.X具体:

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

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

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

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

EJB-2.X具体:

  • 你必须为注记不可用于创建自己的单。

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

    编辑:将来自bean的请求委托给单一实用程序类&适当地同步方法。因此,它将解决两个问题,即共享&与无状态bean的同步问题。

+0

对于EJB 2.x,同步该方法将不起作用。该容器将池实例并给每个线程一个不同的bean。您需要同步共享/静态对象。 – 2012-03-28 15:57:37

+0

@bkail但是,如果实现singleton bean实例,那么同步一个方法可能会起作用。否则作为一种解决方法,可以使用普通的Java实用程序类来实现此功能,并且可以进一步调用用于数据库操作的会话Bean方法。 ServiceLocator和委托可能适用于它。 – 2012-03-28 17:55:45

+0

你的意思是,将实例方法委托给单例?这将工作。就像在共享/静态对象上进行同步一样。如果你用这个更新你的“EJB-2.x Specific”,我会赞成。 – 2012-03-29 04:03:28