Jakarta ee 有状态EJB中的更新变量

Jakarta ee 有状态EJB中的更新变量,jakarta-ee,variable-assignment,ejb-3.1,Jakarta Ee,Variable Assignment,Ejb 3.1,我有一个EJB,它被注入到我的一个类中。EJB有一个方法可以从注入资源的类开始监视资源。监视器方法中有一个while循环,如果更新其中一个变量,则需要中断该循环。代码如下所示: public class MyObject() { @EJB private MyEJB myEjb; private Collection stuffToMonitor; public MyObject() { //empty } publi

我有一个EJB,它被注入到我的一个类中。EJB有一个方法可以从注入资源的类开始监视资源。监视器方法中有一个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
    }
}
公共类MyObject()
{
@EJB
私人医院;
私人收藏品监督;
公共对象()
{
//空的
}
公共无效剂量测定法()
{
//创建stuffToMonitor的集合
myEjb.启动监控(填充监控);
//做某事的代码
if(conditionsAreMet)
{
myEjb.stopMonitoring();
}
//更多代码
}
}
@有状态
公共类MyEJB()
{
private volatile boolean monitoringStopped=false;
公共图书馆
{
//空的
}
公共作废开始监控(收集填充监控)
{
int completed=0;
int total=stuffToMonitor.size();
while(已完成<总计)
{
//使用Futures,跟踪集合中已完成的内容
//记录this.monitoringStopped的值
如果(此监视已停止)
{
打破
}
}
}
公共采空区监测()
{
this.monitoringStopped=true;
//记录this.monitoringStopped的值
}
}
在我的日志中,我可以看到调用stopMonitoring方法后this.monitoringStopped的值为
true
,但它在while循环中始终记录为
false

最初,MyEJB是无状态的,它被更改为有状态的,我还使变量变为volatile,但是在while循环中没有检测到更改


让我的代码获得monitoringStopped变量的更新值,我缺少了什么?

我认为我试图用EJB做的事情是不可能的,尽管如果有人知道得更好,我希望能听到他们的消息

相反,我找到了一种不同的方法。我添加了第三个类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;
    }
}
公共类MyObject()
{
@EJB
私人医院;
@EJB
私人MyStatus MyStatus;
私人收藏品监督;
公共对象()
{
//空的
}
公共无效剂量测定法()
{
//创建stuffToMonitor的集合
myEjb.启动监控(填充监控);
//做某事的代码
if(conditionsAreMet)
{
myStatus.stopMonitor();
}
//更多代码
}
}
@无国籍
公共类MyEJB()
{
private volatile boolean monitoringStopped=false;
公共图书馆
{
//空的
}
公共无效开始监视(集合填充监视器,MyStatus MyStatus)
{
int completed=0;
int total=stuffToMonitor.size();
而((已完成<总计)&&myStatus.shouldMonitor())
{
//使用Futures,跟踪集合中已完成的内容
}
}
}
@无国籍
公共类MyStatus
{
私有布尔值shouldMonitor=true;
公共void stopMonitor()
{
this.shouldMonitor=false;
}
公共布尔值shouldMonitor()
{
返回此.shouldMonitor;
}
}