Estamos usando cuarzo (la API de Java) para la programación de trabajos. Esto funciona bien Ahora estoy tratando de generalizar algunas cosas con eso. La API de cuarzo requiere una clase de trabajo como parámetro que amplía la interfaz de trabajo. Esto hace que sea imposible pasar argumentos a través de un constructor.Scala: Cree una clase de trabajo de Quartz genérica
Tenemos un conjunto de puestos de trabajo que todos deben hacer lo mismo, ejecutar un cheque, si es cierto entonces invocar una acción, por ejemplo:
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
}
}
se instancia a continuación Un trabajo de cuarzo mediante la invocación:
newJob(classOf[SimpleJob]).with...
Esto funciona.
los objetivos es volver a utilizar esta lógica para diferentes tipos de cheques Pregunta: ¿Puedo utilizar el sistema de tipos Scala de tal manera que pueda tener uno JobClass mecanografiado que se puede volver a utilizar para ejecutar cualquier subclase de ¿Comprobar?
se me ha ocurrido con la siguiente solución:
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
}
}
}
un trabajo ahora se pueden crear instancias de esta manera:
newJob(classOf[GenericJobRule[PerformanceCheck]])
Esto funciona, sin embargo creo que la creación de instancias y emitan tipo de elude toda la idea de la verificación de tipos. ¿Hay alguna forma mejor de hacer esto? Tal vez deberíamos replantear nuestro diseño, así ...
Gracias, Albert
Veo a dónde va. Parece que JobRule1 toma un argumento constructor que no está permitido para la API de cuarzo (que debe tener un tipo de clase de constructor por defecto cero extendiendo Job. ¿O me está faltando el punto y es el objeto implícito el que se ocupa de eso? – Albert
Lo hice desconozco esta restricción en la API de cuarzo (definí mis propias clases para que compile).Creo que la implementación propuesta consiste en demasiados códigos, tal vez pueda mejorarlos (y deshacerme del argumento constructor). – Christian
FYI: el método de fábrica de cuarzo jobBuilder: público estático JobBuilder newJob (Clase Extiende el trabajo> jobClass) (gracias por cierto!) – Albert