1

sth を計算する EJB があります。計算が実行される限り、精度が向上します。したがって、1 つの非同期関数が計算を開始し、1 つの非同期関数がそれを停止する必要があります。しかし、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

@Lock(WRITE)これは、デフォルトでシングルトンEJBがアクセスできる ためだと思います。

EJBプロキシを経由する代わりにローカル呼び出しを使用しているため、calculate()呼び出し元は呼び出しstartCalculating(-)全体の一部ですstartCalculating(-)(これ@Local(WRITE)も同様です)。

メソッドに追加@Lock(READ)してcalculate()、ローカル呼び出しをビジネス呼び出しに変更するか@Lock(READ)、EJBに設定して試してみます。

于 2013-03-12T13:30:26.843 に答える