You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2020/10/20 15:11:51 UTC

[shardingsphere-elasticjob] branch master updated: Revise error handler configuration builder (#1621)

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

zhangliang 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 e1bf862  Revise error handler configuration builder (#1621)
e1bf862 is described below

commit e1bf8623713742d19500518545848f91b6d9944d
Author: Liang Zhang <te...@163.com>
AuthorDate: Tue Oct 20 23:10:50 2020 +0800

    Revise error handler configuration builder (#1621)
    
    * Revise DingtalkConfiguration
    
    * Revise WechatConfiguration
    
    * Revise EmailConfiguration
    
    * Fix example
    
    * Fix DingtalkConfiguration
---
 .../handler/dingtalk/DingtalkConfiguration.java    |  61 +++++++-----
 .../dingtalk/DingtalkConfigurationTest.java        |  58 +++---------
 .../dingtalk/DingtalkJobErrorHandlerTest.java      |   4 +-
 .../error/handler/email/EmailConfiguration.java    |  48 +++++-----
 .../handler/email/EmailConfigurationTest.java      | 104 +++++++--------------
 .../handler/email/EmailJobErrorHandlerTest.java    |   2 +-
 .../error/handler/wechat/WechatConfiguration.java  |  28 +++---
 .../handler/wechat/WechatConfigurationTest.java    |  35 ++-----
 .../handler/wechat/WechatJobErrorHandlerTest.java  |   8 +-
 .../elasticjob/lite/example/JavaMain.java          |   8 +-
 10 files changed, 143 insertions(+), 213 deletions(-)

diff --git a/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-dingtalk/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkConfiguration.java b/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-dingtalk/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkConfiguration.java
index b6ab4eb..9d5f29f 100644
--- a/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-dingtalk/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkConfiguration.java
+++ b/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-dingtalk/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkConfiguration.java
@@ -27,7 +27,7 @@ import org.apache.shardingsphere.elasticjob.error.handler.ErrorHandlerConfigurat
 /**
  * Job error handler configuration for send error message via dingtalk.
  */
-@RequiredArgsConstructor
+@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
 @Getter
 public final class DingtalkConfiguration implements ErrorHandlerConfiguration {
     
@@ -47,36 +47,55 @@ public final class DingtalkConfiguration implements ErrorHandlerConfiguration {
     }
     
     /**
-     * Create DingTalk configuration builder.
+     * Create dingtalk configuration builder.
      *
      * @param webhook webhook
-     * @param keyword keyword
-     * @param secret  secret
-     * @return DingTalk configuration builder
+     * @return dingtalk configuration builder
      */
-    public static Builder newBuilder(final String webhook, final String keyword,
-                                     final String secret) {
-        return new Builder(webhook, keyword, secret);
+    public static Builder newBuilder(final String webhook) {
+        return new Builder(webhook);
     }
     
     @RequiredArgsConstructor(access = AccessLevel.PRIVATE)
-    public static class Builder {
+    public static final class Builder {
         
         private final String webhook;
         
-        private final String keyword;
+        private String keyword;
         
-        private final String secret;
+        private String secret;
         
         private int connectTimeoutMillisecond = 3000;
         
         private int readTimeoutMillisecond = 5000;
         
         /**
-         * Set connect timeout.
+         * Set keyword.
          *
-         * @param connectTimeoutMillisecond connect timeout
-         * @return DingTalk configuration builder
+         * @param keyword keyword
+         * @return dingTalk configuration builder
+         */
+        public Builder keyword(final String keyword) {
+            this.keyword = keyword;
+            return this;
+        }
+        
+        /**
+         * Set secret.
+         *
+         * @param secret secret
+         * @return dingTalk configuration builder
+         */
+        public Builder secret(final String secret) {
+            this.secret = secret;
+            return this;
+        }
+        
+        /**
+         * Set connect timeout millisecond.
+         *
+         * @param connectTimeoutMillisecond connect timeout millisecond
+         * @return dingTalk configuration builder
          */
         public Builder connectTimeoutMillisecond(final int connectTimeoutMillisecond) {
             this.connectTimeoutMillisecond = connectTimeoutMillisecond;
@@ -84,10 +103,10 @@ public final class DingtalkConfiguration implements ErrorHandlerConfiguration {
         }
         
         /**
-         * Set read timeout.
+         * Set read timeout millisecond.
          *
-         * @param readTimeoutMillisecond read timeout
-         * @return DingTalk configuration builder
+         * @param readTimeoutMillisecond read timeout millisecond
+         * @return dingTalk configuration builder
          */
         public Builder readTimeoutMillisecond(final int readTimeoutMillisecond) {
             this.readTimeoutMillisecond = readTimeoutMillisecond;
@@ -95,14 +114,12 @@ public final class DingtalkConfiguration implements ErrorHandlerConfiguration {
         }
         
         /**
-         * Build DingTalk configuration.
+         * Build dingTalk configuration.
          *
-         * @return DingTalk configuration
+         * @return dingTalk configuration
          */
-        public final DingtalkConfiguration build() {
+        public DingtalkConfiguration build() {
             Preconditions.checkArgument(!Strings.isNullOrEmpty(webhook), "webhook can not be empty.");
-            Preconditions.checkArgument(!Strings.isNullOrEmpty(keyword), "keyword can not be empty.");
-            Preconditions.checkArgument(!Strings.isNullOrEmpty(secret), "secret can not be empty.");
             return new DingtalkConfiguration(webhook, keyword, secret, connectTimeoutMillisecond, readTimeoutMillisecond);
         }
     }
diff --git a/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkConfigurationTest.java b/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkConfigurationTest.java
index 5ef02c0..0038fd1 100644
--- a/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkConfigurationTest.java
+++ b/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkConfigurationTest.java
@@ -22,62 +22,34 @@ import org.junit.runner.RunWith;
 import org.mockito.junit.MockitoJUnitRunner;
 
 import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThat;
 
 @RunWith(MockitoJUnitRunner.class)
-public class DingtalkConfigurationTest {
-    
-    private static final String WEBHOOK = "webhook";
-    
-    private static final String KEYWORD = "keyword";
-    
-    private static final String SECRET = "secret";
-    
-    private static final int CONNECT_TIMEOUT = 4000;
-    
-    private static final int CONNECT_TIMEOUT_DEFAULT_VALUE = 3000;
-    
-    private static final int READ_TIMEOUT = 4000;
-    
-    private static final int READ_TIMEOUT_DEFAULT_VALUE = 5000;
-    
-    private static final String EMPTY_STRING = "";
+public final class DingtalkConfigurationTest {
     
     @Test
     public void assertBuildAllProperties() {
-        DingtalkConfiguration actual = DingtalkConfiguration.newBuilder(WEBHOOK, KEYWORD, SECRET)
-                .connectTimeoutMillisecond(CONNECT_TIMEOUT)
-                .readTimeoutMillisecond(READ_TIMEOUT)
-                .build();
-        assertThat(actual.getWebhook(), is(WEBHOOK));
-        assertThat(actual.getKeyword(), is(KEYWORD));
-        assertThat(actual.getSecret(), is(SECRET));
-        assertThat(actual.getConnectTimeoutMillisecond(), is(CONNECT_TIMEOUT));
-        assertThat(actual.getReadTimeoutMillisecond(), is(CONNECT_TIMEOUT));
+        DingtalkConfiguration actual = DingtalkConfiguration.newBuilder("webhook").keyword("keyword").secret("secret").connectTimeoutMillisecond(4000).readTimeoutMillisecond(2000).build();
+        assertThat(actual.getWebhook(), is("webhook"));
+        assertThat(actual.getKeyword(), is("keyword"));
+        assertThat(actual.getSecret(), is("secret"));
+        assertThat(actual.getConnectTimeoutMillisecond(), is(4000));
+        assertThat(actual.getReadTimeoutMillisecond(), is(2000));
     }
     
     @Test
     public void assertBuildRequiredProperties() {
-        DingtalkConfiguration actual = DingtalkConfiguration.newBuilder(WEBHOOK, KEYWORD, SECRET).build();
-        assertThat(actual.getWebhook(), is(WEBHOOK));
-        assertThat(actual.getKeyword(), is(KEYWORD));
-        assertThat(actual.getSecret(), is(SECRET));
-        assertThat(actual.getConnectTimeoutMillisecond(), is(CONNECT_TIMEOUT_DEFAULT_VALUE));
-        assertThat(actual.getReadTimeoutMillisecond(), is(READ_TIMEOUT_DEFAULT_VALUE));
+        DingtalkConfiguration actual = DingtalkConfiguration.newBuilder("webhook").build();
+        assertThat(actual.getWebhook(), is("webhook"));
+        assertNull(actual.getKeyword());
+        assertNull(actual.getSecret());
+        assertThat(actual.getConnectTimeoutMillisecond(), is(3000));
+        assertThat(actual.getReadTimeoutMillisecond(), is(5000));
     }
     
     @Test(expected = IllegalArgumentException.class)
     public void assertBuildWithEmptyWebhook() {
-        DingtalkConfiguration.newBuilder(EMPTY_STRING, KEYWORD, SECRET).build();
-    }
-    
-    @Test(expected = IllegalArgumentException.class)
-    public void assertBuildWithEmptyKeyword() {
-        DingtalkConfiguration.newBuilder(WEBHOOK, EMPTY_STRING, SECRET).build();
-    }
-    
-    @Test(expected = IllegalArgumentException.class)
-    public void assertBuildWithEmptySecret() {
-        DingtalkConfiguration.newBuilder(WEBHOOK, KEYWORD, EMPTY_STRING).build();
+        DingtalkConfiguration.newBuilder("").build();
     }
 }
diff --git a/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkJobErrorHandlerTest.java b/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkJobErrorHandlerTest.java
index 794b8d2..87e1141 100644
--- a/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkJobErrorHandlerTest.java
+++ b/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-dingtalk/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/dingtalk/DingtalkJobErrorHandlerTest.java
@@ -125,10 +125,10 @@ public final class DingtalkJobErrorHandlerTest {
     }
     
     private DingtalkConfiguration createDingtalkConfiguration(final String webhook) {
-        return new DingtalkConfiguration(webhook, "mocked_keyword", "mocked_secret", 4000, 6000);
+        return DingtalkConfiguration.newBuilder(webhook).keyword("mocked_keyword").secret("mocked_secret").connectTimeoutMillisecond(4000).readTimeoutMillisecond(6000).build();
     }
     
     private DingtalkConfiguration createNoSignJobDingtalkConfiguration(final String webhook) {
-        return new DingtalkConfiguration(webhook, "mocked_keyword", null, 4000, 6000);
+        return DingtalkConfiguration.newBuilder(webhook).keyword("mocked_keyword").connectTimeoutMillisecond(4000).readTimeoutMillisecond(6000).build();
     }
 }
diff --git a/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-email/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/email/EmailConfiguration.java b/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-email/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/email/EmailConfiguration.java
index ed9c457..b6a8957 100644
--- a/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-email/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/email/EmailConfiguration.java
+++ b/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-email/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/email/EmailConfiguration.java
@@ -27,7 +27,7 @@ import org.apache.shardingsphere.elasticjob.error.handler.ErrorHandlerConfigurat
 /**
  * Job error handler configuration for send error message via email.
  */
-@RequiredArgsConstructor
+@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
 @Getter
 public final class EmailConfiguration implements ErrorHandlerConfiguration {
     
@@ -59,23 +59,22 @@ public final class EmailConfiguration implements ErrorHandlerConfiguration {
     }
     
     /**
-     * Create Email configuration builder.
+     * Create email configuration builder.
      *
-     * @param host     host
-     * @param port     port
+     * @param host host
+     * @param port port
      * @param username username
      * @param password password
-     * @param from     from
-     * @param to       to
-     * @return Email configuration builder
+     * @param from from
+     * @param to to
+     * @return email configuration builder
      */
-    public static Builder newBuilder(final String host, final int port, final String username,
-                                     final String password, final String from, final String to) {
+    public static Builder newBuilder(final String host, final int port, final String username, final String password, final String from, final String to) {
         return new Builder(host, port, username, password, from, to);
     }
     
     @RequiredArgsConstructor(access = AccessLevel.PRIVATE)
-    public static class Builder {
+    public static final class Builder {
         
         private final String host;
         
@@ -100,10 +99,10 @@ public final class EmailConfiguration implements ErrorHandlerConfiguration {
         private boolean debug;
         
         /**
-         * Set useSsl.
+         * Set whether use SSL.
          *
-         * @param useSsl useSsl
-         * @return Email configuration builder
+         * @param useSsl use SSL or not
+         * @return email configuration builder
          */
         public Builder useSsl(final boolean useSsl) {
             this.useSsl = useSsl;
@@ -114,7 +113,7 @@ public final class EmailConfiguration implements ErrorHandlerConfiguration {
          * Set subject.
          *
          * @param subject subject
-         * @return Email configuration builder
+         * @return email configuration builder
          */
         public Builder subject(final String subject) {
             if (!Strings.isNullOrEmpty(subject)) {
@@ -127,7 +126,7 @@ public final class EmailConfiguration implements ErrorHandlerConfiguration {
          * Set cc.
          *
          * @param cc cc
-         * @return Email configuration builder
+         * @return email configuration builder
          */
         public Builder cc(final String cc) {
             this.cc = cc;
@@ -138,7 +137,7 @@ public final class EmailConfiguration implements ErrorHandlerConfiguration {
          * Set bcc.
          *
          * @param bcc bcc
-         * @return Email configuration builder
+         * @return email configuration builder
          */
         public Builder bcc(final String bcc) {
             this.bcc = bcc;
@@ -146,10 +145,10 @@ public final class EmailConfiguration implements ErrorHandlerConfiguration {
         }
         
         /**
-         * Set debug.
+         * Set whether use debug mode.
          *
-         * @param debug debug
-         * @return Email configuration builder
+         * @param debug use debug mode or not
+         * @return email configuration builder
          */
         public Builder debug(final boolean debug) {
             this.debug = debug;
@@ -157,19 +156,18 @@ public final class EmailConfiguration implements ErrorHandlerConfiguration {
         }
         
         /**
-         * Build Email configuration.
+         * Build email configuration.
          *
-         * @return Email configuration
+         * @return email configuration
          */
-        public final EmailConfiguration build() {
+        public EmailConfiguration build() {
             Preconditions.checkArgument(!Strings.isNullOrEmpty(host), "host can not be empty.");
-            Preconditions.checkArgument(0 < port && 65535 > port, "port should larger than 0 and small than 65535.");
+            Preconditions.checkArgument(port > 0 && port < 65535, "port should larger than 0 and small than 65535.");
             Preconditions.checkArgument(!Strings.isNullOrEmpty(username), "username can not be empty.");
             Preconditions.checkArgument(!Strings.isNullOrEmpty(password), "password can not be empty.");
             Preconditions.checkArgument(!Strings.isNullOrEmpty(from), "from can not be empty.");
             Preconditions.checkArgument(!Strings.isNullOrEmpty(to), "to can not be empty.");
-            return new EmailConfiguration(host, port, username, password, useSsl, subject,
-                    from, to, cc, bcc, debug);
+            return new EmailConfiguration(host, port, username, password, useSsl, subject, from, to, cc, bcc, debug);
         }
     }
 }
diff --git a/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-email/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/email/EmailConfigurationTest.java b/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-email/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/email/EmailConfigurationTest.java
index abb65bd..da36dfa 100644
--- a/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-email/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/email/EmailConfigurationTest.java
+++ b/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-email/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/email/EmailConfigurationTest.java
@@ -22,111 +22,71 @@ import org.junit.runner.RunWith;
 import org.mockito.junit.MockitoJUnitRunner;
 
 import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
 
 @RunWith(MockitoJUnitRunner.class)
-public class EmailConfigurationTest {
-    
-    private static final String HOST = "smtp.xxx.com";
-    
-    private static final int PORT = 25;
-    
-    private static final String USERNAME = "username";
-    
-    private static final String PASSWORD = "password";
-    
-    private static final String FROM = "from";
-    
-    private static final String TO = "to";
-    
-    private static final String SUBJECT = "subject";
-    
-    private static final String SUBJECT_DEFAULT_VALUE = "ElasticJob error message";
-    
-    private static final String CC = "cc";
-    
-    private static final String BCC = "bcc";
-    
-    private static final boolean USE_SSL = false;
-    
-    private static final boolean USE_SSL_DEFAULT_VALUE = true;
-    
-    private static final boolean DEBUG = true;
-    
-    private static final boolean DEBUG_DEFAULT_VALUE = false;
-    
-    private static final String EMPTY_STRING = "";
+public final class EmailConfigurationTest {
     
     @Test
     public void assertBuildAllProperties() {
-        EmailConfiguration actual = EmailConfiguration.newBuilder(HOST, PORT, USERNAME, PASSWORD, FROM, TO)
-                .useSsl(USE_SSL)
-                .subject(SUBJECT)
-                .cc(CC)
-                .bcc(BCC)
-                .debug(DEBUG)
-                .build();
-        assertThat(actual.getHost(), is(HOST));
-        assertThat(actual.getPort(), is(PORT));
-        assertThat(actual.getUsername(), is(USERNAME));
-        assertThat(actual.getPassword(), is(PASSWORD));
-        assertThat(actual.isUseSsl(), is(USE_SSL));
-        assertThat(actual.getSubject(), is(SUBJECT));
-        assertThat(actual.getFrom(), is(FROM));
-        assertThat(actual.getTo(), is(TO));
-        assertThat(actual.getCc(), is(CC));
-        assertThat(actual.getBcc(), is(BCC));
-        assertThat(actual.isDebug(), is(DEBUG));
+        EmailConfiguration actual = EmailConfiguration.newBuilder("smtp.xxx.com", 25, "username", "password", "from@xx.xx", "to@xx.xx")
+                .useSsl(false).subject("subject").cc("cc@xx.xx").bcc("bcc@xx.xx").debug(true).build();
+        assertThat(actual.getHost(), is("smtp.xxx.com"));
+        assertThat(actual.getPort(), is(25));
+        assertThat(actual.getUsername(), is("username"));
+        assertThat(actual.getPassword(), is("password"));
+        assertFalse(actual.isUseSsl());
+        assertThat(actual.getSubject(), is("subject"));
+        assertThat(actual.getFrom(), is("from@xx.xx"));
+        assertThat(actual.getTo(), is("to@xx.xx"));
+        assertThat(actual.getCc(), is("cc@xx.xx"));
+        assertThat(actual.getBcc(), is("bcc@xx.xx"));
+        assertTrue(actual.isDebug());
     }
     
     @Test
     public void assertBuildRequiredProperties() {
-        EmailConfiguration actual = EmailConfiguration.newBuilder(HOST, PORT, USERNAME, PASSWORD, FROM, TO)
-                .build();
-        assertThat(actual.getHost(), is(HOST));
-        assertThat(actual.getPort(), is(PORT));
-        assertThat(actual.getUsername(), is(USERNAME));
-        assertThat(actual.getPassword(), is(PASSWORD));
-        assertThat(actual.isUseSsl(), is(USE_SSL_DEFAULT_VALUE));
-        assertThat(actual.getSubject(), is(SUBJECT_DEFAULT_VALUE));
-        assertThat(actual.getFrom(), is(FROM));
-        assertThat(actual.getTo(), is(TO));
-        assertThat(actual.isDebug(), is(DEBUG_DEFAULT_VALUE));
+        EmailConfiguration actual = EmailConfiguration.newBuilder("smtp.xxx.com", 25, "username", "password", "from@xx.xx", "to@xx.xx").build();
+        assertThat(actual.getHost(), is("smtp.xxx.com"));
+        assertThat(actual.getPort(), is(25));
+        assertThat(actual.getUsername(), is("username"));
+        assertThat(actual.getPassword(), is("password"));
+        assertTrue(actual.isUseSsl());
+        assertThat(actual.getSubject(), is("ElasticJob error message"));
+        assertThat(actual.getFrom(), is("from@xx.xx"));
+        assertThat(actual.getTo(), is("to@xx.xx"));
+        assertFalse(actual.isDebug());
     }
     
     @Test(expected = IllegalArgumentException.class)
     public void assertBuildWithEmptyHost() {
-        EmailConfiguration.newBuilder(EMPTY_STRING, PORT, USERNAME, PASSWORD, FROM, TO)
-                .build();
+        EmailConfiguration.newBuilder("", 25, "username", "password", "from@xx.xx", "to@xx.xx").build();
     }
     
     @Test(expected = IllegalArgumentException.class)
     public void assertBuildWithInvalidPort() {
-        EmailConfiguration.newBuilder(HOST, -1, USERNAME, PASSWORD, FROM, TO)
-                .build();
+        EmailConfiguration.newBuilder("smtp.xxx.com", -1, "username", "password", "from@xx.xx", "to@xx.xx").build();
     }
     
     @Test(expected = IllegalArgumentException.class)
     public void assertBuildWithEmptyUsername() {
-        EmailConfiguration.newBuilder(HOST, PORT, EMPTY_STRING, PASSWORD, FROM, TO)
-                .build();
+        EmailConfiguration.newBuilder("smtp.xxx.com", 25, "", "password", "from@xx.xx", "to@xx.xx").build();
     }
     
     @Test(expected = IllegalArgumentException.class)
     public void assertBuildWithEmptyPassword() {
-        EmailConfiguration.newBuilder(HOST, PORT, USERNAME, EMPTY_STRING, FROM, TO)
-                .build();
+        EmailConfiguration.newBuilder("smtp.xxx.com", 25, "username", "", "from@xx.xx", "to@xx.xx").build();
     }
     
     @Test(expected = IllegalArgumentException.class)
     public void assertBuildWithEmptyFrom() {
-        EmailConfiguration.newBuilder(HOST, PORT, USERNAME, PASSWORD, EMPTY_STRING, TO)
-                .build();
+        EmailConfiguration.newBuilder("smtp.xxx.com", 25, "username", "password", "", "to@xx.xx").build();
     }
     
     @Test(expected = IllegalArgumentException.class)
     public void assertBuildWithEmptyTo() {
-        EmailConfiguration.newBuilder(HOST, PORT, USERNAME, PASSWORD, FROM, EMPTY_STRING)
-                .build();
+        EmailConfiguration.newBuilder("smtp.xxx.com", 25, "username", "password", "from@xx.xx", "").build();
     }
 }
diff --git a/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-email/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/email/EmailJobErrorHandlerTest.java b/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-email/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/email/EmailJobErrorHandlerTest.java
index ad90299..ad2b841 100644
--- a/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-email/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/email/EmailJobErrorHandlerTest.java
+++ b/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-email/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/email/EmailJobErrorHandlerTest.java
@@ -61,6 +61,6 @@ public final class EmailJobErrorHandlerTest {
     }
     
     private EmailConfiguration createEmailConfiguration() {
-        return new EmailConfiguration("xxx", 465, "xxx", "xxx", true, "Unit test notification", "from@xxx.com", "to1@xxx.com,to2@xxx.com", "cc@xxx.com", "bcc@xxx.com", false);
+        return EmailConfiguration.newBuilder("xxx", 465, "xxx", "xxx", "from@xxx.xx", "to1@xxx.xx,to2@xxx.xx").subject("Unit test notification").cc("cc@xxx.xx").bcc("bcc@xxx.xx").build();
     }
 }
diff --git a/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/wechat/WechatConfiguration.java b/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/wechat/WechatConfiguration.java
index 38c347a..b35d785 100644
--- a/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/wechat/WechatConfiguration.java
+++ b/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/main/java/org/apache/shardingsphere/elasticjob/error/handler/wechat/WechatConfiguration.java
@@ -27,7 +27,7 @@ import org.apache.shardingsphere.elasticjob.error.handler.ErrorHandlerConfigurat
 /**
  * Job error handler configuration for send error message via wechat.
  */
-@RequiredArgsConstructor
+@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
 @Getter
 public final class WechatConfiguration implements ErrorHandlerConfiguration {
     
@@ -43,29 +43,29 @@ public final class WechatConfiguration implements ErrorHandlerConfiguration {
     }
     
     /**
-     * Create WeChat configuration builder.
+     * Create wechat configuration builder.
      *
      * @param webhook webhook
-     * @return WeChat configuration builder
+     * @return wechat configuration builder
      */
     public static Builder newBuilder(final String webhook) {
         return new Builder(webhook);
     }
     
     @RequiredArgsConstructor(access = AccessLevel.PRIVATE)
-    public static class Builder {
+    public static final class Builder {
         
         private final String webhook;
         
         private int connectTimeoutMillisecond = 3000;
         
-        private int readTimeoutMillisecond = 3000;
+        private int readTimeoutMillisecond = 5000;
         
         /**
-         * Set connect timeout.
+         * Set connect timeout millisecond.
          *
-         * @param connectTimeoutMillisecond connect timeout
-         * @return WeChat configuration builder
+         * @param connectTimeoutMillisecond connect timeout millisecond
+         * @return wechat configuration builder
          */
         public Builder connectTimeoutMillisecond(final int connectTimeoutMillisecond) {
             this.connectTimeoutMillisecond = connectTimeoutMillisecond;
@@ -73,10 +73,10 @@ public final class WechatConfiguration implements ErrorHandlerConfiguration {
         }
         
         /**
-         * Set read timeout.
+         * Set read timeout millisecond.
          *
-         * @param readTimeoutMillisecond read timeout
-         * @return WeChat configuration builder
+         * @param readTimeoutMillisecond read timeout millisecond
+         * @return weChat configuration builder
          */
         public Builder readTimeoutMillisecond(final int readTimeoutMillisecond) {
             this.readTimeoutMillisecond = readTimeoutMillisecond;
@@ -84,11 +84,11 @@ public final class WechatConfiguration implements ErrorHandlerConfiguration {
         }
         
         /**
-         * Build WeChat configuration.
+         * Build wechat configuration.
          *
-         * @return WeChat configuration
+         * @return wechat configuration
          */
-        public final WechatConfiguration build() {
+        public WechatConfiguration build() {
             Preconditions.checkArgument(!Strings.isNullOrEmpty(webhook), "webhook can not be empty.");
             return new WechatConfiguration(webhook, connectTimeoutMillisecond, readTimeoutMillisecond);
         }
diff --git a/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/wechat/WechatConfigurationTest.java b/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/wechat/WechatConfigurationTest.java
index 81f80fb..8bbe2e2 100644
--- a/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/wechat/WechatConfigurationTest.java
+++ b/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/wechat/WechatConfigurationTest.java
@@ -25,41 +25,26 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 
 @RunWith(MockitoJUnitRunner.class)
-public class WechatConfigurationTest {
-    
-    private static final String WEBHOOK = "webhook";
-    
-    private static final int CONNECT_TIMEOUT = 5000;
-    
-    private static final int CONNECT_TIMEOUT_DEFAULT_VALUE = 3000;
-    
-    private static final int READ_TIMEOUT = 5000;
-    
-    private static final int READ_TIMEOUT_DEFAULT_VALUE = 3000;
-    
-    private static final String EMPTY_STRING = "";
+public final class WechatConfigurationTest {
     
     @Test
     public void assertBuildAllProperties() {
-        WechatConfiguration actual = WechatConfiguration.newBuilder(WEBHOOK)
-                .connectTimeoutMillisecond(CONNECT_TIMEOUT)
-                .readTimeoutMillisecond(READ_TIMEOUT)
-                .build();
-        assertThat(actual.getWebhook(), is(WEBHOOK));
-        assertThat(actual.getConnectTimeoutMillisecond(), is(CONNECT_TIMEOUT));
-        assertThat(actual.getReadTimeoutMillisecond(), is(READ_TIMEOUT));
+        WechatConfiguration actual = WechatConfiguration.newBuilder("webhook").connectTimeoutMillisecond(4000).readTimeoutMillisecond(2000).build();
+        assertThat(actual.getWebhook(), is("webhook"));
+        assertThat(actual.getConnectTimeoutMillisecond(), is(4000));
+        assertThat(actual.getReadTimeoutMillisecond(), is(2000));
     }
     
     @Test
     public void assertBuildRequiredProperties() {
-        WechatConfiguration actual = WechatConfiguration.newBuilder(WEBHOOK).build();
-        assertThat(actual.getWebhook(), is(WEBHOOK));
-        assertThat(actual.getConnectTimeoutMillisecond(), is(CONNECT_TIMEOUT_DEFAULT_VALUE));
-        assertThat(actual.getReadTimeoutMillisecond(), is(READ_TIMEOUT_DEFAULT_VALUE));
+        WechatConfiguration actual = WechatConfiguration.newBuilder("webhook").build();
+        assertThat(actual.getWebhook(), is("webhook"));
+        assertThat(actual.getConnectTimeoutMillisecond(), is(3000));
+        assertThat(actual.getReadTimeoutMillisecond(), is(5000));
     }
     
     @Test(expected = IllegalArgumentException.class)
     public void assertBuildWithEmptyWebhook() {
-        WechatConfiguration.newBuilder(EMPTY_STRING).build();
+        WechatConfiguration.newBuilder("").build();
     }
 }
diff --git a/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/wechat/WechatJobErrorHandlerTest.java b/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/wechat/WechatJobErrorHandlerTest.java
index b58c00d..363b77f 100644
--- a/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/wechat/WechatJobErrorHandlerTest.java
+++ b/elasticjob-error-handler/elasticjob-error-handler-type/elasticjob-error-handler-wechat/src/test/java/org/apache/shardingsphere/elasticjob/error/handler/wechat/WechatJobErrorHandlerTest.java
@@ -70,7 +70,7 @@ public final class WechatJobErrorHandlerTest {
         WechatJobErrorHandler actual = getWechatJobErrorHandler();
         setStaticFieldValue(actual);
         Throwable cause = new RuntimeException("test");
-        actual.handleException("test_job", new WechatConfiguration("http://localhost:9872/send?key=mocked_key", 1000, 2000), cause);
+        actual.handleException("test_job", WechatConfiguration.newBuilder("http://localhost:9872/send?key=mocked_key").connectTimeoutMillisecond(1000).readTimeoutMillisecond(2000).build(), cause);
         verify(log).info("An exception has occurred in Job '{}', Notification to wechat was successful.", "test_job", cause);
     }
     
@@ -79,7 +79,7 @@ public final class WechatJobErrorHandlerTest {
         WechatJobErrorHandler actual = getWechatJobErrorHandler();
         setStaticFieldValue(actual);
         Throwable cause = new RuntimeException("test");
-        actual.handleException("test_job", new WechatConfiguration("http://localhost:9872/send?key=wrong_key", 1000, 2000), cause);
+        actual.handleException("test_job", WechatConfiguration.newBuilder("http://localhost:9872/send?key=wrong_key").connectTimeoutMillisecond(1000).readTimeoutMillisecond(2000).build(), cause);
         verify(log).info("An exception has occurred in Job '{}', But failed to send alert by wechat because of: {}", "test_job", "token is invalid", cause);
     }
     
@@ -88,7 +88,7 @@ public final class WechatJobErrorHandlerTest {
         WechatJobErrorHandler actual = getWechatJobErrorHandler();
         setStaticFieldValue(actual);
         Throwable cause = new RuntimeException("test");
-        actual.handleException("test_job", new WechatConfiguration("http://wrongUrl", 1000, 2000), cause);
+        actual.handleException("test_job", WechatConfiguration.newBuilder("http://wrongUrl").connectTimeoutMillisecond(1000).readTimeoutMillisecond(2000).build(), cause);
         verify(log).error("An exception has occurred in Job '{}', But failed to send alert by wechat because of", "test_job", cause);
     }
     
@@ -97,7 +97,7 @@ public final class WechatJobErrorHandlerTest {
         WechatJobErrorHandler actual = getWechatJobErrorHandler();
         setStaticFieldValue(actual);
         Throwable cause = new RuntimeException("test");
-        actual.handleException("test_job", new WechatConfiguration("http://localhost:9872/404", 1000, 2000), cause);
+        actual.handleException("test_job", WechatConfiguration.newBuilder("http://localhost:9872/404").connectTimeoutMillisecond(1000).readTimeoutMillisecond(2000).build(), cause);
         verify(log).error("An exception has occurred in Job '{}', But failed to send alert by wechat because of: Unexpected response status: {}", "test_job", 404, cause);
     }
 
diff --git a/examples/elasticjob-example-lite-java/src/main/java/org/apache/shardingsphere/elasticjob/lite/example/JavaMain.java b/examples/elasticjob-example-lite-java/src/main/java/org/apache/shardingsphere/elasticjob/lite/example/JavaMain.java
index f5d0fe6..e67d656 100644
--- a/examples/elasticjob-example-lite-java/src/main/java/org/apache/shardingsphere/elasticjob/lite/example/JavaMain.java
+++ b/examples/elasticjob-example-lite-java/src/main/java/org/apache/shardingsphere/elasticjob/lite/example/JavaMain.java
@@ -145,17 +145,15 @@ public final class JavaMain {
     }
     
     private static void setDingtalkConfiguration(final JobConfiguration jobConfig) {
-        jobConfig.getExtraConfigurations().add(new DingtalkConfiguration("https://oapi.dingtalk.com/robot/send?access_token=token",
-                "keyword", "secret", 7000, 8000));
+        jobConfig.getExtraConfigurations().add(DingtalkConfiguration.newBuilder("https://oapi.dingtalk.com/robot/send?access_token=token").keyword("keyword").secret("secret").build());
     }
     
     private static void setWechatConfiguration(final JobConfiguration jobConfig) {
-        jobConfig.getExtraConfigurations().add(new WechatConfiguration("https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=key", 9000, 5000));
+        jobConfig.getExtraConfigurations().add(WechatConfiguration.newBuilder("https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=key").build());
     }
     
     private static void setEmailConfiguration(final JobConfiguration jobConfig) {
-        jobConfig.getExtraConfigurations().add(new EmailConfiguration(
-                "host", 465, "username", "password", true, "Test elasticJob error message", "from@xxx.com", "to1@xxx.com,to2xxx.com", "cc@xxx.com", "bcc@xxx.com", false));
+        jobConfig.getExtraConfigurations().add(EmailConfiguration.newBuilder("host", 465, "username", "password", "from@xxx.xx", "to1@xxx.xx,to2xxx.xx").build());
     }
     
     private static String buildScriptCommandLine() throws IOException {