You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by te...@apache.org on 2020/09/24 02:10:30 UTC

[shardingsphere-elasticjob] branch master updated: update for dingtalk module (#1490)

This is an automated email from the ASF dual-hosted git repository.

technoboy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere-elasticjob.git


The following commit(s) were added to refs/heads/master by this push:
     new 466165b  update for dingtalk module (#1490)
466165b is described below

commit 466165bb64a11c025c12bb29331126518e1eb9d2
Author: Yanjie Zhou <zh...@aliyun.com>
AuthorDate: Thu Sep 24 10:10:14 2020 +0800

    update for dingtalk module (#1490)
---
 docs/content/dev-manual/error-handler.cn.md        |   1 +
 docs/content/dev-manual/error-handler.en.md        |   1 +
 .../DingtalkConfiguration.java                     |   2 +-
 .../DingtalkJobErrorHandler.java                   |  13 ++-
 .../error/handler/env/DingtalkEnvironment.java     | 127 ---------------------
 ...sphere.elasticjob.error.handler.JobErrorHandler |   2 +-
 .../resources/conf/error-handler-dingtalk.yaml}    |  17 +--
 .../DingtalkJobErrorHandlerTest.java               |  11 +-
 .../fixture/DingtalkInternalController.java        |   2 +-
 .../resources/conf/error-handler-dingtalk.yaml}    |  18 ++-
 ...talk.properties => error-handler-dingtalk.yaml} |  19 ++-
 11 files changed, 40 insertions(+), 173 deletions(-)

diff --git a/docs/content/dev-manual/error-handler.cn.md b/docs/content/dev-manual/error-handler.cn.md
index 28ed9a4..538b945 100644
--- a/docs/content/dev-manual/error-handler.cn.md
+++ b/docs/content/dev-manual/error-handler.cn.md
@@ -13,5 +13,6 @@ weight = 3
 | *已知实现类*           | *详细说明*                      |
 | --------------------- | ------------------------------ |
 | LogJobErrorHandler    | 记录作业异常日志,但不中断作业执行 |
+| DingtalkJobErrorHandler | 记录作业异常日志,但不中断作业执行,并且发送钉钉消息通知 |
 | ThrowJobErrorHandler  | 抛出系统异常并中断作业执行        |
 | IgnoreJobErrorHandler | 忽略系统异常且不中断作业执行      |
diff --git a/docs/content/dev-manual/error-handler.en.md b/docs/content/dev-manual/error-handler.en.md
index 4731138..2275a31 100644
--- a/docs/content/dev-manual/error-handler.en.md
+++ b/docs/content/dev-manual/error-handler.en.md
@@ -13,5 +13,6 @@ Error handler strategy, used to handle error when exception occur during job exe
 | *Implementation Class* | *Description*                             |
 | ---------------------- | ----------------------------------------- |
 | LogJobErrorHandler     | Log error and do not interrupt job        |
+| DingtalkJobErrorHandler  | Log error and do not interrupt job and send dingtalk message notification |
 | ThrowJobErrorHandler   | Throw system exception and interrupt job  |
 | IgnoreJobErrorHandler  | Ignore exception and do not interrupt job |
diff --git a/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/config/DingtalkConfiguration.java b/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkConfiguration.java
similarity index 94%
rename from elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/config/DingtalkConfiguration.java
rename to elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkConfiguration.java
index b65e7d7..e8b35ca 100644
--- a/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/config/DingtalkConfiguration.java
+++ b/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkConfiguration.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.elasticjob.error.handler.config;
+package org.apache.shardingsphere.elasticjob.error.handler.dingtalk;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
diff --git a/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/impl/DingtalkJobErrorHandler.java b/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkJobErrorHandler.java
similarity index 92%
rename from elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/impl/DingtalkJobErrorHandler.java
rename to elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkJobErrorHandler.java
index a759fdb..3600454 100644
--- a/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/impl/DingtalkJobErrorHandler.java
+++ b/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkJobErrorHandler.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.elasticjob.error.handler.impl;
+package org.apache.shardingsphere.elasticjob.error.handler.dingtalk;
 
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableMap;
@@ -31,14 +31,14 @@ import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
 import org.apache.shardingsphere.elasticjob.error.handler.JobErrorHandler;
-import org.apache.shardingsphere.elasticjob.error.handler.config.DingtalkConfiguration;
-import org.apache.shardingsphere.elasticjob.error.handler.env.DingtalkEnvironment;
 import org.apache.shardingsphere.elasticjob.infra.exception.JobConfigurationException;
 import org.apache.shardingsphere.elasticjob.infra.json.GsonFactory;
