嘿,我有以下问题。
我有一个服务“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。
真的会帮助任何帮助..
答案 0 :(得分:1)
您在调用服务之前创建了一个新的服务实例:
CrawlerService crawler = new CrawlerService()
crawler.updatePagesWithoutCount(s)
因此,这不会得到Spring依赖注入的东西。你有没有尝试过:
def crawlerService
在Job类的顶部?这应该使CrawlerService正确注入。
另外,我注意到你将会话作为参数传递给updatePagesWithoutCount,但是你永远不会对服务方法中传递的变量做任何事情。