【问题标题】:Glassfish 3.1.2 seems not to run more than one thread in an EJBGlassfish 3.1.2 似乎不会在 EJB 中运行多个线程
【发布时间】:2013-03-12 12:35:01
【问题描述】:

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

我怎样才能让 Glassfish 在另一个线程中运行 stopCalculating()

【问题讨论】:

    标签: asynchronous glassfish ejb


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢你,这对我帮助很大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多