You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@batchee.apache.org by rs...@apache.org on 2017/01/13 10:25:41 UTC
incubator-batchee git commit: BATCHEE-115 implemented portable
Job/StepContext
Repository: incubator-batchee
Updated Branches:
refs/heads/master 2be8d22fa -> f2136adfc
BATCHEE-115 implemented portable Job/StepContext
Project: http://git-wip-us.apache.org/repos/asf/incubator-batchee/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-batchee/commit/f2136adf
Tree: http://git-wip-us.apache.org/repos/asf/incubator-batchee/tree/f2136adf
Diff: http://git-wip-us.apache.org/repos/asf/incubator-batchee/diff/f2136adf
Branch: refs/heads/master
Commit: f2136adfc587d12d15a639c1290899d7672765e5
Parents: 2be8d22
Author: Reinhard Sandtner <rs...@apache.org>
Authored: Fri Jan 13 11:24:41 2017 +0100
Committer: Reinhard Sandtner <rs...@apache.org>
Committed: Fri Jan 13 11:24:41 2017 +0100
----------------------------------------------------------------------
extensions/cdi/pom.xml | 9 ++-
.../apache/batchee/cdi/impl/BaseContext.java | 31 ++++++++++
.../batchee/cdi/impl/BatchEEScopeExtension.java | 4 +-
.../batchee/cdi/impl/ContextResolver.java | 38 +++++++++++++
.../cdi/impl/DynamicContextResolver.java | 58 +++++++++++++++++++
.../apache/batchee/cdi/impl/JobContextImpl.java | 25 ++++----
.../batchee/cdi/impl/StepContextImpl.java | 19 +++----
.../cdi/impl/ThreadLocalContextResolver.java | 60 ++++++++++++++++++++
.../cdi/listener/AfterStepScopeListener.java | 4 ++
.../cdi/listener/BeforeJobScopeListener.java | 4 +-
.../cdi/listener/BeforeStepScopeListener.java | 15 +++--
.../org/apache/batchee/cdi/BatchScopesTest.java | 9 +++
.../PartitionedStepScopedReader.java | 45 +++++++++++++++
.../batch-jobs/partitioned-step-scoped.xml | 51 +++++++++++++++++
.../cdi/src/test/resources/batchee.properties | 1 -
15 files changed, 337 insertions(+), 36 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/f2136adf/extensions/cdi/pom.xml
----------------------------------------------------------------------
diff --git a/extensions/cdi/pom.xml b/extensions/cdi/pom.xml
index ab44f8c..28937ca 100644
--- a/extensions/cdi/pom.xml
+++ b/extensions/cdi/pom.xml
@@ -33,10 +33,17 @@
</properties>
<dependencies>
+ <!-- optional since we are protable and can be used with other jbatch implementations as well -->
+ <dependency>
+ <groupId>org.apache.batchee</groupId>
+ <artifactId>batchee-jbatch</artifactId>
+ <version>${project.version}</version>
+ <optional>true</optional>
+ </dependency>
+
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-servlet_3.0_spec</artifactId>
- <version>1.0</version>
<scope>test</scope>
</dependency>
http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/f2136adf/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/BaseContext.java
----------------------------------------------------------------------
diff --git a/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/BaseContext.java b/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/BaseContext.java
index 82abffc..c8fe047 100644
--- a/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/BaseContext.java
+++ b/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/BaseContext.java
@@ -16,25 +16,39 @@
*/
package org.apache.batchee.cdi.impl;
+import javax.batch.runtime.BatchRuntime;
import javax.enterprise.context.ContextNotActiveException;
import javax.enterprise.context.spi.Context;
import javax.enterprise.context.spi.Contextual;
import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.BeanManager;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
public abstract class BaseContext implements Context {
+
+ protected final BeanManager bm;
+
/**
* key == either the stepExecutionId or the jobExecutionId
*/
private ConcurrentMap<Long, ConcurrentMap<Contextual<?>, Instance<?>>> storages = new ConcurrentHashMap<Long, ConcurrentMap<Contextual<?>, Instance<?>>>();
+ private ContextResolver contextResolver;
+
+
+ public BaseContext(BeanManager bm) {
+ this.bm = bm;
+ }
+
+
/**
* @return current keys (we inherit contexts here) sorted by order (the last is the most specific)
*/
protected abstract Long currentKey();
+
@Override
public <T> T get(final Contextual<T> component, final CreationalContext<T> creationalContext) {
checkActive();
@@ -89,6 +103,23 @@ public abstract class BaseContext implements Context {
}
+ protected ContextResolver getContextResolver() {
+
+ // lazy initialisation to ensure BatchRuntime.getJobOperator()
+ // and all dependents are there and ready
+
+ if (contextResolver == null) {
+
+ if (BatchRuntime.getJobOperator().getClass().getName().contains("batchee")) {
+ contextResolver = new ThreadLocalContextResolver();
+ } else {
+ contextResolver = new DynamicContextResolver(bm);
+ }
+ }
+
+ return contextResolver;
+ }
+
private void checkActive() {
if (!isActive()) {
throw new ContextNotActiveException("CDI context with scope annotation @" + getScope().getName() + " is not active with respect to the current thread");
http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/f2136adf/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/BatchEEScopeExtension.java
----------------------------------------------------------------------
diff --git a/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/BatchEEScopeExtension.java b/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/BatchEEScopeExtension.java
index e872b9a..92b6d4a 100644
--- a/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/BatchEEScopeExtension.java
+++ b/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/BatchEEScopeExtension.java
@@ -27,8 +27,8 @@ public class BatchEEScopeExtension implements Extension {
private StepContextImpl stepContext;
void addBatchScopes(final @Observes AfterBeanDiscovery afterBeanDiscovery, final BeanManager bm) {
- jobContext = new JobContextImpl();
- stepContext = new StepContextImpl();
+ jobContext = new JobContextImpl(bm);
+ stepContext = new StepContextImpl(bm);
afterBeanDiscovery.addContext(jobContext);
afterBeanDiscovery.addContext(stepContext);
http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/f2136adf/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/ContextResolver.java
----------------------------------------------------------------------
diff --git a/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/ContextResolver.java b/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/ContextResolver.java
new file mode 100644
index 0000000..a18c4b9
--- /dev/null
+++ b/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/ContextResolver.java
@@ -0,0 +1,38 @@
+/*
+ * 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.batchee.cdi.impl;
+
+import javax.batch.runtime.context.JobContext;
+import javax.batch.runtime.context.StepContext;
+
+/**
+ * Provides methods to resolve {@link JobContext} and {@link StepContext}
+ * for setting up {@link JobContextImpl} and {@link StepContextImpl}.
+ */
+interface ContextResolver {
+
+ /**
+ * @return the current {@link JobContext} for this {@link Thread}
+ */
+ JobContext getJobContext();
+
+ /**
+ * @return the current {@link StepContext} for this {@link Thread}
+ */
+ StepContext getStepContext();
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/f2136adf/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/DynamicContextResolver.java
----------------------------------------------------------------------
diff --git a/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/DynamicContextResolver.java b/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/DynamicContextResolver.java
new file mode 100644
index 0000000..c9e64a4
--- /dev/null
+++ b/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/DynamicContextResolver.java
@@ -0,0 +1,58 @@
+/*
+ * 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.batchee.cdi.impl;
+
+import javax.batch.runtime.context.JobContext;
+import javax.batch.runtime.context.StepContext;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
+
+/**
+ * This implementation of {@link ContextResolver} is needed to enable BatchEE CDI-Scopes
+ * for other JBatch implementations then BatchEE.
+ * <p>
+ * It uses {@link BeanManager} for the current {@link JobContext} and {@link StepContext} lookup.
+ * <p>
+ * Every time a *Context is needed, it will be resolved via {@link BeanManager}.
+ */
+class DynamicContextResolver implements ContextResolver {
+
+ private final BeanManager bm;
+
+
+ DynamicContextResolver(BeanManager bm) {
+ this.bm = bm;
+ }
+
+
+ @Override
+ public JobContext getJobContext() {
+ return resolve(JobContext.class);
+ }
+
+ @Override
+ public StepContext getStepContext() {
+ return resolve(StepContext.class);
+ }
+
+
+ private <T> T resolve(Class<T> contextClass) {
+ Bean<?> bean = bm.resolve(bm.getBeans(contextClass));
+ return (T) bm.getReference(bean, contextClass, bm.createCreationalContext(bean));
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/f2136adf/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/JobContextImpl.java
----------------------------------------------------------------------
diff --git a/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/JobContextImpl.java b/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/JobContextImpl.java
index cfec9b2..79f51e5 100644
--- a/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/JobContextImpl.java
+++ b/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/JobContextImpl.java
@@ -24,13 +24,18 @@ import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicInteger;
import javax.enterprise.inject.Typed;
-
+import javax.enterprise.inject.spi.BeanManager;
@Typed
public class JobContextImpl extends BaseContext {
private ConcurrentMap<Long, AtomicInteger> jobReferences = new ConcurrentHashMap<Long, AtomicInteger>();
- private ThreadLocal<Long> currentJobExecutionId = new ThreadLocal<Long>();
+
+
+ JobContextImpl(BeanManager bm) {
+ super(bm);
+ }
+
@Override
public Class<? extends Annotation> getScope() {
@@ -39,11 +44,14 @@ public class JobContextImpl extends BaseContext {
@Override
protected Long currentKey() {
- return currentJobExecutionId.get();
+ return getContextResolver().getJobContext().getExecutionId();
}
- public void enterJobExecution(Long jobExecutionId) {
+ public void enterJobExecution() {
+
+ Long jobExecutionId = currentKey();
+
AtomicInteger jobRefs = jobReferences.get(jobExecutionId);
if (jobRefs == null) {
jobRefs = new AtomicInteger(0);
@@ -53,12 +61,12 @@ public class JobContextImpl extends BaseContext {
}
}
jobRefs.incrementAndGet();
-
- currentJobExecutionId.set(jobExecutionId);
}
public void exitJobExecution() {
- Long jobExecutionId = currentJobExecutionId.get();
+
+ Long jobExecutionId = currentKey();
+
AtomicInteger jobRefs = jobReferences.get(jobExecutionId);
if (jobRefs != null) {
int references = jobRefs.decrementAndGet();
@@ -66,8 +74,5 @@ public class JobContextImpl extends BaseContext {
endContext(jobExecutionId);
}
}
-
- currentJobExecutionId.set(null);
- currentJobExecutionId.remove();
}
}
http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/f2136adf/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/StepContextImpl.java
----------------------------------------------------------------------
diff --git a/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/StepContextImpl.java b/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/StepContextImpl.java
index ae09379..e06b27b 100644
--- a/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/StepContextImpl.java
+++ b/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/StepContextImpl.java
@@ -21,11 +21,16 @@ import org.apache.batchee.cdi.scope.StepScoped;
import java.lang.annotation.Annotation;
import javax.enterprise.inject.Typed;
+import javax.enterprise.inject.spi.BeanManager;
@Typed
public class StepContextImpl extends BaseContext {
- private ThreadLocal<Long> currentStepContext = new ThreadLocal<Long>();
+
+ StepContextImpl(BeanManager bm) {
+ super(bm);
+ }
+
@Override
public Class<? extends Annotation> getScope() {
@@ -34,20 +39,12 @@ public class StepContextImpl extends BaseContext {
@Override
protected Long currentKey() {
- return currentStepContext.get();
- }
-
- public void enterStep(final Long stepContextId) {
- currentStepContext.set(stepContextId);
+ return getContextResolver().getStepContext().getStepExecutionId();
}
public void exitStep() {
- Long stepContextId = currentKey();
- endContext(stepContextId);
- currentStepContext.set(null);
- currentStepContext.remove();
+ endContext(currentKey());
}
-
}
http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/f2136adf/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/ThreadLocalContextResolver.java
----------------------------------------------------------------------
diff --git a/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/ThreadLocalContextResolver.java b/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/ThreadLocalContextResolver.java
new file mode 100644
index 0000000..78d567e
--- /dev/null
+++ b/extensions/cdi/src/main/java/org/apache/batchee/cdi/impl/ThreadLocalContextResolver.java
@@ -0,0 +1,60 @@
+/*
+ * 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.batchee.cdi.impl;
+
+import org.apache.batchee.container.proxy.InjectionReferences;
+import org.apache.batchee.container.proxy.ProxyFactory;
+
+import javax.batch.runtime.context.JobContext;
+import javax.batch.runtime.context.StepContext;
+
+/**
+ * Implementation of {@link ContextResolver} which is used to enable BatchEE CDI-Scopes for BatchEE.
+ * <p>
+ * Uses {@link ProxyFactory#getInjectionReferences()}, which are basically {@link ThreadLocal ThreadLocals} to resolve
+ * the current {@link JobContext} and {@link StepContext}
+ */
+class ThreadLocalContextResolver implements ContextResolver {
+
+ @Override
+ public JobContext getJobContext() {
+
+ InjectionReferences references = getInjectionReferences();
+ if (references != null) {
+ return references.getJobContext();
+ }
+
+ return null;
+ }
+
+
+ @Override
+ public StepContext getStepContext() {
+
+ InjectionReferences references = getInjectionReferences();
+ if (references != null) {
+ return references.getStepContext();
+ }
+
+ return null;
+ }
+
+
+ private static InjectionReferences getInjectionReferences() {
+ return ProxyFactory.getInjectionReferences();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/f2136adf/extensions/cdi/src/main/java/org/apache/batchee/cdi/listener/AfterStepScopeListener.java
----------------------------------------------------------------------
diff --git a/extensions/cdi/src/main/java/org/apache/batchee/cdi/listener/AfterStepScopeListener.java b/extensions/cdi/src/main/java/org/apache/batchee/cdi/listener/AfterStepScopeListener.java
index bcaaacb..b051c25 100644
--- a/extensions/cdi/src/main/java/org/apache/batchee/cdi/listener/AfterStepScopeListener.java
+++ b/extensions/cdi/src/main/java/org/apache/batchee/cdi/listener/AfterStepScopeListener.java
@@ -23,6 +23,10 @@ import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import javax.inject.Named;
+/**
+ * This Listener is important for cleanup the {@link org.apache.batchee.cdi.impl.StepContextImpl}.
+ * Otherwise the {@link org.apache.batchee.cdi.impl.StepContextImpl} will leak.
+ */
@Named
@Dependent
public class AfterStepScopeListener implements StepListener {
http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/f2136adf/extensions/cdi/src/main/java/org/apache/batchee/cdi/listener/BeforeJobScopeListener.java
----------------------------------------------------------------------
diff --git a/extensions/cdi/src/main/java/org/apache/batchee/cdi/listener/BeforeJobScopeListener.java b/extensions/cdi/src/main/java/org/apache/batchee/cdi/listener/BeforeJobScopeListener.java
index 7b010dd..f8e1a35 100644
--- a/extensions/cdi/src/main/java/org/apache/batchee/cdi/listener/BeforeJobScopeListener.java
+++ b/extensions/cdi/src/main/java/org/apache/batchee/cdi/listener/BeforeJobScopeListener.java
@@ -19,7 +19,6 @@ package org.apache.batchee.cdi.listener;
import org.apache.batchee.cdi.impl.BatchEEScopeExtension;
import javax.batch.api.listener.JobListener;
-import javax.batch.runtime.context.JobContext;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import javax.inject.Named;
@@ -28,12 +27,11 @@ import javax.inject.Named;
@Dependent
public class BeforeJobScopeListener implements JobListener {
- private @Inject JobContext jobContext;
private @Inject BatchEEScopeExtension scopeExtension;
@Override
public void beforeJob() throws Exception {
- scopeExtension.getJobContext().enterJobExecution(jobContext.getExecutionId());
+ scopeExtension.getJobContext().enterJobExecution();
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/f2136adf/extensions/cdi/src/main/java/org/apache/batchee/cdi/listener/BeforeStepScopeListener.java
----------------------------------------------------------------------
diff --git a/extensions/cdi/src/main/java/org/apache/batchee/cdi/listener/BeforeStepScopeListener.java b/extensions/cdi/src/main/java/org/apache/batchee/cdi/listener/BeforeStepScopeListener.java
index 6ffc75c..3341ddb 100644
--- a/extensions/cdi/src/main/java/org/apache/batchee/cdi/listener/BeforeStepScopeListener.java
+++ b/extensions/cdi/src/main/java/org/apache/batchee/cdi/listener/BeforeStepScopeListener.java
@@ -16,25 +16,24 @@
*/
package org.apache.batchee.cdi.listener;
-import org.apache.batchee.cdi.impl.BatchEEScopeExtension;
-
import javax.batch.api.listener.StepListener;
-import javax.batch.runtime.context.StepContext;
import javax.enterprise.context.Dependent;
-import javax.inject.Inject;
import javax.inject.Named;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+/**
+ * @deprecated only kept for compatibility - will be removed in 1.0
+ */
@Named
@Dependent
public class BeforeStepScopeListener implements StepListener {
- private @Inject StepContext stepContext;
- private @Inject BatchEEScopeExtension scopeExtension;
-
+ private static final Logger LOG = Logger.getLogger(BeforeJobScopeListener.class.getName());
@Override
public void beforeStep() throws Exception {
- scopeExtension.getStepContext().enterStep(stepContext.getStepExecutionId());
+ LOG.log(Level.WARNING, "BeforeStepScopeListener is not required to enable @StepScoped! This Listener will removed in future versions!");
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/f2136adf/extensions/cdi/src/test/java/org/apache/batchee/cdi/BatchScopesTest.java
----------------------------------------------------------------------
diff --git a/extensions/cdi/src/test/java/org/apache/batchee/cdi/BatchScopesTest.java b/extensions/cdi/src/test/java/org/apache/batchee/cdi/BatchScopesTest.java
index 380c111..4cee993 100644
--- a/extensions/cdi/src/test/java/org/apache/batchee/cdi/BatchScopesTest.java
+++ b/extensions/cdi/src/test/java/org/apache/batchee/cdi/BatchScopesTest.java
@@ -82,4 +82,13 @@ public class BatchScopesTest {
assertEquals(PartitionedJobScopedReader.currentBeanId(), PartitionedJobScopedReader.originalBeanId());
assertTrue(JobScopedBean.isDestroyed());
}
+
+ @Test
+ public void testPartitionedStepScoped() {
+
+ JobOperator jobOperator = BatchRuntime.getJobOperator();
+
+ BatchStatus status = Batches.waitFor(jobOperator.start("partitioned-step-scoped", new Properties()));
+ assertEquals(status, BatchStatus.COMPLETED);
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/f2136adf/extensions/cdi/src/test/java/org/apache/batchee/cdi/partitioned/PartitionedStepScopedReader.java
----------------------------------------------------------------------
diff --git a/extensions/cdi/src/test/java/org/apache/batchee/cdi/partitioned/PartitionedStepScopedReader.java b/extensions/cdi/src/test/java/org/apache/batchee/cdi/partitioned/PartitionedStepScopedReader.java
new file mode 100644
index 0000000..fc851a9
--- /dev/null
+++ b/extensions/cdi/src/test/java/org/apache/batchee/cdi/partitioned/PartitionedStepScopedReader.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.batchee.cdi.partitioned;
+
+import org.apache.batchee.cdi.component.StepScopedBean;
+import org.apache.batchee.cdi.scope.StepScoped;
+
+import javax.batch.api.chunk.AbstractItemReader;
+import javax.enterprise.context.Dependent;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+@Named
+@Dependent
+public class PartitionedStepScopedReader extends AbstractItemReader {
+
+ @Inject
+ private StepScopedBean bean;
+
+ private int count;
+
+ @Override
+ public Object readItem() throws Exception {
+
+ if (++count < 11) {
+ return "continue - BeanId: " + bean.getId();
+ }
+
+ return null;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/f2136adf/extensions/cdi/src/test/resources/META-INF/batch-jobs/partitioned-step-scoped.xml
----------------------------------------------------------------------
diff --git a/extensions/cdi/src/test/resources/META-INF/batch-jobs/partitioned-step-scoped.xml b/extensions/cdi/src/test/resources/META-INF/batch-jobs/partitioned-step-scoped.xml
new file mode 100644
index 0000000..e87e7dd
--- /dev/null
+++ b/extensions/cdi/src/test/resources/META-INF/batch-jobs/partitioned-step-scoped.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ See the NOTICE file distributed with this work for additional information
+ regarding copyright ownership. Licensed 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.
+-->
+<job id="partitioned-step-scoped-job" xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0">
+
+ <step id="partitioned-step">
+
+ <chunk item-count="100">
+ <reader ref="partitionedStepScopedReader">
+ <properties>
+ <property name="partition" value="#{partitionPlan['index']}" />
+ </properties>
+ </reader>
+ <writer ref="partitionedJobScopedWriter">
+ <properties>
+ <property name="partition" value="#{partitionPlan['index']}" />
+ </properties>
+ </writer>
+ </chunk>
+
+ <partition>
+
+ <plan partitions="2" threads="2">
+
+ <properties partition="0">
+ <property name="index" value="1" />
+ </properties>
+
+ <properties partition="1">
+ <property name="index" value="2" />
+ </properties>
+
+ </plan>
+
+ </partition>
+
+ </step>
+
+</job>
http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/f2136adf/extensions/cdi/src/test/resources/batchee.properties
----------------------------------------------------------------------
diff --git a/extensions/cdi/src/test/resources/batchee.properties b/extensions/cdi/src/test/resources/batchee.properties
index e9a67fb..efe1da4 100644
--- a/extensions/cdi/src/test/resources/batchee.properties
+++ b/extensions/cdi/src/test/resources/batchee.properties
@@ -16,5 +16,4 @@
org.apache.batchee.job.listeners.before = beforeJobScopeListener
org.apache.batchee.job.listeners.after = afterJobScopeListener
-org.apache.batchee.step.listeners.before = beforeStepScopeListener
org.apache.batchee.step.listeners.after = afterStepScopeListener