嘿,我有以下问题。
我有一个从 Controller 调用的服务“a”并且运行良好。
问题:当我从 cron 调用相同的服务时,服务找不到 session 对象。
CRON 工作
@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
有任何想法吗?如何访问服务中的 session ?顺便说一句,在 cron-job 中可以访问 session ,我可以在那里轻松地使用它。服务中的 sessionFactory 对象也为空。
真的会给予任何帮助..
最佳答案
在调用它之前,您正在创建服务的新实例:
CrawlerService crawler = new CrawlerService()
crawler.updatePagesWithoutCount(s)
所以,这不会得到 Spring 依赖注入(inject)的东西。你有没有试过做一个:
def crawlerService
在你的工作类的顶部?这应该使得 CrawlerService 被正确注入(inject)。
另外,我注意到您将 session 作为参数传递给 updatePagesWithoutCount,但是您永远不会对服务方法内部传递的变量执行任何操作。
关于session - Grails Quartz 插件 : Call service from cron (Session = NULL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25344134/