Hi All,

When using the Scheduler Module (1.0.0) together with Quartz (2.2.1) and start 
more than one job at the same second, I’m getting 
ConcurrentModificationExceptions.

This behavior can be reproduced with the following code snippet:


package de.rb.sandbox;


import javax.enterprise.context.ApplicationScoped;

import javax.enterprise.context.SessionScoped;


import org.apache.deltaspike.cdise.api.CdiContainer;

import org.apache.deltaspike.cdise.api.CdiContainerLoader;

import org.apache.deltaspike.cdise.api.ContextControl;

import org.apache.deltaspike.scheduler.api.Scheduled;

import org.junit.After;

import org.junit.Assert;

import org.junit.Before;

import org.junit.Test;

import org.quartz.Job;

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;


public class SchedulerTest extends Assert {


private CdiContainer cdiContainer;


@Before

public void setUp() {

cdiContainer = CdiContainerLoader.getCdiContainer();

cdiContainer.boot();


ContextControl contextControl = cdiContainer.getContextControl();

contextControl.startContext(ApplicationScoped.class);

}


@After

public void tearDown() {

cdiContainer.shutdown();

}


// runs every second

@Scheduled(cronExpression = "0/1 * * * * ?", startScopes = { 
SessionScoped.class })

public static class Job1 implements Job {

public void execute(JobExecutionContext context) throws JobExecutionException {

System.out.println("Job1");


}

}


// runs every 2 seconds

@Scheduled(cronExpression = "0/2 * * * * ?", startScopes = { 
SessionScoped.class })

public static class Job2 implements Job {

public void execute(JobExecutionContext context) throws JobExecutionException {

System.out.println("Job1");

}

}


@Test

public void testIt() throws Exception {

// run for a minute

Thread.sleep(60000);

}

}

Produces something like:


Job1

ERROR 2678  2014-07-03 12:10:42,714 [DefaultQuartzScheduler_Worker-1] 
org.quartz.core.ErrorLogger.schedulerError(2425) - Unable to notify 
JobListener(s) of Job to be executed: (Job will NOT be executed!). trigger= 
DEFAULT.6da64b5bd2ee-8e6928dd-89fe-47aa-a620-cb3b80f36aa6 job= DEFAULT.Job1

org.quartz.SchedulerException: JobListener 
'org.apache.deltaspike.scheduler.impl.QuartzScheduler$InjectionAwareJobListener'
 threw exception: null

at 
org.quartz.core.QuartzScheduler.notifyJobListenersToBeExecuted(QuartzScheduler.java:1947)
 ~[quartz-2.2.1.jar:na]

at org.quartz.core.JobRunShell.notifyListenersBeginning(JobRunShell.java:324) 
[quartz-2.2.1.jar:na]

at org.quartz.core.JobRunShell.run(JobRunShell.java:173) [quartz-2.2.1.jar:na]

at 
org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) 
[quartz-2.2.1.jar:na]

Caused by: java.util.ConcurrentModificationException: null

at java.util.Vector$Itr.checkForComodification(Vector.java:1156) ~[na:1.7.0_60]

at java.util.Vector$Itr.next(Vector.java:1133) ~[na:1.7.0_60]

at 
org.apache.deltaspike.scheduler.impl.QuartzScheduler$InjectionAwareJobListener.jobToBeExecuted(QuartzScheduler.java:370)
 ~[deltaspike-scheduler-module-impl-1.0.0.jar:1.0.0]

at 
org.quartz.core.QuartzScheduler.notifyJobListenersToBeExecuted(QuartzScheduler.java:1945)
 ~[quartz-2.2.1.jar:na]

... 3 common frames omitted

ERROR 2678  2014-07-03 12:10:42,714 [DefaultQuartzScheduler_Worker-2] 
org.quartz.core.ErrorLogger.schedulerError(2425) - Unable to notify 
JobListener(s) of Job to be executed: (Job will NOT be executed!). trigger= 
DEFAULT.6da64b5bd2ee-8e6928dd-89fe-47aa-a620-cb3b80f36aa6 job= DEFAULT.Job1

org.quartz.SchedulerException: JobListener 
'org.apache.deltaspike.scheduler.impl.QuartzScheduler$InjectionAwareJobListener'
 threw exception: null

at 
org.quartz.core.QuartzScheduler.notifyJobListenersToBeExecuted(QuartzScheduler.java:1947)
 ~[quartz-2.2.1.jar:na]

at org.quartz.core.JobRunShell.notifyListenersBeginning(JobRunShell.java:324) 
[quartz-2.2.1.jar:na]

at org.quartz.core.JobRunShell.run(JobRunShell.java:173) [quartz-2.2.1.jar:na]

at 
org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) 
[quartz-2.2.1.jar:na]

Caused by: java.util.ConcurrentModificationException: null

at java.util.Vector$Itr.checkForComodification(Vector.java:1156) ~[na:1.7.0_60]

at java.util.Vector$Itr.next(Vector.java:1133) ~[na:1.7.0_60]

at 
org.apache.deltaspike.scheduler.impl.QuartzScheduler$InjectionAwareJobListener.jobToBeExecuted(QuartzScheduler.java:370)
 ~[deltaspike-scheduler-module-impl-1.0.0.jar:1.0.0]

at 
org.quartz.core.QuartzScheduler.notifyJobListenersToBeExecuted(QuartzScheduler.java:1945)
 ~[quartz-2.2.1.jar:na]

... 3 common frames omitted

Job1


<and so on…>

The only way to omit the concurrency problems is to limit the scheduled scope 
to none:


@Scheduled(cronExpression = "0/1 * * * * ?", startScopes = {})

But this might not be intended.

Could you please help?

Thanks in advance.

Robert

Reply via email to