2013-03-12 73 views
1

我有一个EJB来计算某物。只要计算运行,精度就越高。 所以一个异步函数开始计算,一个异步应该停止它。但在Glassfish 3.1.2上运行,调用stopCalculating()不会创建新线程,而是等到startCalculating()结束时,显然永远不会发生。Glassfish 3.1.2似乎不在一个EJB中运行多个线程

import java.util.concurrent.Future; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

import javax.ejb.AsyncResult; 
import javax.ejb.Asynchronous; 
import javax.ejb.Singleton; 


@Singleton 
public class Calculator { 

    private boolean calculating = false; 
    private String result = "Empty"; 

    @Asynchronous 
    public void startCalculating() { 
     calculating = true; 
     Logger.getGlobal().log(Level.INFO, "Starting!"); 
     calculate(); 
    } 

    private void calculate() { 
     result = ""; 
     while(calculating) { 
     /*Calculate and update result*/ 
      Logger.getGlobal().log(Level.INFO, "Calculate..."); 
     } 
    } 

    @Asynchronous 
    public Future<String> stopCalculating() { 
     Logger.getGlobal().log(Level.INFO, "Stopping!"); 
     calculating = false; 
     return new AsyncResult<String>(result); 
    } 
} 

我怎样才能得到Glassfish的到在其它线程中运行stopCalculating()

回答

1

我认为这是因为默认Singleton EJB有@Lock(WRITE)访问权限。

您使用市内电话,而不是通过从startCalculating(-)所以calculate()调用EJB代理会是整个startCalculating(-)调用的一部分(以便有@Local(WRITE)为好)。

我会尝试将@Lock(READ)添加到您的calculate()方法中,并将本地调用更改为业务电话,或者仅为您的EJB设置@Lock(READ)并给它一个镜头。

+0

谢谢,这帮了我很多。 – user2140206 2013-03-12 14:21:42