1

我有一个 EJB 来计算某事。只要计算运行,精度就会提高。所以一个 async 函数开始计算,一个 async 应该停止它。但是在 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);
    }
}

如何让GlassfishstopCalculating()在其他线程中运行?

4

1 回答 1

1

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

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

我会尝试添加@Lock(READ)到您的calculate()方法并将本地呼叫更改为业务呼叫,或者只是@Lock(READ)为您的 EJB 设置并试一试。

于 2013-03-12T13:30:26.843 回答