+import org.apache.shardingsphere.elasticjob.infra.yaml.YamlEngine;
 
 import javax.crypto.Mac;
 import javax.crypto.spec.SecretKeySpec;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.io.UnsupportedEncodingException;
@@ -56,6 +56,10 @@ import java.util.Collections;
 @Slf4j
 public final class DingtalkJobErrorHandler implements JobErrorHandler {
     
+    private static final String CONFIG_PREFIX = "dingtalk";
+    
+    private static final String ERROR_HANDLER_CONFIG = "conf/error-handler-dingtalk.yaml";
+    
     @Setter
     private DingtalkConfiguration dingtalkConfiguration;
     
@@ -68,7 +72,8 @@ public final class DingtalkJobErrorHandler implements JobErrorHandler {
     @Override
     public void handleException(final String jobName, final Throwable cause) {
         if (null == dingtalkConfiguration) {
-            dingtalkConfiguration = DingtalkEnvironment.getInstance().getDingtalkConfiguration();
+            InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(ERROR_HANDLER_CONFIG);
+            dingtalkConfiguration = YamlEngine.unmarshal(CONFIG_PREFIX, inputStream, DingtalkConfiguration.class);
         }
         HttpPost httpPost = new HttpPost(getUrl());
         RequestConfig requestConfig = RequestConfig.custom()
diff --git a/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/env/DingtalkEnvironment.java b/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/env/DingtalkEnvironment.java
deleted file mode 100644
index 813f607..0000000
--- a/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/env/DingtalkEnvironment.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * 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.shardingsphere.elasticjob.error.handler.env;
-
-import com.google.common.base.Preconditions;
-import com.google.common.base.Strings;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.shardingsphere.elasticjob.error.handler.config.DingtalkConfiguration;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Properties;
-
-/**
- * Bootstrap env.
- */
-@Slf4j
-public final class DingtalkEnvironment {
-    
-    private static final DingtalkEnvironment INSTANCE = new DingtalkEnvironment();
-    
-    private static final String PROPERTIES_PATH = "conf/elasticjob-dingtalk.properties";
-    
-    private static final String CONFIG_PREFIX = "elasticjob.dingtalk";
-    
-    private final Properties properties;
-    
-    private DingtalkEnvironment() {
-        properties = getProperties();
-    }
-    
-    /**
-     * Get instance of Dingtalk env.
-     *
-     * @return instance of Dingtalk env.
-     */
-    public static DingtalkEnvironment getInstance() {
-        return INSTANCE;
-    }
-    
-    private Properties getProperties() {
-        Properties result = new Properties();
-        try (InputStream fileInputStream = this.getClass().getClassLoader().getResourceAsStream(PROPERTIES_PATH)) {
-            if (fileInputStream != null) {
-                result.load(fileInputStream);
-            }
-        } catch (final IOException ex) {
-            log.warn("Can not load properties file from path: '{}'.", PROPERTIES_PATH);
-        }
-        setPropertiesByEnv(result);
-        return result;
-    }
-    
-    private void setPropertiesByEnv(final Properties prop) {
-        for (EnvironmentArgument each : EnvironmentArgument.values()) {
-            String key = each.getKey();
-            String value = System.getProperties().getProperty(String.join(".", CONFIG_PREFIX, key));
-            if (!Strings.isNullOrEmpty(value)) {
-                log.info("Load property {} with value {} from ENV.", key, value);
-                prop.setProperty(each.getKey(), value);
-            }
-        }
-    }
-    
-    /**
-     * Get dingtalk configuration.
-     *
-     * @return dingtalk configuration
-     */
-    public DingtalkConfiguration getDingtalkConfiguration() {
-        String webhook = getValue(EnvironmentArgument.WEBHOOK);
-        String keyword = getValue(EnvironmentArgument.KEYWORD);
-        String secret = getValue(EnvironmentArgument.SECRET);
-        String connectTimeout = getValue(EnvironmentArgument.CONNECT_TIMEOUT);
-        String readTimeout = getValue(EnvironmentArgument.READ_TIMEOUT);
-        return new DingtalkConfiguration(webhook, keyword, secret, Integer.parseInt(connectTimeout), Integer.parseInt(readTimeout));
-    }
-    
-    private String getValue(final EnvironmentArgument environmentArgument) {
-        String result = properties.getProperty(environmentArgument.getKey(), environmentArgument.getDefaultValue());
-        if (environmentArgument.isRequired()) {
-            Preconditions.checkState(!Strings.isNullOrEmpty(result), String.format("Property `%s` is required.", environmentArgument.getKey()));
-        }
-        return result;
-    }
-    
-    /**
-     * Env args.
-     */
-    @RequiredArgsConstructor
-    @Getter
-    public enum EnvironmentArgument {
-        
-        WEBHOOK("webhook", "", true),
-        
-        KEYWORD("keyword", "", false),
-        
-        SECRET("secret", "", false),
-        
-        CONNECT_TIMEOUT("connectTimeout", "3000", false),
-        
-        READ_TIMEOUT("readTimeout", "5000", false);
-        
-        private final String key;
-        
-        private final String defaultValue;
-        
-        private final boolean required;
-    }
-}
diff --git a/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/resources/META-INF/services/org.apache.shardingsphere.elasticjob.error.handler.JobErrorHandler b/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/resources/META-INF/services/org.apache.shardingsphere.elasticjob.error.handler.JobErrorHandler
index dd51dae..cd9894e 100644
--- a/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/resources/META-INF/services/org.apache.shardingsphere.elasticjob.error.handler.JobErrorHandler
+++ b/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/resources/META-INF/services/org.apache.shardingsphere.elasticjob.error.handler.JobErrorHandler
@@ -15,4 +15,4 @@
 # limitations under the License.
 #
 
-org.apache.shardingsphere.elasticjob.error.handler.impl.DingtalkJobErrorHandler
+org.apache.shardingsphere.elasticjob.error.handler.dingtalk.DingtalkJobErrorHandler
diff --git a/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/test/resources/conf/elasticjob-dingtalk.properties b/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/resources/conf/error-handler-dingtalk.yaml
similarity index 54%
rename from elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/test/resources/conf/elasticjob-dingtalk.properties
rename to elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/resources/conf/error-handler-dingtalk.yaml
index 434d1d5..647afcf 100644
--- a/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/test/resources/conf/elasticjob-dingtalk.properties
+++ b/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/resources/conf/error-handler-dingtalk.yaml
@@ -15,14 +15,9 @@
 # limitations under the License.
 #
 
-# It can also be configured through startup parameters, E.g: -Delasticjob.dingtalk.webhook=param1  -Delasticjob.dingtalk.keyword=param2  -Delasticjob.dingtalk.secret=param3
-# Then webhook used to interface validation , required
-webhook=http://localhost:9876/send?access_token=42eead064e81ce81fc6af2c107fbe10a4339a3d40a7db8abf5b34d8261527a3f
-# Then keyword used to interface validation
-keyword=keyword
-# Then secret used to interface validation
-secret=SEC0b0a6b13b6823b95737dd83491c23adee5d8a7a649899a12217e038eddc84ff4
-# The connection time used to invoke the interface
-connectTimeout=5000
-# The timeout used to read the results
-readTimeout=6000
+dingtalk:
+  webhook:
+  keyword:
+  secret:
+  connectTimeout:
+  readTimeout:
diff --git a/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/impl/DingtalkJobErrorHandlerTest.java b/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkJobErrorHandlerTest.java
similarity index 91%
rename from elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/impl/DingtalkJobErrorHandlerTest.java
rename to elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkJobErrorHandlerTest.java
index fab0370..03fea26 100644
--- a/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/impl/DingtalkJobErrorHandlerTest.java
+++ b/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkJobErrorHandlerTest.java
@@ -15,11 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.elasticjob.error.handler.impl;
+package org.apache.shardingsphere.elasticjob.error.handler.dingtalk;
 
 import lombok.SneakyThrows;
-import org.apache.shardingsphere.elasticjob.error.handler.config.DingtalkConfiguration;
-import org.apache.shardingsphere.elasticjob.error.handler.impl.fixture.DingtalkInternalController;
+import org.apache.shardingsphere.elasticjob.error.handler.dingtalk.fixture.DingtalkInternalController;
 import org.apache.shardingsphere.elasticjob.restful.NettyRestfulService;
 import org.apache.shardingsphere.elasticjob.restful.NettyRestfulServiceConfiguration;
 import org.apache.shardingsphere.elasticjob.restful.RestfulService;
@@ -41,7 +40,7 @@ import static org.mockito.Mockito.verify;
 @RunWith(MockitoJUnitRunner.class)
 public final class DingtalkJobErrorHandlerTest {
     
-    private static final int PORT = 9876;
+    private static final int PORT = 9875;
     
     private static final String HOST = "localhost";
     
@@ -71,7 +70,7 @@ public final class DingtalkJobErrorHandlerTest {
     @Test
     public void assertHandleExceptionWithWrongToken() {
         DingtalkJobErrorHandler actual = new DingtalkJobErrorHandler();
-        actual.setDingtalkConfiguration(new DingtalkConfiguration("http://localhost:9876/send?access_token=wrongToken",
+        actual.setDingtalkConfiguration(new DingtalkConfiguration("http://localhost:9875/send?access_token=wrongToken",
                 null, null, 3000, 500));
         setStaticFieldValue(actual);
         Throwable cause = new RuntimeException("test");
@@ -82,7 +81,7 @@ public final class DingtalkJobErrorHandlerTest {
     @Test
     public void assertHandleExceptionWithWrongUrl() {
         DingtalkJobErrorHandler actual = new DingtalkJobErrorHandler();
-        actual.setDingtalkConfiguration(new DingtalkConfiguration("http://localhost:9876/404?access_token=wrongToken",
+        actual.setDingtalkConfiguration(new DingtalkConfiguration("http://localhost:9875/404?access_token=wrongToken",
                 null, null, 3000, 500));
         setStaticFieldValue(actual);
         Throwable cause = new RuntimeException("test");
diff --git a/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/impl/fixture/DingtalkInternalController.java b/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/fixture/DingtalkInternalController.java
similarity index 98%
rename from elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/impl/fixture/DingtalkInternalController.java
rename to elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/fixture/DingtalkInternalController.java
index b79ba3a..2c99106 100644
--- a/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/impl/fixture/DingtalkInternalController.java
+++ b/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/fixture/DingtalkInternalController.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.elasticjob.error.handler.impl.fixture;
+package org.apache.shardingsphere.elasticjob.error.handler.dingtalk.fixture;
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
diff --git a/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/resources/conf/elasticjob-dingtalk.properties b/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/test/resources/conf/error-handler-dingtalk.yaml
similarity index 63%
rename from elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/resources/conf/elasticjob-dingtalk.properties
rename to elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/test/resources/conf/error-handler-dingtalk.yaml
index ca0de98..cbed252 100644
--- a/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/main/resources/conf/elasticjob-dingtalk.properties
+++ b/elasticjob-error-handler/elasticjob-error-handler-dingtalk/src/test/resources/conf/error-handler-dingtalk.yaml
@@ -15,15 +15,11 @@
 # limitations under the License.
 #
 
-# It can also be configured through startup parameters, E.g: -Delasticjob.dingtalk.webhook=param1  -Delasticjob.dingtalk.keyword=param2  -Delasticjob.dingtalk.secret=param3
-# Then webhook used to interface validation , required
-webhook=
-# Then keyword used to interface validation
-keyword=
-# Then secret used to interface validation
-secret=
-# The connection time used to invoke the interface
-connectTimeout=
-# The timeout used to read the results
-readTimeout=
+dingtalk:
+  webhook: http://localhost:9875/send?access_token=42eead064e81ce81fc6af2c107fbe10a4339a3d40a7db8abf5b34d8261527a3f
+  keyword: keyword
+  secret: SEC0b0a6b13b6823b95737dd83491c23adee5d8a7a649899a12217e038eddc84ff4
+  connectTimeout: 5000
+  readTimeout: 3000
+
 
diff --git a/examples/elasticjob-example-lite-java/src/main/resources/conf/elasticjob-dingtalk.properties b/examples/elasticjob-example-lite-java/src/main/resources/conf/error-handler-dingtalk.yaml
similarity index 54%
rename from examples/elasticjob-example-lite-java/src/main/resources/conf/elasticjob-dingtalk.properties
rename to examples/elasticjob-example-lite-java/src/main/resources/conf/error-handler-dingtalk.yaml
index fe40fac..b077c75 100644
--- a/examples/elasticjob-example-lite-java/src/main/resources/conf/elasticjob-dingtalk.properties
+++ b/examples/elasticjob-example-lite-java/src/main/resources/conf/error-handler-dingtalk.yaml
@@ -15,14 +15,11 @@
 # limitations under the License.
 #
 
-# It can also be configured through startup parameters, E.g: -Delasticjob.dingtalk.webhook=param1  -Delasticjob.dingtalk.keyword=param2  -Delasticjob.dingtalk.secret=param3
-# Then webhook used to interface validation , required
-webhook=https://oapi.dingtalk.com/robot/send?access_token=42eead064e81ce81fc6af2c107fbe10a4339a3d40a7db8abf5b34d8261527a3f
-# Then keyword used to interface validation
-keyword=keyword
-# Then secret used to interface validation
-secret=SEC0b0a6b13b6823b95737dd83491c23adee5d8a7a649899a12217e038eddc84ff4
-# The connection time used to invoke the interface
-connectTimeout=5000
-# The timeout used to read the results
-readTimeout=6000
+dingtalk:
+  webhook: https://oapi.dingtalk.com/robot/send?access_token=42eead064e81ce81fc6af2c107fbe10a4339a3d40a7db8abf5b34d8261527a3f
+  keyword: keyword
+  secret: SEC0b0a6b13b6823b95737dd83491c23adee5d8a7a649899a12217e038eddc84ff4
+  connectTimeout: 3000
+  readTimeout: 5000
+
+