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 @@
@@ -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 @@
@@ -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 @@
@@ -1,3 +1,4 @@
|
||||
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/lang=org.springframework.scripting.config.LangNamespaceHandler |
||||
http\://www.springframework.org/schema/scheduling=org.springframework.scheduling.config.SchedulingNamespaceHandler |
||||
|
||||
@ -0,0 +1,93 @@
@@ -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