首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在TimerTask中注入服务

在TimerTask中注入服务
EN

Stack Overflow用户
提问于 2014-10-03 11:10:25
回答 2查看 973关注 0票数 0

我需要每天运行一个过程,以便在服务器上进行维护工作(更新记录)。

我有一个单例作用域类,它运行一个计时器和一个内部类,并注入我需要的服务。当我运行程序时,计时器会抛出一个NullPointerException,因为服务还没有注入。

代码语言:javascript
复制
@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)

除了这个类之外,应用程序工作得很好。当应用程序完全工作时,我如何注入服务?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-03 12:00:08

通常,当类不是CDI时,就会有NPE。如果您生成了新的Updater(),CDI就不会考虑这一点。您必须@将更新程序注入您的Singleton中。

票数 0
EN

Stack Overflow用户

发布于 2014-10-03 11:56:29

CDI不会管理实例,因为您通过自己调用Updater的构造函数来实例化它。

现在有两种方法可以解决这个问题:

  1. Updater类的DemonImpl中注入一个实例并使用该实例。
  2. 通过在Provider<Updater>中注入DemonImpl实例,在运行时创建一个新的CDI托管实例,并从中获取Updater类的一个新实例。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26177918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档