From 17622711c6d819d0354196a156d6aebb47af78c2 Mon Sep 17 00:00:00 2001 From: haocao Date: Fri, 2 Sep 2016 17:48:38 +0800 Subject: [PATCH] fix #127 --- elastic-job-doc/content/post/release_notes.md | 1 + .../content/post/user_guide/lite/dev_guide.md | 16 +++++-- .../resources/META-INF/applicationContext.xml | 8 ++-- .../src/main/resources/conf/job.properties | 10 ++++- .../BaseJobBeanDefinitionParserTag.java | 6 ++- .../AbstractJobBeanDefinitionParser.java | 43 +++++++++---------- .../main/resources/META-INF/namespace/job.xsd | 12 ++++-- .../src/test/resources/META-INF/job/base.xml | 2 +- .../resources/META-INF/job/withListener.xml | 4 +- .../test/resources/conf/job/conf.properties | 4 +- 10 files changed, 64 insertions(+), 42 deletions(-) diff --git a/elastic-job-doc/content/post/release_notes.md b/elastic-job-doc/content/post/release_notes.md index 914f6a24fd..73c5bdd0bf 100644 --- a/elastic-job-doc/content/post/release_notes.md +++ b/elastic-job-doc/content/post/release_notes.md @@ -15,6 +15,7 @@ weight=1 ### 缺陷修正 1. [ISSUE #123](https://github.com/dangdangdotcom/elastic-job/issues/123) 单机跑定时任务,zk断开后重连,没有触发leader选举 +1. [ISSUE #127](https://github.com/dangdangdotcom/elastic-job/issues/127) Spring方式配置作业id无法使用占位符 ## 1.1.1 diff --git a/elastic-job-doc/content/post/user_guide/lite/dev_guide.md b/elastic-job-doc/content/post/user_guide/lite/dev_guide.md index 73524e2f35..6f998997d5 100644 --- a/elastic-job-doc/content/post/user_guide/lite/dev_guide.md +++ b/elastic-job-doc/content/post/user_guide/lite/dev_guide.md @@ -164,7 +164,7 @@ echo sharding execution context is $* - + @@ -215,13 +215,21 @@ job:script命名空间拥有job:simple命名空间的全部属性,以下仅列 #### job:listener命名空间属性详细说明 -`job:listener`必须配置为`job:bean`的子元素 +`job:listener`必须配置为`job:bean`的子元素,并且在子元素中只允许出现一次 | 属性名 | 类型 |是否必填|缺省值 | 描述 | | ------------------------------ |:------|:------|:-------------|:------------------------------------------------------------------------------------------------| |class |String |`是` | | 前置后置任务监听实现类,需实现`ElasticJobListener`接口 | -|started-timeout-milliseconds |long |`否` |Long.MAX_VALUE| AbstractDistributeOnceElasticJobListener型监听器,最后一个作业执行前的执行方法的超时时间
单位:毫秒| -|completed-timeout-milliseconds |long |`否` |Long.MAX_VALUE| AbstractDistributeOnceElasticJobListener型监听器,最后一个作业执行后的执行方法的超时时间
单位:毫秒| + +#### job:distributed-listener命名空间属性详细说明 + +`job:distributed-listener`必须配置为`job:bean`的子元素,并且在子元素中只允许出现一次 + +| 属性名 | 类型 |是否必填|缺省值 | 描述 | +| ------------------------------ |:------|:------|:-------------|:------------------------------------------------------------------------------------------------| +|class |String |`是` | | 前置后置任务分布式监听实现类,需继承`AbstractDistributeOnceElasticJobListener`类 | +|started-timeout-milliseconds |long |`否` |Long.MAX_VALUE| 最后一个作业执行前的执行方法的超时时间
单位:毫秒| +|completed-timeout-milliseconds |long |`否` |Long.MAX_VALUE| 最后一个作业执行后的执行方法的超时时间
单位:毫秒| #### job:event-log命名空间详细说明 diff --git a/elastic-job-example/elastic-job-example-lite/src/main/resources/META-INF/applicationContext.xml b/elastic-job-example/elastic-job-example-lite/src/main/resources/META-INF/applicationContext.xml index 646186108f..a0e040f6a0 100644 --- a/elastic-job-example/elastic-job-example-lite/src/main/resources/META-INF/applicationContext.xml +++ b/elastic-job-example/elastic-job-example-lite/src/main/resources/META-INF/applicationContext.xml @@ -18,9 +18,9 @@ - - - + + + - + diff --git a/elastic-job-example/elastic-job-example-lite/src/main/resources/conf/job.properties b/elastic-job-example/elastic-job-example-lite/src/main/resources/conf/job.properties index 6e291b80ce..03af2f902b 100644 --- a/elastic-job-example/elastic-job-example-lite/src/main/resources/conf/job.properties +++ b/elastic-job-example/elastic-job-example-lite/src/main/resources/conf/job.properties @@ -1,3 +1,5 @@ +simple.id=springSimpleJob +simple.class=com.dangdang.ddframe.job.example.job.simple.SpringSimpleJob simple.cron=0/5 * * * * ? simple.shardingTotalCount=10 simple.shardingItemParameters=0=A,1=B,2=C,3=D,4=E,5=F,6=G,7=H,8=I,9=J @@ -8,6 +10,8 @@ simple.disabled=false simple.overwrite=true simple.monitorPort=9888 +dataflow.id=springDataflowJob +dataflow.class=com.dangdang.ddframe.job.example.job.dataflow.SpringDataflowJob dataflow.cron=0/5 * * * * ? dataflow.shardingTotalCount=10 dataflow.shardingItemParameters=0=A,1=B,2=C,3=D,4=E,5=F,6=G,7=H,8=I,9=J @@ -19,5 +23,7 @@ dataflow.description=\u6309\u987A\u5E8F\u4E0D\u505C\u6B62\u8FD0\u884C\u7684\u4F5 dataflow.disabled=false dataflow.overwrite=true -listener.startedTimeoutMilliseconds=1000 -listener.completedTimeoutMilliseconds=2000 +listener.simple=com.dangdang.ddframe.job.example.job.listener.SimpleListener +listener.distributed=com.dangdang.ddframe.job.example.job.listener.SimpleDistributeListener +listener.distributed.startedTimeoutMilliseconds=1000 +listener.distributed.completedTimeoutMilliseconds=3000 \ No newline at end of file diff --git a/elastic-job-lite/elastic-job-lite-spring/src/main/java/com/dangdang/ddframe/job/lite/spring/namespace/constants/BaseJobBeanDefinitionParserTag.java b/elastic-job-lite/elastic-job-lite-spring/src/main/java/com/dangdang/ddframe/job/lite/spring/namespace/constants/BaseJobBeanDefinitionParserTag.java index e25c414802..16b0795794 100644 --- a/elastic-job-lite/elastic-job-lite-spring/src/main/java/com/dangdang/ddframe/job/lite/spring/namespace/constants/BaseJobBeanDefinitionParserTag.java +++ b/elastic-job-lite/elastic-job-lite-spring/src/main/java/com/dangdang/ddframe/job/lite/spring/namespace/constants/BaseJobBeanDefinitionParserTag.java @@ -60,9 +60,11 @@ public final class BaseJobBeanDefinitionParserTag { public static final String LISTENER_TAG = "listener"; - public static final String LISTENER_STARTED_TIMEOUT_MILLISECONDS_ATTRIBUTE = "started-timeout-milliseconds"; + public static final String DISTRIBUTED_LISTENER_TAG = "distributed-listener"; - public static final String LISTENER_COMPLETED_TIMEOUT_MILLISECONDS_ATTRIBUTE = "completed-timeout-milliseconds"; + public static final String DISTRIBUTED_LISTENER_STARTED_TIMEOUT_MILLISECONDS_ATTRIBUTE = "started-timeout-milliseconds"; + + public static final String DISTRIBUTED_LISTENER_COMPLETED_TIMEOUT_MILLISECONDS_ATTRIBUTE = "completed-timeout-milliseconds"; public static final String EXECUTOR_SERVICE_HANDLER = "executor-service-handler"; diff --git a/elastic-job-lite/elastic-job-lite-spring/src/main/java/com/dangdang/ddframe/job/lite/spring/namespace/parser/common/AbstractJobBeanDefinitionParser.java b/elastic-job-lite/elastic-job-lite-spring/src/main/java/com/dangdang/ddframe/job/lite/spring/namespace/parser/common/AbstractJobBeanDefinitionParser.java index a428ac95e1..878590bc6c 100644 --- a/elastic-job-lite/elastic-job-lite-spring/src/main/java/com/dangdang/ddframe/job/lite/spring/namespace/parser/common/AbstractJobBeanDefinitionParser.java +++ b/elastic-job-lite/elastic-job-lite-spring/src/main/java/com/dangdang/ddframe/job/lite/spring/namespace/parser/common/AbstractJobBeanDefinitionParser.java @@ -17,7 +17,6 @@ package com.dangdang.ddframe.job.lite.spring.namespace.parser.common; -import com.dangdang.ddframe.job.lite.api.listener.AbstractDistributeOnceElasticJobListener; import com.dangdang.ddframe.job.lite.spring.schedule.SpringJobScheduler; import com.google.common.base.Strings; import org.springframework.beans.factory.config.BeanDefinition; @@ -35,6 +34,9 @@ import static com.dangdang.ddframe.job.lite.spring.namespace.constants.BaseJobBeanDefinitionParserTag.CRON_ATTRIBUTE; import static com.dangdang.ddframe.job.lite.spring.namespace.constants.BaseJobBeanDefinitionParserTag.DESCRIPTION_ATTRIBUTE; import static com.dangdang.ddframe.job.lite.spring.namespace.constants.BaseJobBeanDefinitionParserTag.DISABLED_ATTRIBUTE; +import static com.dangdang.ddframe.job.lite.spring.namespace.constants.BaseJobBeanDefinitionParserTag.DISTRIBUTED_LISTENER_COMPLETED_TIMEOUT_MILLISECONDS_ATTRIBUTE; +import static com.dangdang.ddframe.job.lite.spring.namespace.constants.BaseJobBeanDefinitionParserTag.DISTRIBUTED_LISTENER_STARTED_TIMEOUT_MILLISECONDS_ATTRIBUTE; +import static com.dangdang.ddframe.job.lite.spring.namespace.constants.BaseJobBeanDefinitionParserTag.DISTRIBUTED_LISTENER_TAG; import static com.dangdang.ddframe.job.lite.spring.namespace.constants.BaseJobBeanDefinitionParserTag.EVENT_LOG_TAG; import static com.dangdang.ddframe.job.lite.spring.namespace.constants.BaseJobBeanDefinitionParserTag.EVENT_RDB_DRIVER_ATTRIBUTE; import static com.dangdang.ddframe.job.lite.spring.namespace.constants.BaseJobBeanDefinitionParserTag.EVENT_RDB_LOG_LEVEL_ATTRIBUTE; @@ -47,8 +49,6 @@ import static com.dangdang.ddframe.job.lite.spring.namespace.constants.BaseJobBeanDefinitionParserTag.JOB_EXCEPTION_HANDLER; import static com.dangdang.ddframe.job.lite.spring.namespace.constants.BaseJobBeanDefinitionParserTag.JOB_PARAMETER_ATTRIBUTE; import static com.dangdang.ddframe.job.lite.spring.namespace.constants.BaseJobBeanDefinitionParserTag.JOB_SHARDING_STRATEGY_CLASS_ATTRIBUTE; -import static com.dangdang.ddframe.job.lite.spring.namespace.constants.BaseJobBeanDefinitionParserTag.LISTENER_COMPLETED_TIMEOUT_MILLISECONDS_ATTRIBUTE; -import static com.dangdang.ddframe.job.lite.spring.namespace.constants.BaseJobBeanDefinitionParserTag.LISTENER_STARTED_TIMEOUT_MILLISECONDS_ATTRIBUTE; import static com.dangdang.ddframe.job.lite.spring.namespace.constants.BaseJobBeanDefinitionParserTag.LISTENER_TAG; import static com.dangdang.ddframe.job.lite.spring.namespace.constants.BaseJobBeanDefinitionParserTag.MAX_TIME_DIFF_SECONDS_ATTRIBUTE; import static com.dangdang.ddframe.job.lite.spring.namespace.constants.BaseJobBeanDefinitionParserTag.MISFIRE_ATTRIBUTE; @@ -72,14 +72,15 @@ protected AbstractBeanDefinition parseInternal(final Element element, final Pars BeanDefinitionBuilder factory = BeanDefinitionBuilder.rootBeanDefinition(SpringJobScheduler.class); factory.setInitMethodName("init"); factory.addConstructorArgReference(element.getAttribute(REGISTRY_CENTER_REF_ATTRIBUTE)); - factory.addConstructorArgReference(createJobConfiguration(element, parserContext)); + factory.addConstructorArgValue(createJobConfiguration(element)); factory.addConstructorArgValue(createJobListeners(element)); return factory.getBeanDefinition(); } - private String createJobConfiguration(final Element element, final ParserContext parserContext) { + private BeanDefinition createJobConfiguration(final Element element) { BeanDefinitionBuilder factory = BeanDefinitionBuilder.rootBeanDefinition(getJobConfigurationDTO()); - factory.addConstructorArgValue(element.getAttribute(ID_ATTRIBUTE)); + String jobName = element.getAttribute(ID_ATTRIBUTE); + factory.addConstructorArgValue(jobName); factory.addConstructorArgValue(element.getAttribute(CRON_ATTRIBUTE)); factory.addConstructorArgValue(element.getAttribute(SHARDING_TOTAL_COUNT_ATTRIBUTE)); addPropertyValueIfNotEmpty(SHARDING_ITEM_PARAMETERS_ATTRIBUTE, "shardingItemParameters", element, factory); @@ -97,9 +98,7 @@ private String createJobConfiguration(final Element element, final ParserContext addPropertyValueIfNotEmpty(JOB_EXCEPTION_HANDLER, "jobExceptionHandler", element, factory); setEventConfigs(element, factory); setPropertiesValue(element, factory); - String result = element.getAttribute(ID_ATTRIBUTE) + "Conf"; - parserContext.getRegistry().registerBeanDefinition(result, factory.getBeanDefinition()); - return result; + return factory.getBeanDefinition(); } protected abstract Class getJobConfigurationDTO(); @@ -107,21 +106,19 @@ private String createJobConfiguration(final Element element, final ParserContext protected abstract void setPropertiesValue(final Element element, final BeanDefinitionBuilder factory); private List createJobListeners(final Element element) { - List listenerElements = DomUtils.getChildElementsByTagName(element, LISTENER_TAG); - List result = new ManagedList<>(listenerElements.size()); - for (Element each : listenerElements) { - String className = each.getAttribute(CLASS_ATTRIBUTE); - BeanDefinitionBuilder factory = BeanDefinitionBuilder.rootBeanDefinition(className); + Element listenerElement = DomUtils.getChildElementByTagName(element, LISTENER_TAG); + Element distributedListenerElement = DomUtils.getChildElementByTagName(element, DISTRIBUTED_LISTENER_TAG); + List result = new ManagedList<>(2); + if (null != listenerElement) { + BeanDefinitionBuilder factory = BeanDefinitionBuilder.rootBeanDefinition(listenerElement.getAttribute(CLASS_ATTRIBUTE)); + factory.setScope(BeanDefinition.SCOPE_PROTOTYPE); + result.add(factory.getBeanDefinition()); + } + if (null != distributedListenerElement) { + BeanDefinitionBuilder factory = BeanDefinitionBuilder.rootBeanDefinition(distributedListenerElement.getAttribute(CLASS_ATTRIBUTE)); factory.setScope(BeanDefinition.SCOPE_PROTOTYPE); - try { - Class listenerClass = Class.forName(className); - if (AbstractDistributeOnceElasticJobListener.class.isAssignableFrom(listenerClass)) { - factory.addConstructorArgValue(each.getAttribute(LISTENER_STARTED_TIMEOUT_MILLISECONDS_ATTRIBUTE)); - factory.addConstructorArgValue(each.getAttribute(LISTENER_COMPLETED_TIMEOUT_MILLISECONDS_ATTRIBUTE)); - } - } catch (final ClassNotFoundException ex) { - throw new RuntimeException(ex); - } + factory.addConstructorArgValue(distributedListenerElement.getAttribute(DISTRIBUTED_LISTENER_STARTED_TIMEOUT_MILLISECONDS_ATTRIBUTE)); + factory.addConstructorArgValue(distributedListenerElement.getAttribute(DISTRIBUTED_LISTENER_COMPLETED_TIMEOUT_MILLISECONDS_ATTRIBUTE)); result.add(factory.getBeanDefinition()); } return result; diff --git a/elastic-job-lite/elastic-job-lite-spring/src/main/resources/META-INF/namespace/job.xsd b/elastic-job-lite/elastic-job-lite-spring/src/main/resources/META-INF/namespace/job.xsd index 3cde9806fa..0c424b7600 100644 --- a/elastic-job-lite/elastic-job-lite-spring/src/main/resources/META-INF/namespace/job.xsd +++ b/elastic-job-lite/elastic-job-lite-spring/src/main/resources/META-INF/namespace/job.xsd @@ -10,8 +10,13 @@ - - + + + + + + + @@ -41,7 +46,8 @@ - + + diff --git a/elastic-job-lite/elastic-job-lite-spring/src/test/resources/META-INF/job/base.xml b/elastic-job-lite/elastic-job-lite-spring/src/test/resources/META-INF/job/base.xml index 776276304f..e75c678632 100644 --- a/elastic-job-lite/elastic-job-lite-spring/src/test/resources/META-INF/job/base.xml +++ b/elastic-job-lite/elastic-job-lite-spring/src/test/resources/META-INF/job/base.xml @@ -11,7 +11,7 @@ http://www.dangdang.com/schema/ddframe/reg/reg.xsd "> - + diff --git a/elastic-job-lite/elastic-job-lite-spring/src/test/resources/META-INF/job/withListener.xml b/elastic-job-lite/elastic-job-lite-spring/src/test/resources/META-INF/job/withListener.xml index 511313e541..6eaca133e2 100644 --- a/elastic-job-lite/elastic-job-lite-spring/src/test/resources/META-INF/job/withListener.xml +++ b/elastic-job-lite/elastic-job-lite-spring/src/test/resources/META-INF/job/withListener.xml @@ -8,9 +8,9 @@ http://www.dangdang.com/schema/ddframe/job/job.xsd "> - - + + diff --git a/elastic-job-lite/elastic-job-lite-spring/src/test/resources/conf/job/conf.properties b/elastic-job-lite/elastic-job-lite-spring/src/test/resources/conf/job/conf.properties index 04c37df24f..635e1380fc 100644 --- a/elastic-job-lite/elastic-job-lite-spring/src/test/resources/conf/job/conf.properties +++ b/elastic-job-lite/elastic-job-lite-spring/src/test/resources/conf/job/conf.properties @@ -1,9 +1,11 @@ regCenter.serverLists=localhost:3181 -regCenter.namespace=dd-job +regCenter.namespace=elastic-job-lite-spring-test regCenter.baseSleepTimeMilliseconds=1000 regCenter.maxSleepTimeMilliseconds=3000 regCenter.maxRetries=3 +simpleJob.id=simpleElasticJob_namespace_listener +simpleJob.class=com.dangdang.ddframe.job.lite.fixture.FooSimpleElasticJob simpleJob.cron=0/1 * * * * ? simpleJob.shardingTotalCount=3 simpleJob.shardingItemParameters=0=A,1=B,2=C