2013-12-20 41 views
0

我在Grails 2.1.3中开发应用程序,需要能够动态调度作业。我遇到了Quartz Plugin版本1.0.1中的MyJob.schedule()方法问题。Quartz Plugin - 无方法签名:.schedule()适用于参数类型:(Long,Integer,LinkedHashMap)

目前我有代码调用为出现的工作:

MyJob.schedule((Long)thing.processInterval,-1,[keyName:thing.value]) 

随着MyJob类看起来像:

package com.a.b.jobs 
import com.a.b.thing.ThingsService 

class MyJob{ 

    static triggers = {} 

    def ThingsService 

    def execute(context) { 
     def scheduledThing = ThingsService.getInstance(context.mergedJobDataMap.get('keyName')) 
     //Do things 
     scheduledThing.dateProcessed = new Date() 
    } 
} 

我现在看到的错误是:

时髦。 lang.MissingMethodException:方法没有签名:static com.abjobs.MyJob.schedule()适用于参数类型:(java.lang.Long,java.lang.Integer,java.util.LinkedHashMap)

但根据http://grails-plugins.github.io/grails-quartz/guide/triggers.html这应该是一个可以接受的呼叫。通过this post给出

我按照指导导入包含作业类的软件包,但工作类本身

import com.a.b.jobs.*; 

VS

import com.a.b.jobs.MyJob; 

但这并没有解决我的问题。

任何指导将不胜感激!

编辑添加单元测试& &服务。

package com.a.b.thing 

import spock.lang.Specification 
import com.a.b.thing.Thing 

@TestFor(JobStartService) 
@Mock([Thing]) 
@TestMixin(grails.test.mixin.support.GrailsUnitTestMixin) 
class JobStartServiceSpec extends Specification { 
    def "test schedule"() { 
     when: 
      def myThing = new Thing() 
      myThing.processInterval = 1 
      myThing.name = "name" 
      myThing.save(failOnError:true) 
      assert Thing.findAll().size() == 1 
      service.startJobs() 

     then: "the returned Thing has been processed" 
      assert myThing.dateProcessed != null 

    } 
} 


//service 
package com.a.b.thing 

import groovy.time.* 
import com.a.b.jobs.*; 

class JobStartService { 

    def thingsService 

    def startJobs(){ 
     Thing.findAll().each{ 
      if(!it.dateProcessed){ 
       MyJob.schedule(((Long)it.processInterval), -1,[keyName:it.value]) 
      }else { 
       //other stuff 
      } 
     } 
    } 
} 
+1

你在哪儿该项目的作业类?你什么时候得到这个错误? – dmahapatro

+0

它位于grails-app/jobs/com/a/b/jobs/MyJob.groovy中,并且在使用.schedule()对服务进行单元测试期间出现此错误。 – Blake

+1

你还可以添加单元测试用例吗? – dmahapatro

回答

0

时间表方法的metaClass魔术。为了进行单元测试动态作业调度,最容易做的事情就是让自己的法宝:

given: 
def isScheduled = false 
MyJob.metaClass.static.schedule = { Long repeatInterval, Integer repeatCount, Map params -> 
    isScheduled = true 
} 

...

when: 
service.startJobs() 


then: 
isScheduled 
相关问题