我有一个EJB来计算......只要计算运行,精度就会提高。
所以一个异步函数启动计算,一个异步应该停止它。但是,在Glassfish 3.1.2上运行调用stopCalculating()
不会创建新的线程,但会等到startCalculating()
完成,显然从未发生过。
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()
?
答案 0 :(得分:1)
我认为这是因为默认情况下Singleton EJB具有@Lock(WRITE)
访问权限。
您正在使用本地调用而不是通过EJB代理,因此从calculate()
调用的startCalculating(-)
是整个startCalculating(-)
调用的一部分(因此@Local(WRITE)
也是如此)。
我尝试将@Lock(READ)
添加到您的calculate()
方法并将本地调用更改为业务调用,或者只为您的EJB设置@Lock(READ)
并为其提供一个镜头。