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

wangyang pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git


The following commit(s) were added to refs/heads/dev by this push:
     new a866de1754 [Improvement][Alert] HTTP Related Alert plugin add retry 
logic (#14972)
a866de1754 is described below

commit a866de1754bd81fca2c72e5beced4288700903d3
Author: 旺阳 <w...@lqwang.net>
AuthorDate: Tue Oct 10 21:20:43 2023 -0500

    [Improvement][Alert] HTTP Related Alert plugin add retry logic (#14972)
    
    * add RetryHandler for http client
    
    * fix spotless
    
    * update
---
 .../alert/api/HttpServiceRetryStrategy.java        | 73 ++++++++++++++++++++++
 .../plugin/alert/dingtalk/DingTalkSender.java      |  6 +-
 .../plugin/alert/feishu/HttpRequestUtil.java       |  7 ++-
 .../plugin/alert/http/HttpSender.java              |  6 +-
 .../plugin/alert/pagerduty/PagerDutySender.java    |  4 +-
 .../plugin/alert/slack/SlackSender.java            |  5 +-
 .../plugin/alert/telegram/TelegramSender.java      |  6 +-
 .../plugin/alert/webexteams/WebexTeamsSender.java  |  4 +-
 .../plugin/alert/wechat/WeChatSender.java          |  9 ++-
 9 files changed, 107 insertions(+), 13 deletions(-)

diff --git 
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-api/src/main/java/org/apache/dolphinscheduler/alert/api/HttpServiceRetryStrategy.java
 
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-api/src/main/java/org/apache/dolphinscheduler/alert/api/HttpServiceRetryStrategy.java
new file mode 100644
index 0000000000..dfe2c3d5c4
--- /dev/null
+++ 
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-api/src/main/java/org/apache/dolphinscheduler/alert/api/HttpServiceRetryStrategy.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to 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. Apache Software Foundation (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.dolphinscheduler.alert.api;
+
+import org.apache.http.HttpEntityEnclosingRequest;
+import org.apache.http.HttpRequest;
+import org.apache.http.NoHttpResponseException;
+import org.apache.http.client.HttpRequestRetryHandler;
+import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.http.protocol.HttpContext;
+
+import java.io.IOException;
+import java.io.InterruptedIOException;
+import java.net.SocketException;
+import java.net.UnknownHostException;
+
+import javax.net.ssl.SSLException;
+
+public class HttpServiceRetryStrategy implements HttpRequestRetryHandler {
+
+    public static final HttpServiceRetryStrategy retryStrategy = new 
HttpServiceRetryStrategy();
+
+    private static final int RETRY_COUNT = 3;
+
+    private static final long RETRY_INTERVAL_TIME = 2000L;
+
+    @Override
+    public boolean retryRequest(IOException exception, int executionCount, 
HttpContext httpContext) {
+        if (executionCount > RETRY_COUNT) {
+            return false;
+        }
+
+        if (exception instanceof SSLException) {
+            return false;
+        }
+
+        if (exception instanceof UnknownHostException ||
+                exception instanceof InterruptedIOException
+                || exception instanceof NoHttpResponseException
+                || exception instanceof SocketException) {
+            // retry interval time
+            try {
+                Thread.sleep(RETRY_INTERVAL_TIME);
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+            }
+            return true;
+        }
+
+        HttpClientContext clientContext = HttpClientContext.adapt(httpContext);
+        HttpRequest request = clientContext.getRequest();
+
+        // Retry if the request is considered idempotent
+        return !(request instanceof HttpEntityEnclosingRequest);
+    }
+}
diff --git 
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-dingtalk/src/main/java/org/apache/dolphinscheduler/plugin/alert/dingtalk/DingTalkSender.java
 
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-dingtalk/src/main/java/org/apache/dolphinscheduler/plugin/alert/dingtalk/DingTalkSender.java
index 010cfc1a5d..c0070ac11c 100644
--- 
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-dingtalk/src/main/java/org/apache/dolphinscheduler/plugin/alert/dingtalk/DingTalkSender.java
+++ 
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-dingtalk/src/main/java/org/apache/dolphinscheduler/plugin/alert/dingtalk/DingTalkSender.java
@@ -18,6 +18,7 @@
 package org.apache.dolphinscheduler.plugin.alert.dingtalk;
 
 import org.apache.dolphinscheduler.alert.api.AlertResult;
+import org.apache.dolphinscheduler.alert.api.HttpServiceRetryStrategy;
 import org.apache.dolphinscheduler.common.utils.JSONUtils;
 
 import org.apache.commons.codec.binary.Base64;
@@ -108,11 +109,12 @@ public final class DingTalkSender {
         HttpHost httpProxy = new HttpHost(proxy, port);
         CredentialsProvider provider = new BasicCredentialsProvider();
         provider.setCredentials(new AuthScope(httpProxy), new 
UsernamePasswordCredentials(user, password));
-        return 
HttpClients.custom().setDefaultCredentialsProvider(provider).build();
+        return 
HttpClients.custom().setRetryHandler(HttpServiceRetryStrategy.retryStrategy)
+                .setDefaultCredentialsProvider(provider).build();
     }
 
     private static CloseableHttpClient getDefaultClient() {
-        return HttpClients.createDefault();
+        return 
HttpClients.custom().setRetryHandler(HttpServiceRetryStrategy.retryStrategy).build();
     }
 
     private static RequestConfig getProxyConfig(String proxy, int port) {
diff --git 
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-feishu/src/main/java/org/apache/dolphinscheduler/plugin/alert/feishu/HttpRequestUtil.java
 
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-feishu/src/main/java/org/apache/dolphinscheduler/plugin/alert/feishu/HttpRequestUtil.java
index 2ba373df08..c981175610 100644
--- 
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-feishu/src/main/java/org/apache/dolphinscheduler/plugin/alert/feishu/HttpRequestUtil.java
+++ 
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-feishu/src/main/java/org/apache/dolphinscheduler/plugin/alert/feishu/HttpRequestUtil.java
@@ -17,6 +17,8 @@
 
 package org.apache.dolphinscheduler.plugin.alert.feishu;
 
+import org.apache.dolphinscheduler.alert.api.HttpServiceRetryStrategy;
+
 import org.apache.http.HttpHost;
 import org.apache.http.auth.AuthScope;
 import org.apache.http.auth.UsernamePasswordCredentials;
@@ -40,9 +42,10 @@ public final class HttpRequestUtil {
             HttpHost httpProxy = new HttpHost(proxy, port);
             CredentialsProvider provider = new BasicCredentialsProvider();
             provider.setCredentials(new AuthScope(httpProxy), new 
UsernamePasswordCredentials(user, password));
-            return 
HttpClients.custom().setDefaultCredentialsProvider(provider).build();
+            return 
HttpClients.custom().setRetryHandler(HttpServiceRetryStrategy.retryStrategy)
+                    .setDefaultCredentialsProvider(provider).build();
         } else {
-            return HttpClients.createDefault();
+            return 
HttpClients.custom().setRetryHandler(HttpServiceRetryStrategy.retryStrategy).build();
         }
     }
 
diff --git 
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/src/main/java/org/apache/dolphinscheduler/plugin/alert/http/HttpSender.java
 
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/src/main/java/org/apache/dolphinscheduler/plugin/alert/http/HttpSender.java
index 9aeb7ab3c9..bdd6cf15cd 100644
--- 
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/src/main/java/org/apache/dolphinscheduler/plugin/alert/http/HttpSender.java
+++ 
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-http/src/main/java/org/apache/dolphinscheduler/plugin/alert/http/HttpSender.java
@@ -18,6 +18,7 @@
 package org.apache.dolphinscheduler.plugin.alert.http;
 
 import org.apache.dolphinscheduler.alert.api.AlertResult;
+import org.apache.dolphinscheduler.alert.api.HttpServiceRetryStrategy;
 import org.apache.dolphinscheduler.common.utils.JSONUtils;
 
 import org.apache.commons.lang3.StringUtils;
@@ -28,7 +29,7 @@ import org.apache.http.client.methods.HttpPost;
 import org.apache.http.client.methods.HttpRequestBase;
 import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
 
 import java.io.IOException;
@@ -106,7 +107,8 @@ public final class HttpSender {
     }
 
     public String getResponseString(HttpRequestBase httpRequest) throws 
IOException {
-        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
+        CloseableHttpClient httpClient =
+                
HttpClients.custom().setRetryHandler(HttpServiceRetryStrategy.retryStrategy).build();
         CloseableHttpResponse response = httpClient.execute(httpRequest);
         HttpEntity entity = response.getEntity();
         return EntityUtils.toString(entity, DEFAULT_CHARSET);
diff --git 
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-pagerduty/src/main/java/org/apache/dolphinscheduler/plugin/alert/pagerduty/PagerDutySender.java
 
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-pagerduty/src/main/java/org/apache/dolphinscheduler/plugin/alert/pagerduty/PagerDutySender.java
index fb586cd255..568faf167b 100644
--- 
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-pagerduty/src/main/java/org/apache/dolphinscheduler/plugin/alert/pagerduty/PagerDutySender.java
+++ 
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-pagerduty/src/main/java/org/apache/dolphinscheduler/plugin/alert/pagerduty/PagerDutySender.java
@@ -18,6 +18,7 @@
 package org.apache.dolphinscheduler.plugin.alert.pagerduty;
 
 import org.apache.dolphinscheduler.alert.api.AlertResult;
+import org.apache.dolphinscheduler.alert.api.HttpServiceRetryStrategy;
 import org.apache.dolphinscheduler.common.utils.JSONUtils;
 
 import org.apache.http.HttpStatus;
@@ -69,7 +70,8 @@ public final class PagerDutySender {
 
     private AlertResult send(AlertResult alertResult, String url, String 
requestBody) throws IOException {
         HttpPost httpPost = constructHttpPost(url, requestBody);
-        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpClient httpClient =
+                
HttpClients.custom().setRetryHandler(HttpServiceRetryStrategy.retryStrategy).build();
 
         try {
             CloseableHttpResponse response = httpClient.execute(httpPost);
diff --git 
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackSender.java
 
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackSender.java
index aeb1782452..60b2f8281a 100644
--- 
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackSender.java
+++ 
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-slack/src/main/java/org/apache/dolphinscheduler/plugin/alert/slack/SlackSender.java
@@ -17,6 +17,7 @@
 
 package org.apache.dolphinscheduler.plugin.alert.slack;
 
+import org.apache.dolphinscheduler.alert.api.HttpServiceRetryStrategy;
 import org.apache.dolphinscheduler.common.utils.JSONUtils;
 
 import org.apache.commons.lang3.StringUtils;
@@ -65,7 +66,9 @@ public final class SlackSender {
      * @return slack response
      */
     public String sendMessage(String title, String content) {
-        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
+        try (
+                CloseableHttpClient httpClient =
+                        
HttpClients.custom().setRetryHandler(HttpServiceRetryStrategy.retryStrategy).build())
 {
             Map<String, Object> paramMap = new HashMap<>();
             paramMap.put(SlackParamsConstants.SLACK_BOT_NAME, botName);
             paramMap.put(SlackParamsConstants.TEXT, title);
diff --git 
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-telegram/src/main/java/org/apache/dolphinscheduler/plugin/alert/telegram/TelegramSender.java
 
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-telegram/src/main/java/org/apache/dolphinscheduler/plugin/alert/telegram/TelegramSender.java
index cc85c8ea21..8aba9f5c2b 100644
--- 
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-telegram/src/main/java/org/apache/dolphinscheduler/plugin/alert/telegram/TelegramSender.java
+++ 
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-telegram/src/main/java/org/apache/dolphinscheduler/plugin/alert/telegram/TelegramSender.java
@@ -19,6 +19,7 @@ package org.apache.dolphinscheduler.plugin.alert.telegram;
 
 import org.apache.dolphinscheduler.alert.api.AlertData;
 import org.apache.dolphinscheduler.alert.api.AlertResult;
+import org.apache.dolphinscheduler.alert.api.HttpServiceRetryStrategy;
 import org.apache.dolphinscheduler.common.utils.JSONUtils;
 
 import org.apache.commons.lang3.StringUtils;
@@ -239,14 +240,15 @@ public final class TelegramSender {
     }
 
     private static CloseableHttpClient getDefaultClient() {
-        return HttpClients.createDefault();
+        return 
HttpClients.custom().setRetryHandler(HttpServiceRetryStrategy.retryStrategy).build();
     }
 
     private static CloseableHttpClient getProxyClient(String proxy, int port, 
String user, String password) {
         HttpHost httpProxy = new HttpHost(proxy, port);
         CredentialsProvider provider = new BasicCredentialsProvider();
         provider.setCredentials(new AuthScope(httpProxy), new 
UsernamePasswordCredentials(user, password));
-        return 
HttpClients.custom().setDefaultCredentialsProvider(provider).build();
+        return 
HttpClients.custom().setRetryHandler(HttpServiceRetryStrategy.retryStrategy)
+                .setDefaultCredentialsProvider(provider).build();
     }
 
     private static RequestConfig getProxyConfig(String proxy, int port) {
diff --git 
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/src/main/java/org/apache/dolphinscheduler/plugin/alert/webexteams/WebexTeamsSender.java
 
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/src/main/java/org/apache/dolphinscheduler/plugin/alert/webexteams/WebexTeamsSender.java
index f651631c89..cd9ca87157 100644
--- 
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/src/main/java/org/apache/dolphinscheduler/plugin/alert/webexteams/WebexTeamsSender.java
+++ 
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/src/main/java/org/apache/dolphinscheduler/plugin/alert/webexteams/WebexTeamsSender.java
@@ -19,6 +19,7 @@ package org.apache.dolphinscheduler.plugin.alert.webexteams;
 
 import org.apache.dolphinscheduler.alert.api.AlertData;
 import org.apache.dolphinscheduler.alert.api.AlertResult;
+import org.apache.dolphinscheduler.alert.api.HttpServiceRetryStrategy;
 import org.apache.dolphinscheduler.common.utils.JSONUtils;
 
 import org.apache.http.HttpStatus;
@@ -77,7 +78,8 @@ public final class WebexTeamsSender {
     }
 
     private void send(AlertResult alertResult, AlertData alertData) throws 
IOException {
-        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpClient httpClient =
+                
HttpClients.custom().setRetryHandler(HttpServiceRetryStrategy.retryStrategy).build();
 
         try {
             HttpPost httpPost = constructHttpPost(getMessage(alertData), 
botAccessToken);
diff --git 
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-wechat/src/main/java/org/apache/dolphinscheduler/plugin/alert/wechat/WeChatSender.java
 
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-wechat/src/main/java/org/apache/dolphinscheduler/plugin/alert/wechat/WeChatSender.java
index 67360aec9c..4b49e0436d 100644
--- 
a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-wechat/src/main/java/org/apache/dolphinscheduler/plugin/alert/wechat/WeChatSender.java
+++ 
b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-wechat/src/main/java/org/apache/dolphinscheduler/plugin/alert/wechat/WeChatSender.java
@@ -24,6 +24,7 @@ import static 
org.apache.dolphinscheduler.plugin.alert.wechat.WeChatAlertConstan
 
 import org.apache.dolphinscheduler.alert.api.AlertConstants;
 import org.apache.dolphinscheduler.alert.api.AlertResult;
+import org.apache.dolphinscheduler.alert.api.HttpServiceRetryStrategy;
 import org.apache.dolphinscheduler.common.utils.JSONUtils;
 
 import org.apache.commons.lang3.StringUtils;
@@ -80,7 +81,9 @@ public final class WeChatSender {
     }
 
     private static String post(String url, String data) throws IOException {
-        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
+        try (
+                CloseableHttpClient httpClient =
+                        
HttpClients.custom().setRetryHandler(HttpServiceRetryStrategy.retryStrategy).build())
 {
             HttpPost httpPost = new HttpPost(url);
             httpPost.setEntity(new StringEntity(data, 
WeChatAlertConstants.CHARSET));
             CloseableHttpResponse response = httpClient.execute(httpPost);
@@ -133,7 +136,9 @@ public final class WeChatSender {
     private static String get(String url) throws IOException {
         String resp;
 
-        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
+        try (
+                CloseableHttpClient httpClient =
+                        
HttpClients.custom().setRetryHandler(HttpServiceRetryStrategy.retryStrategy).build();)
 {
             HttpGet httpGet = new HttpGet(url);
             try (CloseableHttpResponse response = httpClient.execute(httpGet)) 
{
                 HttpEntity entity = response.getEntity();

Reply via email to