2013-03-12 49 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

相關問題