2013-12-20 42 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 
相關問題