Я получаю исключение NullPointerException при попытке создать таймер. Очевидно, что TimerService не устанавливается, но мой вопрос: почему? Насколько я могу судить, я следую точной схеме, используемой другим классом в нашей заявке, что делает работы.@Resource не устанавливает javax.ejb.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;
}
}
У вас есть декларация ejb для 'TimerService'? –
Несмотря на всю проблему с инъекцией - 1. почему вы держите состояние (сохраняете таймер) в EJB без состояния? 2. Почему вы синхронизируете потокобезопасный EJB? И, наконец, почему вы рассматриваете частный метод как бизнес-метод?Как вы даже вызываете этот компонент и знаете, что 'TimerService' не установлен? –
@SotiriosDelimanolis у нас есть еще один класс, который следует за этим шаблоном, который вводит TimerService таким же образом. – StormeHawke