Grails Quartz插件:来自cron的调用服务(Session = NULL)

时间:2014-08-16 21:25:04

标签: session grails cron quartz-scheduler

嘿,我有以下问题。

我有一个服务“a”,从控制器调用并完美地工作。

问题:当我从cron调用相同的服务时,服务无法找到会话对象。

CRON JOB

@Transactional
class TESTCLASS{

    def javax.sql.DataSource dataSource
    def sessionFactory

    static triggers = {
      cron name: 'TESTCLASS', cronExpression: "0 07  23 * * ?"
    }

    def execute() {
        Session s = sessionFactory.getCurrentSession(); 
        CrawlerService crawler = new CrawlerService()
        crawler.updatePagesWithoutCount(s)
    }
}

服务

@Transactional
class CrawlerService {

def updatePagesWithoutCount(Session s){

    if(session==null){println ">>>> SESSION = NULL"}
    else{println ">>>> SESSION OK: "+session.toString()}
        //get all entries without count yet

在打印降级文件之前,该方法失败

Error |
2014-08-16 23:07:00,132 [quartzScheduler_Worker-1] ERROR listeners.ExceptionPrinterJobListener  - Exception occurred in job: Grails Job
Message: java.lang.NullPointerException
   Line | Method
->> 111 | execute in grails.plugins.quartz.GrailsJobFactory$GrailsJob
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   202 | run     in org.quartz.core.JobRunShell
^   573 | run . . in org.quartz.simpl.SimpleThreadPool$WorkerThread
Caused by NullPointerException: null
->>  29 | $tt__execute in twagocrawler.UpdatePagesWithoutCountJob
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   104 | execute in grails.plugins.quartz.GrailsJobFactory$GrailsJob
|   202 | run . . in org.quartz.core.JobRunShell
^   573 | run     in org.quartz.simpl.SimpleThreadPool$WorkerThread

有什么想法吗?如何访问服务中的会话?顺便说一下,在cron-job中可以访问会话,我可以在那里轻松使用它。此外,sessionFactory对象在服务中为null。

真的会帮助任何帮助..

1 个答案:

答案 0 :(得分:1)

您在调用服务之前创建了一个新的服务实例:

CrawlerService crawler = new CrawlerService()
crawler.updatePagesWithoutCount(s)

因此,这不会得到Spring依赖注入的东西。你有没有尝试过:

def crawlerService

在Job类的顶部?这应该使CrawlerService正确注入。

另外,我注意到你将会话作为参数传递给updatePagesWithoutCount,但是你永远不会对服务方法中传递的变量做任何事情。