服务没有正确注入石英作业类使用石英调度程序插件(v1.0.1)为grails 2.3.6

时间:2014-04-22 14:58:27

标签: grails quartz-scheduler

我已经实现了自己的石英作业类,它采用了一种服务方法。但是,该服务似乎没有正确地注入我的作业类,因为我在访问服务时总是得到一个nullpointer异常。

如何在作业触发期间获得注入的服务。

有关如何从Job类

调用服务中的方法的任何建议

更新1:添加了作业代码和日志消息

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobDataMap;

import com.unitrac.app.reportcentre.report.ReportService;

// Logging
import org.apache.commons.logging.LogFactory;


class ReportJob  implements Job {


    def reportService;               
    def grailsApplication;


    // Logging
    private static final log = LogFactory.getLog(this);


    void execute(JobExecutionContext context) throws JobExecutionException {
        // execute job


      JobDataMap jobMapData = context.getMergedJobDataMap();          


      try
        { 
          log.debug("In Report Job  - executing its JOB at "
              + new Date() + " by " + context.getTrigger().getName());



        String groupName =  context.getTrigger().getJobKey().getName();             

        log.debug("group Name  : "  + groupName);

        reportService.invokeMethod();

        }

      catch( Exception e )
      {
          log.error("Exception: $e");
      }     

    }
}

| |

Server running. Browse to http://localhost:8080/ReportCentre
2014-04-22 14:50:00,087 [UnitracJobScheduler_Worker-1] DEBUG reportcentre.ReportJob - In Report Job  - executing its JOB at Tue Apr 22 14:50:00 CAT 2014 by CCtrigger
2014-04-22 14:50:00,104 [UnitracJobScheduler_Worker-1] DEBUG reportcentre.ReportJob - group Name  : DevGroup
2014-04-22 14:50:00,106 [UnitracJobScheduler_Worker-1] ERROR reportcentre.ReportJob - Exception: java.lang.NullPointerException: Cannot invoke method invokeMethod() on null object 

4 个答案:

答案 0 :(得分:1)

确保您的职业课程在grails-app/jobs,并尝试删除implements Job

答案 1 :(得分:1)

您实际上不需要删除“implements Job”。陷入同样的​​问题......

我猜你正在使用JobBuilder.newJob(...)

创建工作

使用newJob打破注入(它绕过标准对象创建模式)。通常,您可以将加载的内容放入JobDetail中。

然后使用:ReportJob.schedule(触发器)

甚至不需要实例来工作。所有注射都很开心。是的,报告!

答案 2 :(得分:0)

我在需要连接的字段中添加了@Autowired()注释,这对我有用。

答案 3 :(得分:0)

为了它的价值。我尝试了上面的所有建议,但这对我没用。我最终决定从Grails ApplicationContext手动注入服务。

def ss = Holders.grailsApplication.mainContext.getBean(SampleService.class)

这比使用new()

创建服务更好