更新有状态EJB中的变量

时间:2013-10-15 18:04:34

标签: java-ee variable-assignment ejb-3.1

我有一个EJB被注入我的一个类中。 EJB有一种方法可以从注入它的类开始监视资源。 monitor方法中有一个while循环,如果其中一个变量被更新,则需要将其中断。代码看起来像这样:

public class MyObject()
{
    @EJB
    private MyEJB myEjb;

    private Collection stuffToMonitor;

    public MyObject()
    {
        //empty
    }

    public void doSomething()
    {
        // create collection of stuffToMonitor

        myEjb.startMonitoring(stuffToMonitor);

        // code that does something

        if(conditionsAreMet)
        {
            myEjb.stopMonitoring();
        }

        // more code
    }
}

@Stateful
public class MyEJB()
{
    private volatile boolean monitoringStopped = false;

    public MyEJB()
    {
        //empty
    }

    public void startMonitoring(Collection stuffToMonitor)
    {
        int completed = 0;
        int total = stuffToMonitor.size();

        while(completed < total)
        {
            // using Futures, track completed stuff in collection

            // log the value of this.monitoringStopped     
            if (this.monitoringStopped)
            {
                break;
            }
        }
    }

    public voide stopMonitoring()
    {
        this.monitoringStopped = true;
        // log the value of this.monitoringStopped
    }
}

在我的日志中,我可以看到在调用stopMonitoring方法之后this.monitoringStopped的值为true,但它始终在while循环中记录为false

最初,MyEJB是无状态的,它已被更改为有状态,我也将变量设置为volatile,但是在while循环中没有获取更改。

我缺少什么来获取我的代码以获取monitoringStopped变量的更新值?

1 个答案:

答案 0 :(得分:0)

我认为我试图做的事情对EJBS来说是不可能的,尽管如果有人知道的话我会很感激他们的回音。

相反,我发现了一种不同的方式。我添加了第三个类MyStatus,它包含MyObject将设置的状态变量,而不是调用myEjb.stopMonitoring();。我将MyEJB设置为无状态bean,并在startMonitoring方法中将MyStatus对象传递给它。它会在while循环的每次迭代期间检查状态,并根据它进行分解。

更新的代码:

public class MyObject()
{
    @EJB
    private MyEJB myEjb;

    @EJB
    private MyStatus myStatus;

    private Collection stuffToMonitor;

    public MyObject()
    {
        //empty
    }

    public void doSomething()
    {
        // create collection of stuffToMonitor

        myEjb.startMonitoring(stuffToMonitor);

        // code that does something

        if(conditionsAreMet)
        {
            myStatus.stopMonitor();
        }

        // more code
    }
}

@Stateless
public class MyEJB()
{
    private volatile boolean monitoringStopped = false;

    public MyEJB()
    {
        //empty
    }

    public void startMonitoring(Collection stuffToMonitor, MyStatus myStatus)
    {
        int completed = 0;
        int total = stuffToMonitor.size();

        while((completed < total) && myStatus.shouldMonitor())
        {
            // using Futures, track completed stuff in collection
        }
    }
}

@Stateless
public class MyStatus
{
    private boolean shouldMonitor = true;

    public void stopMonitor()
    {
        this.shouldMonitor = false;
    }

    public boolean shouldMonitor()
    {
        return this.shouldMonitor;
    }
}