Glassfish 3.1.2似乎不会在EJB中运行多个线程

时间:2013-03-12 12:35:02

标签: asynchronous glassfish ejb

我有一个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()

1 个答案:

答案 0 :(得分:1)

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

您正在使用本地调用而不是通过EJB代理,因此从calculate()调用的startCalculating(-)是整个startCalculating(-)调用的一部分(因此@Local(WRITE)也是如此)。

我尝试将@Lock(READ)添加到您的calculate()方法并将本地调用更改为业务调用,或者只为您的EJB设置@Lock(READ)并为其提供一个镜头。