0
votes

I am trying to reschedule a job and I have defined my method like so :

  private def updateTriggerInterval(context: JobExecutionContext): Unit = {
    val randomInterval = rand.nextInt((max - min) + 1) + min
    val oldTrigger: Trigger = context.getTrigger
    val up: TriggerBuilder[SimpleTrigger] = oldTrigger.getTriggerBuilder.withSchedule[SimpleTrigger](simpleSchedule()
       .withIntervalInMinutes(randomInterval).repeatForever())

    val scheduler = StdSchedulerFactory.getDefaultScheduler
    scheduler.rescheduleJob(oldTrigger.getKey, up.build())
  }

This gives me the following error :

Error:(33, 55) type arguments [org.quartz.SimpleTrigger] do not conform to method withSchedule's type parameter bounds [SBT <: ?0] val up = oldTrigger.getTriggerBuilder.withScheduleSimpleTrigger.build()

Now looking at the signature of withSchedule :

public <SBT extends T> TriggerBuilder<SBT> withSchedule(ScheduleBuilder<SBT> schedBuilder)

T is a type parameter on the class of withSchedule which looks like class TriggerBuilder<T extends Trigger>. So T should be defined by the type parameter of the instance returned by getTriggerBuilder, which here should be TriggerBuilder<SimpleTrigger> getTriggerBuilder(), so T is a SimpleTrigger. In the Trigger interface getTriggerBuilder is defined like so : TriggerBuilder<? extends Trigger> getTriggerBuilder().simpleSchedule returns a SimpleScheduleBuilder (which extends ScheduleBuilder<SimpleTrigger>).

What I'm understanding here is that SBT (i.e SimpleTrigger too if we look at the error) should extends a class that extends Trigger. Problem here is we have SimpleTrigger <: SimpleTrigger. Totally not sure I read this right though.

If I do not type withSchedule I end up with the same error, plus this one :

Error:(37, 46) type mismatch; found : org.quartz.SimpleScheduleBuilder required: org.quartz.ScheduleBuilder[SBT] .withIntervalInMinutes(randomInterval).repeatForever)

                                         ^

Can somebody help me out here ? For the record the official Quartz example isn't compiling either (same error).

1
What's the type T for Trigger, and what's the result type of simpleSchedule(). Looks to me like some ugliness coming from Java's use-site variance. For that in Scala you usually need existential types, like withSchedule[_ <: SimpleTrigger]. Not sure - 0__
@0__ Updated question. Existential type gives me "unbounded wildcard type". - LMeyer

1 Answers

0
votes

Alright, just made it work by casting oldTrigger to SimpleTrigger... That turned TriggerBuilder<? extends Trigger> getTriggerBuilder() into TriggerBuilder<SimpleTrigger> getTriggerBuilder().