You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltaspike.apache.org by gp...@apache.org on 2013/12/20 15:50:36 UTC

[1/2] git commit: DELTASPIKE-474 deactivatable services

Updated Branches:
  refs/heads/master 3b6277460 -> edbdaa8e6


DELTASPIKE-474 deactivatable services


Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/f216f036
Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/f216f036
Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/f216f036

Branch: refs/heads/master
Commit: f216f03671a16520be543597a8b48862cfd37c57
Parents: 3b62774
Author: gpetracek <gp...@apache.org>
Authored: Fri Dec 20 14:45:15 2013 +0100
Committer: gpetracek <gp...@apache.org>
Committed: Fri Dec 20 15:01:47 2013 +0100

----------------------------------------------------------------------
 .../deltaspike/core/util/ServiceUtils.java      | 36 +++++++++++++++++++-
 1 file changed, 35 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/deltaspike/blob/f216f036/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/ServiceUtils.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/ServiceUtils.java b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/ServiceUtils.java
index 0c1b994..92fa6c4 100644
--- a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/ServiceUtils.java
+++ b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/ServiceUtils.java
@@ -18,11 +18,14 @@
  */
 package org.apache.deltaspike.core.util;
 
+import org.apache.deltaspike.core.spi.activation.Deactivatable;
+
 import javax.enterprise.inject.Typed;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.ServiceLoader;
