【发布时间】:2015-05-07 18:07:05
【问题描述】:
我在尝试创建计时器时收到 NullPointerException。显然 TimerService 没有设置,但我的问题是,为什么?据我所知,我正在遵循我们的应用程序中另一个类使用的确切模式,确实工作。
注意:我是 EJB 新手,所以解释很有帮助
@Stateless
public class MyClass implements SomeInterface
{
private static final Logger ourLogger = new Logger(MyClass.class);
private volatile Timer timer = null;
private volatile static MyClass instance = null;
@javax.annotation.Resource
TimerService timerService;
@Override
public synchronized void myMethod()
{
resetTimer();
//do other stuff
}
/**
* Creates the timer.
*/
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
private synchronized void resetTimer()
{
if (timer != null)
{
timer.cancel();
timer = null;
}
//NullPointerException on next line:
timer = timerService.createTimer(30000, "My Note");
}
public static MyClass getInstance()
{//MDB calls this, then runs instance.myMethod
if (instance == null)
{
instance = new MyClass ();
}
return instance;
}
@Timeout
public synchronized void timeout()
{
//Do some stuff
instance = null;
}
}
【问题讨论】:
-
你有
TimerService的ejb声明吗? -
尽管注入有整个问题 - 1. 为什么要在无状态 EJB 中保存状态(存储计时器)? 2. 为什么要同步线程安全的 EJB?最后——为什么你将私有方法视为一种商业方法?你如何调用这个 bean 并知道
TimerService没有设置? -
@SotiriosDelimanolis 我们有另一个遵循这种模式的类,它以相同的方式注入 TimerService
-
@PiotrNowicki 我从 MessageDrivenBean 调用它。这只是课程的一部分。我存储计时器,以便可以取消和重置它。 resetTimer() 方法是从另一个为简洁起见未显示的方法运行的。
-
我问你如何调用这个 bean 的原因是你可能不是将它用作 EJB,而是用作常规类,因此不会注入
TimerService。这是第一部分。其次 - 如果你将任何东西存储在 SLSB 中,你无法确定下次它是否会处于与你离开时相同的状态 - 因此你真的不应该这样做。