Are Quartz jobs running in the same JVM in their own threads? - java

Quartz scheduler is used to schedule timed java jobs at my workplace. The scheduler itself is deployed as an application to a Weblogic servers (a cluster of machines). This scheduler can schedule jobs which implement the Job interface and override the execute() method. These jobs are deployed to the Weblogic servers as libraries which are then used by the scheduler. (One library includes multiple jobs.)
I have not managed to find informative sources on how these jobs are run or how they share resources.
I looked at the Quartz documentation but could not find what I was looking for.
I have multiple questions, though I believe a single answer may cover all of them.
Do all the jobs created through the scheduler share a single JVM? If they don't, then based on what is a job allocated to a given JVM?
I assume that a separate thread is allocated to each job - is that correct?
If all scheduled jobs run in the same JVM and each has its own thread, then concurrent execution of the same job with different parameters will create a need for making the job thread safe or a need to disable concurrent execution of the job, will not it?
Thank you.

You may want to read Quartz scheduler tutorial to find out how Quartz works. To answer your questions:
This depends on whether you run a Quartz scheduler cluster (i.e. multiple Quartz scheduler instances sharing the same job store) or a standalone Quartz scheduler instance. In clustered deployments, individual Quartz scheduler instances compete to execute jobs by creating DB row locks. The scheduler instance that first manages to create the row lock, is the scheduler instance that executes a particular job. In a standalone Quartz scheduler deployment, the completion does not exist and it is always the single Quartz scheduler instance that ends up executing all jobs.
Quartz uses a thread pool and when it needs to execute a job, it simply allocates a free thread from the pool and uses it to execute the job. After the job finishes executing, Quartz returns the thread back to the pool.
Instances of Quartz job implementation classes are not shared. That means, when Quartz is about to execute a job, it instantiates the configured org.quartz.Job class and invokes its execute method passing it the job execution context as a parameter. Once the job execution completes, the org.quartz.Job instance is discarded and eventually garbage-collected, i.e. it is not reused by Quartz. If your org.quartz.Job class declares / accesses some static fields, singletons etc., then you may need to synchronize access to these shared resources where necessary.

Related

Quartz Scheduler- How to use exclusive resources?

I am investigating whether or not Quartz can be used for a project I am working on. I need to:
Limit the execution of jobs to specific time ranges (which I know Quartz is great at).
Limit jobs based on "resources".
When I say resources, I referring to both exclusive and quantitative resources. For example, I would like to define a resource something like "LINUX_MACHINE" with a count of 5. Only a maximum of 5 jobs requiring the LINUX_MACHINE machine resource can be run at any one time. Is this possible to do using Quartz?
So it looks like you can limit jobs based on resources by creating multiple schedulers and then limiting the thread pool for each scheduler.
Info on multiple schedulers: http://www.quartz-scheduler.org/documentation/quartz-2.2.x/cookbook/MultipleSchedulers
Info on Quartz config to set the thread pool for the scheduler: http://www.quartz-scheduler.org/documentation/quartz-2.2.x/configuration/ConfigThreadPool

How to set a dedicated quartz worker thread for a specific job?

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.

Difference between Quartz Thread Pool and Task Executor

I'm working in Spring-quartz batch. I'm trying to implement Multi-threading for the Batch application.
I come across 2 possible way of multi threading,
Use Quartz Thread pool
Use Task Executors.
I used Quartz thread pool and it is working fine but was wondering what the advantage i will get if i also implement task Executor.
I'm doing all this as xml configuration.
Please suggest me which should be used and what is the benefit of one over the other.
Thanks
I would choose task executors if all you need is to keep N workers picking pieces of work from the common queue. The advantage is that you do not need any external libraries for this. Quartz thread pool was created before Java 5 - that is why it exists.
Executor is good enough for running concurrent tasks within a JVM. But if you want to distribute tasks across multiple JVMs in a clustered environment, then you should explore Quartz using the JDBC Store.
Quartz is more of a scheduling framework where you can setup jobs to run on a periodic basis. But I have also used it heavily for concurrent programming.

Asynchronous job scheduling in Quartz

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.

Quartz scheduler - Is it possible to configure Quartz to allow jobs with the same identification in RAMJobStore?

I'm using Quartz together with Spring. The JobStore that I'm using is the RAMJobStore.
I create a couple of jobs with the same identification (they have the same instance definition (JobDetail)). Because I want to make sure that these jobs aren't executed in parallel, I annotated their job class with #DisallowConcurrentExecution.
My problem is that the RAMJobStore doesn't allow more than one job with the same identification in the same time in the store, so when I try to add the job I get the exception:
org.quartz.ObjectAlreadyExistsException: Unable to store Job :
'jobX', because one already exists with this identification.
Do you have any idea about how I can overcome this problem?
Thanks a lot!
If you have two different jobs that are running on two different triggers, then I'm not aware of any Quartz annotations that would prevent the two jobs from running in parallel. You could reference the Scheduler instance in each of the jobs to determine if the other job is executing. Then you could pause or reschedule jobs to prevent them from running in parallel.
It is clear from the RAMJobStore source code that there can't be two jobs with the same key in the same time in the RAMJobStore.
Have a look here at the source code.

Categories

Resources