Jakarta ee 有状态EJB中的更新变量
我有一个EJB,它被注入到我的一个类中。EJB有一个方法可以从注入资源的类开始监视资源。监视器方法中有一个while循环,如果更新其中一个变量,则需要中断该循环。代码如下所示: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
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;
}
}