我需要每天运行一个过程,以便在服务器上进行维护工作(更新记录)。
我有一个单例作用域类,它运行一个计时器和一个内部类,并注入我需要的服务。当我运行程序时,计时器会抛出一个NullPointerException,因为服务还没有注入。
@Named("demonService")
@Singleton
public class DemonImpl implements IDemonService
{
private static Logger log = Logger.getLogger(DemonioImpl.class);
@PostConstruct
public void init()
{
log.info("-->Demon");
Calendar today = new GregorianCalendar();//Every day at 2:00am (from now)
today.set(Calendar.HOUR_OF_DAY, 2);
today.set(Calendar.MINUTE, 0);
today.set(Calendar.SECOND, 0);
try
{
Timer timer = new Timer(true);
timer.schedule(new Updater(), today.getTime(), 24*60*60*1000);
}
catch(Exception e)
{
log.fatal(e.getLocalizedMessage());
e.printStackTrace();
}
log.info("--> Demon: exit");
}
private class Updater extends TimerTask
{
private Logger log = Logger.getLogger(Updater.class);
@Inject
@Named("updaterService")
private IUpdaterService updaterService;
@Override
public void run()
{
log.info("Task: update records (start)");
List<Record> list = updaterService.getAll();//<-- This throws the exception
for(Record item : list)
{
updaterService.update(item);
}
log.info("Task: update records (exit)");
}
}错误是
Exception in thread "Timer-3" java.lang.NullPointerException at test.service.impl.DemonImpl$Updater.run(DemonImpl.java:66) at java.util.TimerThread.mainLoop(Timer.java:555) at java.util.TimerThread.run(Timer.java:505)
除了这个类之外,应用程序工作得很好。当应用程序完全工作时,我如何注入服务?
发布于 2014-10-03 12:00:08
通常,当类不是CDI时,就会有NPE。如果您生成了新的Updater(),CDI就不会考虑这一点。您必须@将更新程序注入您的Singleton中。
发布于 2014-10-03 11:56:29
CDI不会管理实例,因为您通过自己调用Updater的构造函数来实例化它。
现在有两种方法可以解决这个问题:
Updater类的DemonImpl中注入一个实例并使用该实例。Provider<Updater>中注入DemonImpl实例,在运行时创建一个新的CDI托管实例,并从中获取Updater类的一个新实例。https://stackoverflow.com/questions/26177918
复制相似问题