我们使用quartz(java API)进行作业调度。这很好用。现在我试图用它概括一些事情。石英 api 需要一个作业类作为扩展作业接口的参数。这使得通过构造函数传递参数成为不可能。
我们有一组作业都应该做同样的事情,执行检查,如果为真则调用一个动作,例如:
class SimpleJob extends Job {
def execute(context: JobExecutionContext) {
val check = classOf[SimpleCheck].asInstanceOf[Class[Check]].newInstance()
val result = check.execute(context.getJobDetail.getJobDataMap)
if (result.shouldInvokeAction) {
Action(result).execute
}
}
然后通过调用来实例化一个石英作业:
newJob(classOf[SimpleJob]).with...
这行得通。
目标是为不同类型的检查重用这个逻辑问题:我可以使用 scala 类型系统,这样我就可以拥有一个类型化的 JobClass,它可以被重用于执行 Check 的任何子类?
我想出了以下解决方案:
class GenericJobRule[J <: Check](implicit m: Manifest[J]) extends Job {
def execute(context: JobExecutionContext) {
val check = m.erasure.newInstance().asInstanceOf[J]
val result = check.execute(context.getJobDetail.getJobDataMap)
if (result.shouldInvokeAction) {
Action(result).execute
}
}
}
现在可以像这样实例化作业:
newJob(classOf[GenericJobRule[PerformanceCheck]])
这可行,但是我认为实例化和强制类型绕过了类型检查的整个想法。有没有更好的方法来做到这一点?也许我们也应该重新考虑我们的设计......
谢谢,阿尔伯特