Browse Source
git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@1129 50f2f4bb-b051-0410-bef5-90022cba6387pull/1/head
5 changed files with 230 additions and 0 deletions
@ -0,0 +1,101 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2002-2009 the original author or authors. |
||||||
|
* |
||||||
|
* 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. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.scheduling.config; |
||||||
|
|
||||||
|
import org.w3c.dom.Element; |
||||||
|
import org.w3c.dom.Node; |
||||||
|
import org.w3c.dom.NodeList; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.config.RuntimeBeanReference; |
||||||
|
import org.springframework.beans.factory.support.BeanDefinitionBuilder; |
||||||
|
import org.springframework.beans.factory.support.ManagedMap; |
||||||
|
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; |
||||||
|
import org.springframework.beans.factory.xml.ParserContext; |
||||||
|
import org.springframework.util.StringUtils; |
||||||
|
|
||||||
|
/** |
||||||
|
* Parser for the 'scheduled-tasks' element of the scheduling namespace. |
||||||
|
* |
||||||
|
* @author Mark Fisher |
||||||
|
* @since 3.0 |
||||||
|
*/ |
||||||
|
public class ScheduledTasksBeanDefinitionParser extends AbstractSingleBeanDefinitionParser { |
||||||
|
|
||||||
|
@Override |
||||||
|
protected boolean shouldGenerateId() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected String getBeanClassName(Element element) { |
||||||
|
return "org.springframework.scheduling.config.ScheduledTaskRegistrar"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { |
||||||
|
ManagedMap<RuntimeBeanReference, String> cronTaskMap = new ManagedMap<RuntimeBeanReference, String>(); |
||||||
|
ManagedMap<RuntimeBeanReference, String> fixedDelayTaskMap = new ManagedMap<RuntimeBeanReference, String>(); |
||||||
|
ManagedMap<RuntimeBeanReference, String> fixedRateTaskMap = new ManagedMap<RuntimeBeanReference, String>(); |
||||||
|
NodeList childNodes = element.getChildNodes(); |
||||||
|
for (int i = 0; i < childNodes.getLength(); i++) { |
||||||
|
Node child = childNodes.item(i); |
||||||
|
if (!(child instanceof Element) || !child.getLocalName().equals("task")) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
Element taskElement = (Element) child; |
||||||
|
String ref = taskElement.getAttribute("ref"); |
||||||
|
String method = taskElement.getAttribute("method"); |
||||||
|
RuntimeBeanReference runnableBeanRef = new RuntimeBeanReference( |
||||||
|
this.createRunnableBean(ref, method, parserContext)); |
||||||
|
String cronAttribute = taskElement.getAttribute("cron"); |
||||||
|
if (StringUtils.hasText(cronAttribute)) { |
||||||
|
cronTaskMap.put(runnableBeanRef, cronAttribute); |
||||||
|
} |
||||||
|
else { |
||||||
|
String fixedDelayAttribute = taskElement.getAttribute("fixed-delay"); |
||||||
|
if (StringUtils.hasText(fixedDelayAttribute)) { |
||||||
|
fixedDelayTaskMap.put(runnableBeanRef, fixedDelayAttribute); |
||||||
|
} |
||||||
|
else { |
||||||
|
String fixedRateAttribute = taskElement.getAttribute("fixed-rate"); |
||||||
|
if (!StringUtils.hasText(fixedRateAttribute)) { |
||||||
|
parserContext.getReaderContext().error( |
||||||
|
"one of 'cron', 'fixed-delay', or 'fixed-rate' is required", taskElement); |
||||||
|
return; |
||||||
|
} |
||||||
|
fixedRateTaskMap.put(runnableBeanRef, fixedRateAttribute); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
String schedulerRef = element.getAttribute("scheduler"); |
||||||
|
if (StringUtils.hasText(schedulerRef)) { |
||||||
|
builder.addPropertyReference("taskScheduler", schedulerRef); |
||||||
|
} |
||||||
|
builder.addPropertyValue("cronTasks", cronTaskMap); |
||||||
|
builder.addPropertyValue("fixedDelayTasks", fixedDelayTaskMap); |
||||||
|
builder.addPropertyValue("fixedRateTasks", fixedRateTaskMap); |
||||||
|
} |
||||||
|
|
||||||
|
private String createRunnableBean(String ref, String method, ParserContext parserContext) { |
||||||
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition( |
||||||
|
"org.springframework.scheduling.support.MethodInvokingRunnable"); |
||||||
|
builder.addPropertyReference("targetObject", ref); |
||||||
|
builder.addPropertyValue("targetMethod", method); |
||||||
|
return parserContext.getReaderContext().registerWithGeneratedName(builder.getBeanDefinition()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,33 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2002-2009 the original author or authors. |
||||||
|
* |
||||||
|
* 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. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.scheduling.config; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.xml.NamespaceHandlerSupport; |
||||||
|
|
||||||
|
/** |
||||||
|
* <code>NamespaceHandler</code> for the scheduling namespace. |
||||||
|
* |
||||||
|
* @author Mark Fisher |
||||||
|
* @since 3.0 |
||||||
|
*/ |
||||||
|
public class SchedulingNamespaceHandler extends NamespaceHandlerSupport { |
||||||
|
|
||||||
|
public void init() { |
||||||
|
this.registerBeanDefinitionParser("scheduled-tasks", new ScheduledTasksBeanDefinitionParser()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -1,3 +1,4 @@ |
|||||||
http\://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler |
http\://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler |
||||||
http\://www.springframework.org/schema/jee=org.springframework.ejb.config.JeeNamespaceHandler |
http\://www.springframework.org/schema/jee=org.springframework.ejb.config.JeeNamespaceHandler |
||||||
http\://www.springframework.org/schema/lang=org.springframework.scripting.config.LangNamespaceHandler |
http\://www.springframework.org/schema/lang=org.springframework.scripting.config.LangNamespaceHandler |
||||||
|
http\://www.springframework.org/schema/scheduling=org.springframework.scheduling.config.SchedulingNamespaceHandler |
||||||
|
|||||||
@ -0,0 +1,93 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
||||||
|
|
||||||
|
<xsd:schema xmlns="http://www.springframework.org/schema/scheduling" |
||||||
|
xmlns:xsd="http://www.w3.org/2001/XMLSchema" |
||||||
|
xmlns:beans="http://www.springframework.org/schema/beans" |
||||||
|
xmlns:tool="http://www.springframework.org/schema/tool" |
||||||
|
targetNamespace="http://www.springframework.org/schema/scheduling" |
||||||
|
elementFormDefault="qualified" |
||||||
|
attributeFormDefault="unqualified"> |
||||||
|
|
||||||
|
<xsd:annotation> |
||||||
|
<xsd:documentation><![CDATA[ |
||||||
|
Defines the elements used in the Spring Framework's scheduling support. |
||||||
|
]]></xsd:documentation> |
||||||
|
</xsd:annotation> |
||||||
|
|
||||||
|
<xsd:import namespace="http://www.springframework.org/schema/beans"/> |
||||||
|
<xsd:import namespace="http://www.springframework.org/schema/tool"/> |
||||||
|
|
||||||
|
<xsd:element name="scheduled-tasks"> |
||||||
|
<xsd:annotation> |
||||||
|
<xsd:documentation><![CDATA[ |
||||||
|
Top-level element that contains one or more task sub-elements to be |
||||||
|
managed by a given TaskScheduler. |
||||||
|
]]></xsd:documentation> |
||||||
|
</xsd:annotation> |
||||||
|
<xsd:complexType> |
||||||
|
<xsd:sequence> |
||||||
|
<xsd:element name="task" type="taskType" minOccurs="1" maxOccurs="unbounded"/> |
||||||
|
</xsd:sequence> |
||||||
|
<xsd:attribute name="scheduler" type="xsd:string" use="optional"> |
||||||
|
<xsd:annotation> |
||||||
|
<xsd:documentation><![CDATA[ |
||||||
|
Reference to an instance of TaskScheduler to manage the provided tasks. If not specified, |
||||||
|
the default value will be a wrapper for a single-threaded Executor. |
||||||
|
]]></xsd:documentation> |
||||||
|
<xsd:appinfo> |
||||||
|
<tool:annotation kind="ref"> |
||||||
|
<tool:expected-type type="org.springframework.scheduling.TaskScheduler"/> |
||||||
|
</tool:annotation> |
||||||
|
</xsd:appinfo> |
||||||
|
</xsd:annotation> |
||||||
|
</xsd:attribute> |
||||||
|
</xsd:complexType> |
||||||
|
</xsd:element> |
||||||
|
|
||||||
|
<xsd:complexType name="taskType"> |
||||||
|
<xsd:annotation> |
||||||
|
<xsd:documentation><![CDATA[ |
||||||
|
Element defining a method-invoking task and its corresponding trigger. |
||||||
|
]]></xsd:documentation> |
||||||
|
</xsd:annotation> |
||||||
|
<xsd:attribute name="cron" type="xsd:string" use="optional"> |
||||||
|
<xsd:annotation> |
||||||
|
<xsd:documentation><![CDATA[ |
||||||
|
A cron-based trigger. See the org.springframework.scheduling.support.CronSequenceGenerator |
||||||
|
JavaDoc for example patterns. |
||||||
|
]]></xsd:documentation> |
||||||
|
</xsd:annotation> |
||||||
|
</xsd:attribute> |
||||||
|
<xsd:attribute name="fixed-delay" type="xsd:string" use="optional"> |
||||||
|
<xsd:annotation> |
||||||
|
<xsd:documentation><![CDATA[ |
||||||
|
An interval-based trigger where the interval is measured from the completion time of the |
||||||
|
previous task. The time unit value is measured in milliseconds. |
||||||
|
]]></xsd:documentation> |
||||||
|
</xsd:annotation> |
||||||
|
</xsd:attribute> |
||||||
|
<xsd:attribute name="fixed-rate" type="xsd:string" use="optional"> |
||||||
|
<xsd:annotation> |
||||||
|
<xsd:documentation><![CDATA[ |
||||||
|
An interval-based trigger where the interval is measured from the start time of the |
||||||
|
previous task. The time unit value is measured in milliseconds. |
||||||
|
]]></xsd:documentation> |
||||||
|
</xsd:annotation> |
||||||
|
</xsd:attribute> |
||||||
|
<xsd:attribute name="ref" type="xsd:string" use="required"> |
||||||
|
<xsd:annotation> |
||||||
|
<xsd:documentation><![CDATA[ |
||||||
|
Reference to an object that provides a method to be invoked. |
||||||
|
]]></xsd:documentation> |
||||||
|
</xsd:annotation> |
||||||
|
</xsd:attribute> |
||||||
|
<xsd:attribute name="method" type="xsd:string" use="required"> |
||||||
|
<xsd:annotation> |
||||||
|
<xsd:documentation><![CDATA[ |
||||||
|
The name of the method to be invoked. |
||||||
|
]]></xsd:documentation> |
||||||
|
</xsd:annotation> |
||||||
|
</xsd:attribute> |
||||||
|
</xsd:complexType> |
||||||
|
|
||||||
|
</xsd:schema> |
||||||
Loading…
Reference in new issue