BATCH-1135: Create top-level element <step-listener/>
This commit is contained in:
@@ -5,10 +5,11 @@ import java.util.List;
|
||||
|
||||
import org.springframework.batch.core.listener.AbstractListenerFactoryBean;
|
||||
import org.springframework.batch.core.listener.ListenerMetaData;
|
||||
import org.springframework.beans.factory.support.AbstractBeanDefinition;
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
||||
import org.springframework.beans.factory.support.ManagedMap;
|
||||
import org.springframework.beans.factory.support.RootBeanDefinition;
|
||||
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
|
||||
import org.springframework.beans.factory.xml.ParserContext;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.w3c.dom.Element;
|
||||
@@ -18,22 +19,27 @@ import org.w3c.dom.NamedNodeMap;
|
||||
* @author Dan Garrette
|
||||
* @since 2.0
|
||||
*/
|
||||
public abstract class AbstractListenerParser {
|
||||
public abstract class AbstractListenerParser extends AbstractSingleBeanDefinitionParser {
|
||||
|
||||
public BeanDefinition internalParse(Element element, ParserContext parserContext) {
|
||||
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(getBeanClass(null));
|
||||
this.doParse(element, parserContext, builder);
|
||||
return builder.getBeanDefinition();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public AbstractBeanDefinition parse(Element element, ParserContext parserContext) {
|
||||
BeanDefinitionBuilder listenerBuilder = BeanDefinitionBuilder.genericBeanDefinition(getFactoryClass());
|
||||
public void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
|
||||
String id = element.getAttribute("id");
|
||||
String listenerRef = element.getAttribute("ref");
|
||||
String className = element.getAttribute("class");
|
||||
checkListenerElementAttributes(parserContext, element, id, listenerRef, className);
|
||||
|
||||
if (StringUtils.hasText(listenerRef)) {
|
||||
listenerBuilder.addPropertyReference("delegate", listenerRef);
|
||||
builder.addPropertyReference("delegate", listenerRef);
|
||||
}
|
||||
else if (StringUtils.hasText(className)) {
|
||||
RootBeanDefinition beanDef = new RootBeanDefinition(className, null, null);
|
||||
listenerBuilder.addPropertyValue("delegate", beanDef);
|
||||
builder.addPropertyValue("delegate", beanDef);
|
||||
}
|
||||
else {
|
||||
parserContext.getReaderContext().error(
|
||||
@@ -47,9 +53,7 @@ public abstract class AbstractListenerParser {
|
||||
metaDataMap.put(metaDataPropertyName, listenerMethod);
|
||||
}
|
||||
}
|
||||
listenerBuilder.addPropertyValue("metaDataMap", metaDataMap);
|
||||
|
||||
return listenerBuilder.getBeanDefinition();
|
||||
builder.addPropertyValue("metaDataMap", metaDataMap);
|
||||
}
|
||||
|
||||
private void checkListenerElementAttributes(ParserContext parserContext, Element element, String id,
|
||||
@@ -78,7 +82,7 @@ public abstract class AbstractListenerParser {
|
||||
return methodNameAttributes;
|
||||
}
|
||||
|
||||
protected abstract Class<? extends AbstractListenerFactoryBean> getFactoryClass();
|
||||
protected abstract Class<? extends AbstractListenerFactoryBean> getBeanClass(Element element);
|
||||
|
||||
protected abstract ListenerMetaData[] getMetaDataValues();
|
||||
|
||||
|
||||
@@ -138,7 +138,7 @@ public abstract class AbstractStepParser {
|
||||
DomUtils.getChildElementsByTagName(listenersElement, "listener");
|
||||
if (listenerElements != null) {
|
||||
for (Element listenerElement : listenerElements) {
|
||||
listenerBeans.add(stepListenerParser.parse(listenerElement, parserContext));
|
||||
listenerBeans.add(stepListenerParser.internalParse(listenerElement, parserContext));
|
||||
}
|
||||
}
|
||||
ManagedList arguments = new ManagedList();
|
||||
|
||||
@@ -33,5 +33,6 @@ public class CoreNamespaceHandler extends NamespaceHandlerSupport {
|
||||
this.registerBeanDefinitionParser("job", new JobParser());
|
||||
this.registerBeanDefinitionParser("step", new TopLevelStepParser());
|
||||
this.registerBeanDefinitionParser("job-repository", new JobRepositoryParser());
|
||||
this.registerBeanDefinitionParser("step-listener", new StepListenerParser());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ import org.springframework.batch.core.listener.AbstractListenerFactoryBean;
|
||||
import org.springframework.batch.core.listener.JobListenerFactoryBean;
|
||||
import org.springframework.batch.core.listener.JobListenerMetaData;
|
||||
import org.springframework.batch.core.listener.ListenerMetaData;
|
||||
import org.w3c.dom.Element;
|
||||
|
||||
/**
|
||||
* Parser for a step listener element. Builds a {@link JobListenerFactoryBean}
|
||||
@@ -30,7 +31,7 @@ import org.springframework.batch.core.listener.ListenerMetaData;
|
||||
*/
|
||||
public class JobExecutionListenerParser extends AbstractListenerParser {
|
||||
|
||||
protected Class<? extends AbstractListenerFactoryBean> getFactoryClass() {
|
||||
protected Class<? extends AbstractListenerFactoryBean> getBeanClass(Element element) {
|
||||
return JobListenerFactoryBean.class;
|
||||
}
|
||||
|
||||
|
||||
@@ -89,7 +89,7 @@ public class JobParser extends AbstractSingleBeanDefinitionParser {
|
||||
List<BeanDefinition> listeners = new ArrayList<BeanDefinition>();
|
||||
List<Element> listenerElements = (List<Element>) DomUtils.getChildElementsByTagName(listenersElement, "listener");
|
||||
for (Element listenerElement : listenerElements) {
|
||||
listeners.add(listenerParser.parse(listenerElement, parserContext));
|
||||
listeners.add(listenerParser.internalParse(listenerElement, parserContext));
|
||||
}
|
||||
ManagedList managedList = new ManagedList();
|
||||
managedList.addAll(listeners);
|
||||
|
||||
@@ -19,6 +19,7 @@ import org.springframework.batch.core.listener.AbstractListenerFactoryBean;
|
||||
import org.springframework.batch.core.listener.ListenerMetaData;
|
||||
import org.springframework.batch.core.listener.StepListenerFactoryBean;
|
||||
import org.springframework.batch.core.listener.StepListenerMetaData;
|
||||
import org.w3c.dom.Element;
|
||||
|
||||
/**
|
||||
* Parser for a step listener element. Builds a {@link StepListenerFactoryBean}
|
||||
@@ -29,7 +30,7 @@ import org.springframework.batch.core.listener.StepListenerMetaData;
|
||||
*/
|
||||
public class StepListenerParser extends AbstractListenerParser {
|
||||
|
||||
protected Class<? extends AbstractListenerFactoryBean> getFactoryClass() {
|
||||
protected Class<? extends AbstractListenerFactoryBean> getBeanClass(Element element) {
|
||||
return StepListenerFactoryBean.class;
|
||||
}
|
||||
|
||||
|
||||
@@ -84,6 +84,19 @@
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
|
||||
<xsd:element name="step-listener">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
A bean definition for a step listener (or POJO if using *-method attributes)
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:complexType>
|
||||
<xsd:complexContent>
|
||||
<xsd:extension base="stepListenerType"/>
|
||||
</xsd:complexContent>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
|
||||
<xsd:element name="job-repository">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation><![CDATA[
|
||||
|
||||
@@ -41,27 +41,21 @@
|
||||
<skippable-exception-classes>
|
||||
org.springframework.batch.item.validator.ValidationException
|
||||
java.lang.RuntimeException
|
||||
</skippable-exception-classes>
|
||||
</skippable-exception-classes>
|
||||
</tasklet>
|
||||
</step>
|
||||
|
||||
<beans:bean id="baseStep" abstract="true">
|
||||
<beans:property name="listeners">
|
||||
<beans:list>
|
||||
<beans:bean class="org.springframework.batch.core.listener.StepListenerFactoryBean">
|
||||
<beans:property name="delegate" ref="skipCheckingListener"/>
|
||||
</beans:bean>
|
||||
<beans:bean class="org.springframework.batch.core.listener.StepListenerFactoryBean">
|
||||
<beans:property name="delegate" ref="promotionListener"/>
|
||||
</beans:bean>
|
||||
<beans:ref bean="skipCheckingListener"/>
|
||||
<step-listener ref="promotionListener"/>
|
||||
</beans:list>
|
||||
</beans:property>
|
||||
</beans:bean>
|
||||
|
||||
<beans:bean id="tradeProcessor" class="org.springframework.batch.sample.domain.trade.internal.TradeProcessor"/>
|
||||
|
||||
<beans:bean id="skipCheckingListener" class="org.springframework.batch.sample.common.SkipCheckingListener"/>
|
||||
|
||||
<step-listener id="skipCheckingListener" class="org.springframework.batch.sample.common.SkipCheckingListener"/>
|
||||
|
||||
<beans:bean id="promotionListener" class="org.springframework.batch.core.listener.ExecutionContextPromotionListener">
|
||||
<beans:property name="keys" value="stepName"/>
|
||||
</beans:bean>
|
||||
@@ -82,6 +76,8 @@
|
||||
</beans:property>
|
||||
</beans:bean>
|
||||
|
||||
<beans:bean id="tradeProcessor" class="org.springframework.batch.sample.domain.trade.internal.TradeProcessor"/>
|
||||
|
||||
<beans:bean id="tradeSqlItemReader" class="org.springframework.batch.item.database.JdbcCursorItemReader">
|
||||
<beans:property name="dataSource" ref="dataSource" />
|
||||
<beans:property name="sql" value="SELECT isin, quantity, price, customer from TRADE" />
|
||||
|
||||
@@ -5,6 +5,10 @@ import org.springframework.batch.core.StepExecution;
|
||||
import org.springframework.batch.core.annotation.AfterStep;
|
||||
import org.springframework.batch.core.annotation.BeforeStep;
|
||||
|
||||
/**
|
||||
* @author Dan Garrette
|
||||
* @since 2.0
|
||||
*/
|
||||
public class SkipCheckingListener {
|
||||
|
||||
@AfterStep
|
||||
|
||||
Reference in New Issue
Block a user