我有一个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变量的更新值?
答案 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;
}
}