I have written scheduler jobs to take reports in Quartz. I'm getting exceptions such as the one below whenever I try to take the new report:
"Two repeated jobs are already running"
It won't allow me to start the scheduler. Some of the existing schedules are running repeatedly. How can I find that particular scheduler and stop it in Quartz?
Related
I was wondering if is possible to configure quartz to execute a job under a dedicated worker thread. In another words, say I have quartz configured with a SimpleThreadPool of size 5. And I have a job that fires every 10 seconds, and i want a dedicated worker thread to run this job. Is there a way to configure quartz trigger|job|scheduler to do that?
Other workers in thread pool may free to execute any others jobs scheduled.
I want that specific job execute with no time waiting, if other workers are busy.
When scheduling a task in Quartz, you have the ability to set misfires and rescheduling. This could be used in the example scenario whereby there is a job that runs every 30 mins, and potentially there could be a backlog and and the job would execute for longer than 30 mins. To prevent the same job running twice you could use the #DisallowConcurrentExecution. Once complete the job would then execute the second instance that is queued by using simpleSchedule().withMisfireHandlingInstructionNowWithExistingCount().
Now in Spring Scheduler there doesn't appear to be this fine grained ability, with just the fixed-rate and fixed-delay options to schedule it every 30 mins or wait 30 mins after the previous job completed. Without using the hammer route of restricting to a single thread, as I want to increase the thread count for other batch jobs to run concurrently, what would be the best method of recreating the Quartz behaviour?
So it looks like with the basic Spring Scheduler there isn't such a mechanism. To do this either use the Spring Quartz Scheduler, or Quartz directly.
Do java Quartz Scheduler support Asynchronous job scheduling.If so,is it by default or have to customize jobs to run asynchronously.
Not only it supports this behaviour but there is basically no other way. Once you schedule a job and a trigger (in any thread) this job will be executed asynchronously in a thread pool. You have some control over that thread pool like the number of threads.
Another issue is parallel execution of the same job. By default the same job can run in multiple threads started by different threads, unless the job is stateful.
Yes and it should be by default. I am using Quartz in my Grails application for my website and it spins off new threads for each job.
I was wondering if it was possible to schedule a job to start after a job fired by a CronTrigger successfully completes, using Quartz in Java?
From the feature Documentation:
As Jobs are completed, they return a
JobCompletionCode which informs the
scheduler of success or failure. The
JobCompletionCode can also instruct
the scheduler of any actions it should
take based on the success/fail code -
such as immediate re-execution of the
Job.
I think the JobChainingJobListener should be interesting:
Keeps a collection of mappings of which Job to trigger after the completion of a given job.
This is assuming you use the CronJob from quartz of course.
Otherwise you'd need to program (in java) some kind of socket listener, and wrap the cron job in a script which, at the end, triggers Java by writing something on the socket (or pipe, or web service call, whatever you like). Your java code would then trigger the quartz job.
I am using quartz scheduler in my spring project. I have to run a job after another job which is scheduled to run in every 15 mins? I cant run this job concurrently as both of this jobs have to access same mail account using different protocols(one to send:smtp and other to receive: imap) and it may cause problems. Please reply quickly, as its an urgent requirement.
Just write a wrapper job class that launches second job after the first. You could then reuse separate jobs in the future if there will be any necessity.
You could do something with writing a job listener to recognize when the first job ends, and have it start the second. But the solution first suggested by mindas is easier - wrap both your jobs in another Job implementation, which is the one you actually schedule.