+import java.util.logging.Logger;
 
 /**
  * Allows handling the lookup (with fallbacks) in a central place.
@@ -31,6 +34,8 @@ import java.util.ServiceLoader;
 @Typed()
 public abstract class ServiceUtils
 {
+    private static final Logger LOG = Logger.getLogger(ServiceUtils.class.getName());
+
     private ServiceUtils()
     {
         // prevent instantiation
@@ -38,6 +43,12 @@ public abstract class ServiceUtils
 
     public static <T> List<T> loadServiceImplementations(Class<T> serviceType)
     {
+        return loadServiceImplementations(serviceType, false);
+    }
+
+    public static <T> List<T> loadServiceImplementations(Class<T> serviceType,
+                                                         boolean ignoreServicesWithMissingDependencies)
+    {
         List<T> result = new ArrayList<T>();
 
         Iterator<T> servicesIterator = ServiceLoader.load(serviceType).iterator();
@@ -50,7 +61,30 @@ public abstract class ServiceUtils
 
         while (servicesIterator.hasNext())
         {
-            result.add(servicesIterator.next());
+            try
+            {
+                T service = servicesIterator.next();
+
+                if (service instanceof Deactivatable &&
+                        !ClassDeactivationUtils.isActivated((Class<? extends Deactivatable>) service.getClass()))
+                {
+                    LOG.info("deactivated service: " + service.getClass().getName());
+
+                    continue;
+                }
+                result.add(service);
+            }
+            catch (Throwable t)
+            {
+                if (!ignoreServicesWithMissingDependencies)
+                {
+                    throw ExceptionUtils.throwAsRuntimeException(t);
+                }
+                else
+                {
+                    LOG.info("service filtered - caused by " + t.getMessage());
+                }
+            }
         }
         return result;
     }


[2/2] git commit: DELTASPIKE-475 @Scheduled (first draft)

Posted by gp...@apache.org.
DELTASPIKE-475 @Scheduled (first draft)


Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/edbdaa8e
Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/edbdaa8e
Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/edbdaa8e

Branch: refs/heads/master
Commit: edbdaa8e6fac4686b407086c8f6d48c9ced892ab
Parents: f216f03
Author: gpetracek <gp...@apache.org>
Authored: Fri Dec 20 14:43:57 2013 +0100
Committer: gpetracek <gp...@apache.org>
Committed: Fri Dec 20 15:47:41 2013 +0100

----------------------------------------------------------------------
 deltaspike/modules/pom.xml                      |   1 +
 deltaspike/modules/scheduler/api/pom.xml        |  78 +++++
 .../deltaspike/scheduler/api/Scheduled.java     |  45 +++
 .../deltaspike/scheduler/spi/Scheduler.java     |  40 +++
 .../api/src/main/resources/META-INF/beans.xml   |  23 ++
 deltaspike/modules/scheduler/impl/pom.xml       | 147 ++++++++++
 .../scheduler/impl/QuartzScheduler.java         | 287 +++++++++++++++++++
 .../scheduler/impl/SchedulerExtension.java      | 192 +++++++++++++
 .../scheduler/impl/SchedulerProducer.java       |  39 +++
 .../impl/src/main/resources/META-INF/beans.xml  |  23 ++
 .../javax.enterprise.inject.spi.Extension       |  20 ++
 ...rg.apache.deltaspike.scheduler.spi.Scheduler |  20 ++
 deltaspike/modules/scheduler/pom.xml            |  40 +++
 deltaspike/parent/pom.xml                       |  14 +
 14 files changed, 969 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/deltaspike/blob/edbdaa8e/deltaspike/modules/pom.xml
----------------------------------------------------------------------
diff --git a/deltaspike/modules/pom.xml b/deltaspike/modules/pom.xml
index 3049707..9755231 100644
--- a/deltaspike/modules/pom.xml
+++ b/deltaspike/modules/pom.xml
@@ -42,6 +42,7 @@
         <module>partial-bean</module>
         <module>bean-validation</module>
         <module>data</module>
+        <module>scheduler</module>
         <module>test-control</module>
     </modules>
 </project>

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/edbdaa8e/deltaspike/modules/scheduler/api/pom.xml
----------------------------------------------------------------------
diff --git a/deltaspike/modules/scheduler/api/pom.xml b/deltaspike/modules/scheduler/api/pom.xml
new file mode 100644
index 0000000..93af6e0
--- /dev/null
+++ b/deltaspike/modules/scheduler/api/pom.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.deltaspike.modules</groupId>
+        <artifactId>scheduler-module-project</artifactId>
+        <version>0.6-SNAPSHOT</version>
+    </parent>
+
+    <groupId>org.apache.deltaspike.modules</groupId>
+    <artifactId>deltaspike-scheduler-module-api</artifactId>
+    <packaging>bundle</packaging>
+
+    <name>Apache DeltaSpike Scheduler-Module API</name>
+
+    <properties>
+        <deltaspike.osgi.export.pkg>
+            org.apache.deltaspike.scheduler.*
+        </deltaspike.osgi.export.pkg>
+        <deltaspike.osgi.import>
+            javax.enterprise.inject,
+            !org.apache.deltaspike.scheduler.*,
+            *
+        </deltaspike.osgi.import>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.deltaspike.core</groupId>
+            <artifactId>deltaspike-core-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.deltaspike.cdictrl</groupId>
+            <artifactId>deltaspike-cdictrl-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <inherited>true</inherited>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+
+                <executions>
+                    <execution>
+                        <id>attach-sources</id>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/edbdaa8e/deltaspike/modules/scheduler/api/src/main/java/org/apache/deltaspike/scheduler/api/Scheduled.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/scheduler/api/src/main/java/org/apache/deltaspike/scheduler/api/Scheduled.java b/deltaspike/modules/scheduler/api/src/main/java/org/apache/deltaspike/scheduler/api/Scheduled.java
new file mode 100644
index 0000000..6732e5a
--- /dev/null
+++ b/deltaspike/modules/scheduler/api/src/main/java/org/apache/deltaspike/scheduler/api/Scheduled.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.deltaspike.scheduler.api;
+
+import javax.enterprise.context.RequestScoped;
+import javax.enterprise.context.SessionScoped;
+import java.lang.annotation.Annotation;
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+@Target({ TYPE })
+@Retention(RUNTIME)
+@Documented
+public @interface Scheduled
+{
+    String cronExpression();
+
+    Class<? extends Annotation>[] startScopes() default { SessionScoped.class, RequestScoped.class };
+
+    Class group() default Scheduled.class; //type-safe group
+
+    String description() default "";
+
+    boolean onStartup() default true; //use false to schedule it manually (after the bootstrapping-process)
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/edbdaa8e/deltaspike/modules/scheduler/api/src/main/java/org/apache/deltaspike/scheduler/spi/Scheduler.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/scheduler/api/src/main/java/org/apache/deltaspike/scheduler/spi/Scheduler.java b/deltaspike/modules/scheduler/api/src/main/java/org/apache/deltaspike/scheduler/spi/Scheduler.java
new file mode 100644
index 0000000..11560ac
--- /dev/null
+++ b/deltaspike/modules/scheduler/api/src/main/java/org/apache/deltaspike/scheduler/spi/Scheduler.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.deltaspike.scheduler.spi;
+
+import org.apache.deltaspike.core.spi.activation.Deactivatable;
+
+public interface Scheduler<T> extends Deactivatable
+{
+    void start();
+
+    void stop();
+
+    void pauseJob(Class<? extends T> jobClass);
+
+    void resumeJob(Class<? extends T> jobClass);
+
+    void interruptJob(Class<? extends T> jobClass);
+
+    boolean isExecutingJob(Class<? extends T> jobClass);
+
+    void registerNewJob(Class<? extends T> jobClass);
+
+    void startJobManually(Class<? extends T> jobClass);
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/edbdaa8e/deltaspike/modules/scheduler/api/src/main/resources/META-INF/beans.xml
----------------------------------------------------------------------
diff --git a/deltaspike/modules/scheduler/api/src/main/resources/META-INF/beans.xml b/deltaspike/modules/scheduler/api/src/main/resources/META-INF/beans.xml
new file mode 100644
index 0000000..4070730
--- /dev/null
+++ b/deltaspike/modules/scheduler/api/src/main/resources/META-INF/beans.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+-->
+<beans xmlns="http://java.sun.com/xml/ns/javaee"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
+</beans>

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/edbdaa8e/deltaspike/modules/scheduler/impl/pom.xml
----------------------------------------------------------------------
diff --git a/deltaspike/modules/scheduler/impl/pom.xml b/deltaspike/modules/scheduler/impl/pom.xml
new file mode 100644
index 0000000..83bb92e
--- /dev/null
+++ b/deltaspike/modules/scheduler/impl/pom.xml
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.deltaspike.modules</groupId>
+        <artifactId>scheduler-module-project</artifactId>
+        <version>0.6-SNAPSHOT</version>
+    </parent>
+
+    <groupId>org.apache.deltaspike.modules</groupId>
+    <artifactId>deltaspike-scheduler-module-impl</artifactId>
+    <packaging>bundle</packaging>
+
+    <name>Apache DeltaSpike Scheduler-Module Impl</name>
+
+    <properties>
+        <deltaspike.osgi.export.pkg>
+            org.apache.deltaspike.scheduler.impl.*
+        </deltaspike.osgi.export.pkg>
+        <deltaspike.osgi.import>
+            !org.apache.deltaspike.scheduler.impl.*,
+            *
+        </deltaspike.osgi.import>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.deltaspike.modules</groupId>
+            <artifactId>deltaspike-scheduler-module-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.deltaspike.cdictrl</groupId>
+            <artifactId>deltaspike-cdictrl-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.quartz-scheduler</groupId>
+            <artifactId>quartz</artifactId>
+            <version>[2.0.0,)</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-el_2.2_spec</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-servlet_2.5_spec</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-logging</groupId>
+            <artifactId>commons-logging</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <inherited>true</inherited>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+
+                <executions>
+                    <execution>
+                        <id>attach-sources</id>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>OWB</id>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>org.apache.openwebbeans</groupId>
+                    <artifactId>openwebbeans-impl</artifactId>
+                    <scope>test</scope>
+                </dependency>
+
+                <dependency>
+                    <groupId>org.apache.openwebbeans</groupId>
+                    <artifactId>openwebbeans-spi</artifactId>
+                    <scope>test</scope>
+                </dependency>
+
+                <dependency>
+                    <groupId>org.apache.deltaspike.cdictrl</groupId>
+                    <artifactId>deltaspike-cdictrl-owb</artifactId>
+                    <scope>test</scope>
+                </dependency>
+            </dependencies>
+        </profile>
+        <profile>
+            <id>Weld</id>
+            <dependencies>
+                <dependency>
+                    <groupId>org.apache.deltaspike.cdictrl</groupId>
+                    <artifactId>deltaspike-cdictrl-weld</artifactId>
+                    <scope>test</scope>
+                </dependency>
+
+                <dependency>
+                    <groupId>org.jboss.weld.se</groupId>
+                    <artifactId>weld-se</artifactId>
+                    <version>${weld.version}</version>
+                    <scope>test</scope>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
+
+</project>

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/edbdaa8e/deltaspike/modules/scheduler/impl/src/main/java/org/apache/deltaspike/scheduler/impl/QuartzScheduler.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/scheduler/impl/src/main/java/org/apache/deltaspike/scheduler/impl/QuartzScheduler.java b/deltaspike/modules/scheduler/impl/src/main/java/org/apache/deltaspike/scheduler/impl/QuartzScheduler.java
new file mode 100644
index 0000000..8507d71
--- /dev/null
+++ b/deltaspike/modules/scheduler/impl/src/main/java/org/apache/deltaspike/scheduler/impl/QuartzScheduler.java
@@ -0,0 +1,287 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.deltaspike.scheduler.impl;
+
+import org.apache.deltaspike.cdise.api.ContextControl;
+import org.apache.deltaspike.core.api.config.ConfigResolver;
+import org.apache.deltaspike.core.api.provider.BeanProvider;
+import org.apache.deltaspike.core.util.ExceptionUtils;
+import org.apache.deltaspike.scheduler.api.Scheduled;
+import org.apache.deltaspike.scheduler.spi.Scheduler;
+import org.quartz.CronScheduleBuilder;
+import org.quartz.Job;
+import org.quartz.JobBuilder;
+import org.quartz.JobDetail;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.quartz.JobKey;
+import org.quartz.JobListener;
+import org.quartz.SchedulerException;
+import org.quartz.SchedulerFactory;
+import org.quartz.Trigger;
+import org.quartz.TriggerBuilder;
+import org.quartz.impl.StdSchedulerFactory;
+
+import java.lang.annotation.Annotation;
+import java.util.Collections;
+import java.util.Stack;
+
+//vetoed class (see SchedulerExtension)
+public class QuartzScheduler implements Scheduler<Job>
+{
+    private org.quartz.Scheduler scheduler;
+
+    @Override
+    public void start()
+    {
+        if (this.scheduler != null)
+        {
+            throw new UnsupportedOperationException("the scheduler is started already");
+        }
+
+        SchedulerFactory schedulerFactory;
+        try
+        {
+            String configFile =
+                ConfigResolver.getPropertyValue("deltaspike.scheduler.quartz_config-file", "quartz.properties");
+            schedulerFactory = new StdSchedulerFactory(configFile);
+        }
+        catch (SchedulerException e)
+        {
+            schedulerFactory = new StdSchedulerFactory();
+        }
+
+        try
+        {
+            this.scheduler = schedulerFactory.getScheduler();
+            this.scheduler.getListenerManager().addJobListener(new InjectionAwareJobListener());
+
+            if (!this.scheduler.isStarted())
+            {
+                String delayedStart =
+                    ConfigResolver.getPropertyValue("deltaspike.scheduler.delayed_start_in_seconds", "1");
+                this.scheduler.startDelayed(Integer.parseInt(delayedStart));
+            }
+        }
+        catch (SchedulerException e)
+        {
+            throw ExceptionUtils.throwAsRuntimeException(e);
+        }
+    }
+
+    @Override
+    public void stop()
+    {
+        try
+        {
+            if (this.scheduler != null && this.scheduler.isStarted())
+            {
+                String forceStop = ConfigResolver.getPropertyValue("deltaspike.scheduler.force_stop", "true");
+
+                this.scheduler.shutdown(Boolean.parseBoolean(forceStop));
+                this.scheduler = null;
+            }
+        }
+        catch (SchedulerException e)
+        {
+            throw ExceptionUtils.throwAsRuntimeException(e);
+        }
+    }
+
+    @Override
+    public void registerNewJob(Class<? extends Job> jobClass)
+    {
+        JobKey jobKey = createJobKey(jobClass);
+
+        try
+        {
+            Scheduled scheduled = jobClass.getAnnotation(Scheduled.class);
+
+            String description = scheduled.description();
+
+            if ("".equals(scheduled.description()))
+            {
+                description = jobClass.getName();
+            }
+
+            JobDetail jobDetail = JobBuilder.newJob(jobClass)
+                    .withDescription(description)
+                    .withIdentity(jobKey)
+                    .build();
+            Trigger trigger = TriggerBuilder.newTrigger()
+                    .withSchedule(CronScheduleBuilder.cronSchedule(scheduled.cronExpression()))
+                    .build();
+
+            this.scheduler.scheduleJob(jobDetail, trigger);
+        }
+        catch (SchedulerException e)
+        {
+            throw ExceptionUtils.throwAsRuntimeException(e);
+        }
+    }
+
+    @Override
+    public void startJobManually(Class<? extends Job> jobClass)
+    {
+        try
+        {
+            this.scheduler.triggerJob(createJobKey(jobClass));
+        }
+        catch (SchedulerException e)
+        {
+            throw ExceptionUtils.throwAsRuntimeException(e);
+        }
+    }
+
+    @Override
+    public void interruptJob(Class<? extends Job> jobClass)
+    {
+        try
+        {
+            this.scheduler.interrupt(createJobKey(jobClass));
+        }
+        catch (SchedulerException e)
+        {
+            throw ExceptionUtils.throwAsRuntimeException(e);
+        }
+    }
+
+    @Override
+    public void pauseJob(Class<? extends Job> jobClass)
+    {
+        try
+        {
+            this.scheduler.pauseJob(createJobKey(jobClass));
+        }
+        catch (SchedulerException e)
+        {
+            throw ExceptionUtils.throwAsRuntimeException(e);
+        }
+    }
+
+    @Override
+    public void resumeJob(Class<? extends Job> jobClass)
+    {
+        try
+        {
+            this.scheduler.resumeJob(createJobKey(jobClass));
+        }
+        catch (SchedulerException e)
+        {
+            throw ExceptionUtils.throwAsRuntimeException(e);
+        }
+    }
+
+    @Override
+    public boolean isExecutingJob(Class<? extends Job> jobClass)
+    {
+        try
+        {
+            JobKey jobKey = createJobKey(jobClass);
+            JobDetail jobDetail = this.scheduler.getJobDetail(jobKey);
+
+            if (jobDetail == null)
+            {
+                return false;
+            }
+
+            for (JobExecutionContext jobExecutionContext : this.scheduler.getCurrentlyExecutingJobs())
+            {
+                if (jobKey.equals(jobExecutionContext.getJobDetail().getKey()))
+                {
+                    return true;
+                }
+            }
+
+            return false;
+        }
+        catch (SchedulerException e)
+        {
+            throw ExceptionUtils.throwAsRuntimeException(e);
+        }
+    }
+
+    private static JobKey createJobKey(Class<?> jobClass)
+    {
+        Scheduled scheduled = jobClass.getAnnotation(Scheduled.class);
+
+        if (scheduled == null)
+        {
+            throw new IllegalStateException("@" + Scheduled.class.getName() + " is missing on " + jobClass.getName());
+        }
+
+        String groupName = scheduled.group().getSimpleName();
+        String jobName = jobClass.getSimpleName();
+
+        if (!Scheduled.class.getSimpleName().equals(groupName))
+        {
+            return new JobKey(jobName, groupName);
+        }
+        return new JobKey(jobName);
+    }
+
+    private class InjectionAwareJobListener implements JobListener
+    {
+        private Stack<Class<? extends Annotation>> scopes = new Stack<Class<? extends Annotation>>();
+        private ContextControl contextControl;
+
+        @Override
+        public String getName()
+        {
+            return getClass().getName();
+        }
+
+        @Override
+        public void jobToBeExecuted(JobExecutionContext context)
+        {
+            Scheduled scheduled = context.getJobInstance().getClass().getAnnotation(Scheduled.class);
+
+            Collections.addAll(this.scopes, scheduled.startScopes());
+
+            this.contextControl = BeanProvider.getContextualReference(ContextControl.class);
+
+            for (Class<? extends Annotation> scopeAnnotation : this.scopes)
+            {
+                contextControl.startContext(scopeAnnotation);
+            }
+
+            BeanProvider.injectFields(context.getJobInstance());
+        }
+
+        @Override
+        public void jobExecutionVetoed(JobExecutionContext context)
+        {
+            stopStartedScopes();
+        }
+
+        @Override
+        public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException)
+        {
+            stopStartedScopes();
+        }
+
+        private void stopStartedScopes()
+        {
+            while (!this.scopes.empty())
+            {
+                this.contextControl.stopContext(this.scopes.pop());
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/edbdaa8e/deltaspike/modules/scheduler/impl/src/main/java/org/apache/deltaspike/scheduler/impl/SchedulerExtension.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/scheduler/impl/src/main/java/org/apache/deltaspike/scheduler/impl/SchedulerExtension.java b/deltaspike/modules/scheduler/impl/src/main/java/org/apache/deltaspike/scheduler/impl/SchedulerExtension.java
new file mode 100644
index 0000000..bb1bcc9
--- /dev/null
+++ b/deltaspike/modules/scheduler/impl/src/main/java/org/apache/deltaspike/scheduler/impl/SchedulerExtension.java
@@ -0,0 +1,192 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.deltaspike.scheduler.impl;
+
+import org.apache.deltaspike.core.api.config.ConfigResolver;
+import org.apache.deltaspike.core.spi.activation.Deactivatable;
+import org.apache.deltaspike.core.util.ClassDeactivationUtils;
+import org.apache.deltaspike.core.util.ClassUtils;
+import org.apache.deltaspike.core.util.ServiceUtils;
+import org.apache.deltaspike.scheduler.api.Scheduled;
+import org.apache.deltaspike.scheduler.spi.Scheduler;
+
+import javax.enterprise.event.Observes;
+import javax.enterprise.inject.spi.AfterBeanDiscovery;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.BeforeBeanDiscovery;
+import javax.enterprise.inject.spi.BeforeShutdown;
+import javax.enterprise.inject.spi.Extension;
+import javax.enterprise.inject.spi.ProcessAnnotatedType;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Logger;
+
+public class SchedulerExtension implements Extension, Deactivatable
+{
+    private static final Logger LOG = Logger.getLogger(SchedulerExtension.class.getName());
+
+    private Boolean isActivated = true;
+
+    private List<Class> foundManagedJobClasses = new ArrayList<Class>();
+
+    private Scheduler scheduler;
+
+    private Class jobClass;
+
+    protected void init(@Observes BeforeBeanDiscovery beforeBeanDiscovery)
+    {
+        this.isActivated = ClassDeactivationUtils.isActivated(getClass());
+
+        if (this.isActivated)
+        {
+            String jobClassName = ConfigResolver.getPropertyValue("deltaspike.scheduler.job-class", "org.quartz.Job");
+
+            this.jobClass = ClassUtils.tryToLoadClassForName(jobClassName);
+
+            if (this.jobClass == null)
+            {
+                this.isActivated = false;
+            }
+        }
+    }
+
+    public <X> void findScheduledJobs(@Observes ProcessAnnotatedType<X> pat, BeanManager beanManager)
+    {
+        if (!this.isActivated)
+        {
+            return;
+        }
+
+        Class<X> beanClass = pat.getAnnotatedType().getJavaClass();
+
+        //see SchedulerProducer
+        if (Scheduler.class.isAssignableFrom(beanClass))
+        {
+            pat.veto();
+            return;
+        }
+
+        if (!jobClass.isAssignableFrom(beanClass))
+        {
+            return;
+        }
+
+        Scheduled scheduled = pat.getAnnotatedType().getAnnotation(Scheduled.class);
+        if (scheduled != null && scheduled.onStartup())
+        {
+            this.foundManagedJobClasses.add(beanClass);
+        }
+    }
+
+    public <X> void scheduleJobs(@Observes AfterBeanDiscovery afterBeanDiscovery, BeanManager beanManager)
+    {
+        if (!this.isActivated)
+        {
+            return;
+        }
+
+        initScheduler(afterBeanDiscovery);
+
+        if (this.scheduler == null)
+        {
+            return;
+        }
+
+
+        List<String> foundJobNames = new ArrayList<String>();
+
+        for (Class jobClass : this.foundManagedJobClasses)
+        {
+            if (foundJobNames.contains(jobClass.getSimpleName()))
+            {
+                afterBeanDiscovery.addDefinitionError(
+                    new IllegalStateException("Multiple Job-Classes found with name " + jobClass.getSimpleName()));
+            }
+
+            foundJobNames.add(jobClass.getSimpleName());
+            this.scheduler.registerNewJob(jobClass);
+        }
+    }
+
+    public <X> void stopScheduler(@Observes BeforeShutdown beforeShutdown)
+    {
+        if (!this.isActivated)
+        {
+            return;
+        }
+
+        if (this.scheduler != null)
+        {
+            this.scheduler.stop();
+            this.scheduler = null;
+        }
+    }
+
+    private void initScheduler(AfterBeanDiscovery afterBeanDiscovery)
+    {
+        List<Scheduler> availableSchedulers = ServiceUtils.loadServiceImplementations(Scheduler.class, true);
+
+        this.scheduler = findScheduler(availableSchedulers, this.jobClass);
+
+        if (this.scheduler != null)
+        {
+            try
+            {
+                this.scheduler.start();
+            }
+            catch (Throwable t)
+            {
+                afterBeanDiscovery.addDefinitionError(t);
+            }
+        }
+        else if (this.foundManagedJobClasses.size() > 0)
+        {
+            LOG.warning(
+                this.foundManagedJobClasses.size() + " scheduling-jobs found, but there is no configured scheduler");
+        }
+    }
+
+    private static Scheduler findScheduler(List<Scheduler> availableSchedulers, Class jobClass)
+    {
+        for (Scheduler scheduler : availableSchedulers)
+        {
+            for (Type interfaceClass : scheduler.getClass().getGenericInterfaces())
+            {
+                if (!(interfaceClass instanceof ParameterizedType) ||
+                        !Scheduler.class.isAssignableFrom((Class)((ParameterizedType)interfaceClass).getRawType()))
+                {
+                    continue;
+                }
+
+                if (jobClass.isAssignableFrom(((Class)((ParameterizedType)interfaceClass).getActualTypeArguments()[0])))
+                {
+                    return scheduler;
+                }
+            }
+        }
+        return null;
+    }
+
+    Scheduler getScheduler()
+    {
+        return scheduler;
+    }
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/edbdaa8e/deltaspike/modules/scheduler/impl/src/main/java/org/apache/deltaspike/scheduler/impl/SchedulerProducer.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/scheduler/impl/src/main/java/org/apache/deltaspike/scheduler/impl/SchedulerProducer.java b/deltaspike/modules/scheduler/impl/src/main/java/org/apache/deltaspike/scheduler/impl/SchedulerProducer.java
new file mode 100644
index 0000000..9b2bed0
--- /dev/null
+++ b/deltaspike/modules/scheduler/impl/src/main/java/org/apache/deltaspike/scheduler/impl/SchedulerProducer.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.deltaspike.scheduler.impl;
+
+import org.apache.deltaspike.scheduler.spi.Scheduler;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
+
+@ApplicationScoped
+public class SchedulerProducer
+{
+    @Inject
+    private SchedulerExtension schedulerExtension;
+
+    @Produces
+    @ApplicationScoped
+    protected Scheduler produceScheduler()
+    {
+        return this.schedulerExtension.getScheduler();
+    }
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/edbdaa8e/deltaspike/modules/scheduler/impl/src/main/resources/META-INF/beans.xml
----------------------------------------------------------------------
diff --git a/deltaspike/modules/scheduler/impl/src/main/resources/META-INF/beans.xml b/deltaspike/modules/scheduler/impl/src/main/resources/META-INF/beans.xml
new file mode 100644
index 0000000..4070730
--- /dev/null
+++ b/deltaspike/modules/scheduler/impl/src/main/resources/META-INF/beans.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+-->
+<beans xmlns="http://java.sun.com/xml/ns/javaee"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
+</beans>

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/edbdaa8e/deltaspike/modules/scheduler/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
----------------------------------------------------------------------
diff --git a/deltaspike/modules/scheduler/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension b/deltaspike/modules/scheduler/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
new file mode 100644
index 0000000..b2ad72a
--- /dev/null
+++ b/deltaspike/modules/scheduler/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
@@ -0,0 +1,20 @@
+#####################################################################################
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#####################################################################################
+
+org.apache.deltaspike.scheduler.impl.SchedulerExtension
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/edbdaa8e/deltaspike/modules/scheduler/impl/src/main/resources/META-INF/services/org.apache.deltaspike.scheduler.spi.Scheduler
----------------------------------------------------------------------
diff --git a/deltaspike/modules/scheduler/impl/src/main/resources/META-INF/services/org.apache.deltaspike.scheduler.spi.Scheduler b/deltaspike/modules/scheduler/impl/src/main/resources/META-INF/services/org.apache.deltaspike.scheduler.spi.Scheduler
new file mode 100644
index 0000000..cd752de
--- /dev/null
+++ b/deltaspike/modules/scheduler/impl/src/main/resources/META-INF/services/org.apache.deltaspike.scheduler.spi.Scheduler
@@ -0,0 +1,20 @@
+#####################################################################################
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#####################################################################################
+
+org.apache.deltaspike.scheduler.impl.QuartzScheduler
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/edbdaa8e/deltaspike/modules/scheduler/pom.xml
----------------------------------------------------------------------
diff --git a/deltaspike/modules/scheduler/pom.xml b/deltaspike/modules/scheduler/pom.xml
new file mode 100644
index 0000000..6bddcc3
--- /dev/null
+++ b/deltaspike/modules/scheduler/pom.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.deltaspike.modules</groupId>
+        <artifactId>modules-project</artifactId>
+        <version>0.6-SNAPSHOT</version>
+    </parent>
+
+    <groupId>org.apache.deltaspike.modules</groupId>
+    <artifactId>scheduler-module-project</artifactId>
+    <version>0.6-SNAPSHOT</version>
+    <packaging>pom</packaging>
+
+    <name>Apache DeltaSpike Scheduler-Module</name>
+
+    <modules>
+        <module>api</module>
+        <module>impl</module>
+    </modules>
+</project>

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/edbdaa8e/deltaspike/parent/pom.xml
----------------------------------------------------------------------
diff --git a/deltaspike/parent/pom.xml b/deltaspike/parent/pom.xml
index 12b69a3..d63dd09 100644
--- a/deltaspike/parent/pom.xml
+++ b/deltaspike/parent/pom.xml
@@ -564,6 +564,20 @@
 
             <dependency>
                 <groupId>org.apache.deltaspike.modules</groupId>
+                <artifactId>deltaspike-scheduler-module-api</artifactId>
+                <version>${project.version}</version>
+                <scope>compile</scope>
+            </dependency>
+
+            <dependency>
+                <groupId>org.apache.deltaspike.modules</groupId>
+                <artifactId>deltaspike-scheduler-module-impl</artifactId>
+                <version>${project.version}</version>
+                <scope>runtime</scope>
+            </dependency>
+
+            <dependency>
+                <groupId>org.apache.deltaspike.modules</groupId>
                 <artifactId>deltaspike-bean-validation-module-api</artifactId>
                 <version>${project.version}</version>
                 <scope>compile</scope>