0

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

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

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

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

4

1 回答 1

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;
    }
}
于 2013-10-15T21:39:37.797 回答