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/07/01 07:29:02 UTC

[shardingsphere-elasticjob-lite] branch master updated: Refactor MonitorService (#782) (#872)

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-lite.git


The following commit(s) were added to refs/heads/master by this push:
     new 2ceb8a7  Refactor MonitorService (#782) (#872)
2ceb8a7 is described below

commit 2ceb8a7b6af696ddf45aa8067a5496e98ebdf412
Author: Tboy <gu...@immomo.com>
AuthorDate: Wed Jul 1 15:28:44 2020 +0800

    Refactor MonitorService (#782) (#872)
---
 .../elasticjob/lite/config/JobConfiguration.java   | 18 +---------
 .../internal/config/yaml/YamlJobConfiguration.java |  5 +--
 .../lite/internal/monitor/MonitorService.java      | 24 ++++++-------
 .../lite/internal/schedule/SchedulerFacade.java    |  5 ---
 .../lite/internal/setup/SetUpFacade.java           |  5 ---
 .../lite/config/JobConfigurationTest.java          |  4 +--
 .../elasticjob/lite/fixture/LiteYamlConstants.java |  1 -
 .../lite/integrate/AbstractBaseStdJobTest.java     | 14 ++++----
 .../monitor/MonitorServiceDisableTest.java         |  4 +--
 .../internal/monitor/MonitorServiceEnableTest.java | 20 ++++++++---
 .../internal/schedule/SchedulerFacadeTest.java     |  7 ----
 .../lite/internal/setup/SetUpFacadeTest.java       |  6 ----
 .../elasticjob/lite/util/yaml/YamlEngineTest.java  |  2 --
 .../lite/lifecycle/domain/JobSettings.java         |  3 --
 .../internal/settings/JobSettingsAPIImpl.java      |  1 -
 .../lifecycle/fixture/LifecycleYamlConstants.java  |  3 --
 .../internal/settings/JobSettingsAPIImplTest.java  |  2 --
 .../common/AbstractJobBeanDefinitionParser.java    |  1 -
 .../common/BaseJobBeanDefinitionParserTag.java     |  2 --
 .../monitor/handler/MonitorNamespaceHandler.java   | 24 ++++++-------
 .../parser/EmbedMonitorBeanDefinitionParser.java   | 41 ++++++++++++++++++++++
 .../parser/MonitorBeanDefinitionParserTag.java     | 24 ++++++-------
 .../src/main/resources/META-INF/namespace/job.xsd  |  1 -
 .../main/resources/META-INF/namespace/monitor.xsd  | 37 +++++++++++++++++++
 .../src/main/resources/META-INF/spring.handlers    |  1 +
 .../src/main/resources/META-INF/spring.schemas     |  1 +
 .../main/resources/META-INF/applicationContext.xml |  2 +-
 .../src/main/resources/conf/job.properties         |  1 -
 28 files changed, 140 insertions(+), 119 deletions(-)

diff --git a/elastic-job-lite-core/src/main/java/org/apache/shardingsphere/elasticjob/lite/config/JobConfiguration.java b/elastic-job-lite-core/src/main/java/org/apache/shardingsphere/elasticjob/lite/config/JobConfiguration.java
index cbd55d4..d709ae7 100644
--- a/elastic-job-lite-core/src/main/java/org/apache/shardingsphere/elasticjob/lite/config/JobConfiguration.java
+++ b/elastic-job-lite-core/src/main/java/org/apache/shardingsphere/elasticjob/lite/config/JobConfiguration.java
@@ -56,8 +56,6 @@ public final class JobConfiguration {
     
     private final int reconcileIntervalMinutes;
     
-    private final int monitorPort;
-    
     private final String jobShardingStrategyType;
     
     private final String jobExecutorServiceHandlerType;
@@ -110,8 +108,6 @@ public final class JobConfiguration {
         
         private int reconcileIntervalMinutes = 10;
         
-        private int monitorPort = -1;
-        
         private String jobShardingStrategyType;
         
         private String jobExecutorServiceHandlerType;
@@ -243,18 +239,6 @@ public final class JobConfiguration {
         }
         
         /**
-         * Set job monitor port.
-         *
-         * @param monitorPort job monitor port
-         *
-         * @return ElasticJob configuration builder
-         */
-        public Builder monitorPort(final int monitorPort) {
-            this.monitorPort = monitorPort;
-            return this;
-        }
-        
-        /**
          * Set job sharding sharding type.
          *
          * <p>
@@ -366,7 +350,7 @@ public final class JobConfiguration {
             Preconditions.checkArgument(!Strings.isNullOrEmpty(cron), "cron can not be empty.");
             Preconditions.checkArgument(shardingTotalCount > 0, "shardingTotalCount should larger than zero.");
             return new JobConfiguration(jobName, jobType, cron, shardingTotalCount, shardingItemParameters, jobParameter, 
-                    monitorExecution, failover, misfire, maxTimeDiffSeconds, reconcileIntervalMinutes, monitorPort, 
+                    monitorExecution, failover, misfire, maxTimeDiffSeconds, reconcileIntervalMinutes,
                     jobShardingStrategyType, jobExecutorServiceHandlerType, jobErrorHandlerType, description, props, disabled, overwrite);
         }
     }
diff --git a/elastic-job-lite-core/src/main/java/org/apache/shardingsphere/elasticjob/lite/internal/config/yaml/YamlJobConfiguration.java b/elastic-job-lite-core/src/main/java/org/apache/shardingsphere/elasticjob/lite/internal/config/yaml/YamlJobConfiguration.java
index ae5bfad..f4e9e84 100644
--- a/elastic-job-lite-core/src/main/java/org/apache/shardingsphere/elasticjob/lite/internal/config/yaml/YamlJobConfiguration.java
+++ b/elastic-job-lite-core/src/main/java/org/apache/shardingsphere/elasticjob/lite/internal/config/yaml/YamlJobConfiguration.java
@@ -53,8 +53,6 @@ public final class YamlJobConfiguration {
     
     private int reconcileIntervalMinutes;
     
-    private int monitorPort;
-    
     private String jobShardingStrategyType;
     
     private String jobExecutorServiceHandlerType;
@@ -78,7 +76,7 @@ public final class YamlJobConfiguration {
         JobConfiguration result = JobConfiguration.newBuilder(jobName, jobType, cron, shardingTotalCount)
                 .shardingItemParameters(shardingItemParameters).jobParameter(jobParameter)
                 .monitorExecution(monitorExecution).failover(failover).misfire(misfire)
-                .maxTimeDiffSeconds(maxTimeDiffSeconds).reconcileIntervalMinutes(reconcileIntervalMinutes).monitorPort(monitorPort)
+                .maxTimeDiffSeconds(maxTimeDiffSeconds).reconcileIntervalMinutes(reconcileIntervalMinutes)
                 .jobShardingStrategyType(jobShardingStrategyType).jobExecutorServiceHandlerType(jobExecutorServiceHandlerType).jobErrorHandlerType(jobErrorHandlerType)
                 .description(description).disabled(disabled).overwrite(overwrite).build();
         for (Object each : props.keySet()) {
@@ -106,7 +104,6 @@ public final class YamlJobConfiguration {
         result.setMisfire(jobConfiguration.isMisfire());
         result.setMaxTimeDiffSeconds(jobConfiguration.getMaxTimeDiffSeconds());
         result.setReconcileIntervalMinutes(jobConfiguration.getReconcileIntervalMinutes());
-        result.setMonitorPort(jobConfiguration.getMonitorPort());
         result.setJobShardingStrategyType(jobConfiguration.getJobShardingStrategyType());
         result.setJobExecutorServiceHandlerType(jobConfiguration.getJobExecutorServiceHandlerType());
         result.setJobErrorHandlerType(jobConfiguration.getJobErrorHandlerType());
diff --git a/elastic-job-lite-core/src/main/java/org/apache/shardingsphere/elasticjob/lite/internal/monitor/MonitorService.java b/elastic-job-lite-core/src/main/java/org/apache/shardingsphere/elasticjob/lite/internal/monitor/MonitorService.java
index 16d2e7f..9cac5c9 100644
--- a/elastic-job-lite-core/src/main/java/org/apache/shardingsphere/elasticjob/lite/internal/monitor/MonitorService.java
+++ b/elastic-job-lite-core/src/main/java/org/apache/shardingsphere/elasticjob/lite/internal/monitor/MonitorService.java
@@ -18,7 +18,6 @@
 package org.apache.shardingsphere.elasticjob.lite.internal.monitor;
 
 import com.google.common.base.Joiner;
-import org.apache.shardingsphere.elasticjob.lite.internal.config.ConfigurationService;
 import org.apache.shardingsphere.elasticjob.lite.internal.util.SensitiveInfoUtils;
 import org.apache.shardingsphere.elasticjob.lite.reg.base.CoordinatorRegistryCenter;
 import lombok.extern.slf4j.Slf4j;
@@ -41,29 +40,25 @@ import java.util.List;
 @Slf4j
 public final class MonitorService {
     
-    public static final String DUMP_COMMAND = "dump";
-    
-    private final String jobName;
+    public static final String DUMP_COMMAND = "dump@";
+
+    private final int port;
     
     private final CoordinatorRegistryCenter regCenter;
     
-    private final ConfigurationService configService;
-    
     private ServerSocket serverSocket;
     
     private volatile boolean closed;
     
-    public MonitorService(final CoordinatorRegistryCenter regCenter, final String jobName) {
-        this.jobName = jobName;
+    public MonitorService(final CoordinatorRegistryCenter regCenter, final int port) {
         this.regCenter = regCenter;
-        configService = new ConfigurationService(regCenter, jobName);
+        this.port = port;
     }
     
     /**
      * start to listen.
      */
     public void listen() {
-        int port = configService.load(true).getMonitorPort();
         if (port < 0) {
             return;
         }
@@ -94,15 +89,16 @@ public final class MonitorService {
                 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                 Socket ignored = socket) {
             String cmdLine = reader.readLine();
-            if (null != cmdLine && DUMP_COMMAND.equalsIgnoreCase(cmdLine)) {
+            if (null != cmdLine && cmdLine.startsWith(DUMP_COMMAND) && cmdLine.split("@").length == 2) {
                 List<String> result = new ArrayList<>();
-                dumpDirectly("/" + jobName, result);
+                String jobName = cmdLine.split("@")[1];
+                dumpDirectly("/" + jobName, jobName, result);
                 outputMessage(writer, Joiner.on("\n").join(SensitiveInfoUtils.filterSensitiveIps(result)) + "\n");
             }
         }
     }
     
-    private void dumpDirectly(final String path, final List<String> result) {
+    private void dumpDirectly(final String path, final String jobName, final List<String> result) {
         for (String each : regCenter.getChildrenKeys(path)) {
             String zkPath = path + "/" + each;
             String zkValue = regCenter.get(zkPath);
@@ -118,7 +114,7 @@ public final class MonitorService {
             } else {
                 result.add(Joiner.on(" | ").join(zkPath, zkValue, treeCachePath, treeCacheValue));
             }
-            dumpDirectly(zkPath, result);
+            dumpDirectly(zkPath, jobName, result);
         }
     }
     
diff --git a/elastic-job-lite-core/src/main/java/org/apache/shardingsphere/elasticjob/lite/internal/schedule/SchedulerFacade.java b/elastic-job-lite-core/src/main/java/org/apache/shardingsphere/elasticjob/lite/internal/schedule/SchedulerFacade.java
index c297e18..90327b4 100644
--- a/elastic-job-lite-core/src/main/java/org/apache/shardingsphere/elasticjob/lite/internal/schedule/SchedulerFacade.java
+++ b/elastic-job-lite-core/src/main/java/org/apache/shardingsphere/elasticjob/lite/internal/schedule/SchedulerFacade.java
@@ -18,7 +18,6 @@
 package org.apache.shardingsphere.elasticjob.lite.internal.schedule;
 
 import org.apache.shardingsphere.elasticjob.lite.internal.election.LeaderService;
-import org.apache.shardingsphere.elasticjob.lite.internal.monitor.MonitorService;
 import org.apache.shardingsphere.elasticjob.lite.internal.reconcile.ReconcileService;
 import org.apache.shardingsphere.elasticjob.lite.internal.sharding.ExecutionService;
 import org.apache.shardingsphere.elasticjob.lite.internal.sharding.ShardingService;
@@ -37,8 +36,6 @@ public final class SchedulerFacade {
     
     private final ExecutionService executionService;
     
-    private final MonitorService monitorService;
-    
     private final ReconcileService reconcileService;
     
     public SchedulerFacade(final CoordinatorRegistryCenter regCenter, final String jobName) {
@@ -46,7 +43,6 @@ public final class SchedulerFacade {
         leaderService = new LeaderService(regCenter, jobName);
         shardingService = new ShardingService(regCenter, jobName);
         executionService = new ExecutionService(regCenter, jobName);
-        monitorService = new MonitorService(regCenter, jobName);
         reconcileService = new ReconcileService(regCenter, jobName);
     }
     
@@ -66,7 +62,6 @@ public final class SchedulerFacade {
         if (leaderService.isLeader()) {
             leaderService.removeLeader();
         }
-        monitorService.close();
         if (reconcileService.isRunning()) {
             reconcileService.stopAsync();
         }
diff --git a/elastic-job-lite-core/src/main/java/org/apache/shardingsphere/elasticjob/lite/internal/setup/SetUpFacade.java b/elastic-job-lite-core/src/main/java/org/apache/shardingsphere/elasticjob/lite/internal/setup/SetUpFacade.java
index 401a515..b6b56d5 100644
--- a/elastic-job-lite-core/src/main/java/org/apache/shardingsphere/elasticjob/lite/internal/setup/SetUpFacade.java
+++ b/elastic-job-lite-core/src/main/java/org/apache/shardingsphere/elasticjob/lite/internal/setup/SetUpFacade.java
@@ -23,7 +23,6 @@ import org.apache.shardingsphere.elasticjob.lite.internal.config.ConfigurationSe
 import org.apache.shardingsphere.elasticjob.lite.internal.election.LeaderService;
 import org.apache.shardingsphere.elasticjob.lite.internal.instance.InstanceService;
 import org.apache.shardingsphere.elasticjob.lite.internal.listener.ListenerManager;
-import org.apache.shardingsphere.elasticjob.lite.internal.monitor.MonitorService;
 import org.apache.shardingsphere.elasticjob.lite.internal.reconcile.ReconcileService;
 import org.apache.shardingsphere.elasticjob.lite.internal.server.ServerService;
 import org.apache.shardingsphere.elasticjob.lite.internal.sharding.ShardingService;
@@ -46,8 +45,6 @@ public final class SetUpFacade {
     
     private final ShardingService shardingService;
     
-    private final MonitorService monitorService;
-    
     private final ReconcileService reconcileService;
     
     private ListenerManager listenerManager;
@@ -58,7 +55,6 @@ public final class SetUpFacade {
         serverService = new ServerService(regCenter, jobName);
         instanceService = new InstanceService(regCenter, jobName);
         shardingService = new ShardingService(regCenter, jobName);
-        monitorService = new MonitorService(regCenter, jobName);
         reconcileService = new ReconcileService(regCenter, jobName);
         listenerManager = new ListenerManager(regCenter, jobName, elasticJobListeners);
     }
@@ -85,7 +81,6 @@ public final class SetUpFacade {
         serverService.persistOnline(enabled);
         instanceService.persistOnline();
         shardingService.setReshardingFlag();
-        monitorService.listen();
         if (!reconcileService.isRunning()) {
             reconcileService.startAsync();
         }
diff --git a/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/config/JobConfigurationTest.java b/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/config/JobConfigurationTest.java
index eed099f..7a1f016 100644
--- a/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/config/JobConfigurationTest.java
+++ b/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/config/JobConfigurationTest.java
@@ -33,7 +33,7 @@ public final class JobConfigurationTest {
         JobConfiguration actual = JobConfiguration.newBuilder("test_job", JobType.SIMPLE, "0/1 * * * * ?", 3)
                 .shardingItemParameters("0=a,1=b,2=c").jobParameter("param")
                 .monitorExecution(false).failover(true).misfire(false)
-                .maxTimeDiffSeconds(1000).reconcileIntervalMinutes(60).monitorPort(8888)
+                .maxTimeDiffSeconds(1000).reconcileIntervalMinutes(60)
                 .jobShardingStrategyType("AVG_ALLOCATION").jobExecutorServiceHandlerType("SINGLE_THREAD").jobErrorHandlerType("IGNORE")
                 .description("desc").setProperty("key", "value")
                 .disabled(true).overwrite(true).build();
@@ -48,7 +48,6 @@ public final class JobConfigurationTest {
         assertFalse(actual.isMisfire());
         assertThat(actual.getMaxTimeDiffSeconds(), is(1000));
         assertThat(actual.getReconcileIntervalMinutes(), is(60));
-        assertThat(actual.getMonitorPort(), is(8888));
         assertThat(actual.getJobShardingStrategyType(), is("AVG_ALLOCATION"));
         assertThat(actual.getJobExecutorServiceHandlerType(), is("SINGLE_THREAD"));
         assertThat(actual.getJobErrorHandlerType(), is("IGNORE"));
@@ -72,7 +71,6 @@ public final class JobConfigurationTest {
         assertTrue(actual.isMisfire());
         assertThat(actual.getMaxTimeDiffSeconds(), is(-1));
         assertThat(actual.getReconcileIntervalMinutes(), is(10));
-        assertThat(actual.getMonitorPort(), is(-1));
         assertNull(actual.getJobShardingStrategyType());
         assertNull(actual.getJobExecutorServiceHandlerType());
         assertNull(actual.getJobErrorHandlerType());
diff --git a/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/fixture/LiteYamlConstants.java b/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/fixture/LiteYamlConstants.java
index 64a5b68..14c43b8 100644
--- a/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/fixture/LiteYamlConstants.java
+++ b/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/fixture/LiteYamlConstants.java
@@ -33,7 +33,6 @@ public final class LiteYamlConstants {
             + "misfire: false\n"
             + "maxTimeDiffSeconds: %s\n"
             + "reconcileIntervalMinutes: 15\n"
-            + "monitorPort: 8888\n"
             + "description: 'desc'\n"
             + "disabled: true\n"
             + "overwrite: true";
diff --git a/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/integrate/AbstractBaseStdJobTest.java b/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/integrate/AbstractBaseStdJobTest.java
index 063a5b8..8a61f74 100644
--- a/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/integrate/AbstractBaseStdJobTest.java
+++ b/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/integrate/AbstractBaseStdJobTest.java
@@ -35,6 +35,7 @@ import org.apache.shardingsphere.elasticjob.lite.executor.type.impl.ScriptJobExe
 import org.apache.shardingsphere.elasticjob.lite.fixture.EmbedTestingServer;
 import org.apache.shardingsphere.elasticjob.lite.internal.config.yaml.YamlJobConfiguration;
 import org.apache.shardingsphere.elasticjob.lite.internal.election.LeaderService;
+import org.apache.shardingsphere.elasticjob.lite.internal.monitor.MonitorService;
 import org.apache.shardingsphere.elasticjob.lite.internal.schedule.JobRegistry;
 import org.apache.shardingsphere.elasticjob.lite.internal.schedule.SchedulerFacade;
 import org.apache.shardingsphere.elasticjob.lite.internal.server.ServerStatus;
@@ -54,11 +55,16 @@ import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
 public abstract class AbstractBaseStdJobTest {
+
+    protected static final int MONITOR_PORT = 9000;
     
     private static ZookeeperConfiguration zkConfig = new ZookeeperConfiguration(EmbedTestingServer.getConnectionString(), "zkRegTestCenter");
     
     @Getter(value = AccessLevel.PROTECTED)
     private static CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(zkConfig);
+
+    @Getter(value = AccessLevel.PROTECTED)
+    private static MonitorService monitorService = new MonitorService(regCenter, MONITOR_PORT);
     
     @Getter(AccessLevel.PROTECTED)
     private final JobConfiguration jobConfiguration;
@@ -67,8 +73,6 @@ public abstract class AbstractBaseStdJobTest {
     
     private final boolean disabled;
     
-    private final int monitorPort;
-    
     private final LeaderService leaderService;
     
     @Getter(AccessLevel.PROTECTED)
@@ -99,13 +103,11 @@ public abstract class AbstractBaseStdJobTest {
             public void doAfterJobExecutedAtLastCompleted(final ShardingContexts shardingContexts) {
             }
         });
-        monitorPort = -1;
         leaderService = new LeaderService(regCenter, jobName);
     }
     
     @SneakyThrows
-    protected AbstractBaseStdJobTest(final Class<? extends ElasticJob> elasticJobClass, final int monitorPort) {
-        this.monitorPort = monitorPort;
+    protected AbstractBaseStdJobTest(final Class<? extends ElasticJob> elasticJobClass) {
         jobConfiguration = initJobConfig(elasticJobClass);
         jobScheduler = new JobScheduler(regCenter, elasticJobClass.newInstance(), jobConfiguration);
         disabled = false;
@@ -116,7 +118,7 @@ public abstract class AbstractBaseStdJobTest {
         String cron = "0/1 * * * * ?";
         int totalShardingCount = 3;
         String shardingParameters = "0=A,1=B,2=C";
-        Builder builder = JobConfiguration.newBuilder(jobName, getJobType(elasticJobClass), cron, totalShardingCount).shardingItemParameters(shardingParameters).monitorPort(monitorPort)
+        Builder builder = JobConfiguration.newBuilder(jobName, getJobType(elasticJobClass), cron, totalShardingCount).shardingItemParameters(shardingParameters)
                 .jobErrorHandlerType("IGNORE").disabled(disabled).overwrite(true);
         if (DataflowJob.class.isAssignableFrom(elasticJobClass)) {
             builder.setProperty(DataflowJobExecutor.STREAM_PROCESS_KEY, Boolean.TRUE.toString());
diff --git a/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/internal/monitor/MonitorServiceDisableTest.java b/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/internal/monitor/MonitorServiceDisableTest.java
index e30b504..806920b 100644
--- a/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/internal/monitor/MonitorServiceDisableTest.java
+++ b/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/internal/monitor/MonitorServiceDisableTest.java
@@ -26,11 +26,11 @@ import java.io.IOException;
 public final class MonitorServiceDisableTest extends AbstractBaseStdJobTest {
     
     public MonitorServiceDisableTest() {
-        super(TestSimpleJob.class, -1);
+        super(TestSimpleJob.class);
     }
     
     @Test(expected = IOException.class)
     public void assertMonitorWithDumpCommand() throws IOException {
-        SocketUtils.sendCommand(MonitorService.DUMP_COMMAND, 9000);
+        SocketUtils.sendCommand(MonitorService.DUMP_COMMAND, 9000 - 1);
     }
 }
diff --git a/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/internal/monitor/MonitorServiceEnableTest.java b/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/internal/monitor/MonitorServiceEnableTest.java
index 06cdbea..a284679 100644
--- a/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/internal/monitor/MonitorServiceEnableTest.java
+++ b/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/internal/monitor/MonitorServiceEnableTest.java
@@ -19,6 +19,8 @@ package org.apache.shardingsphere.elasticjob.lite.internal.monitor;
 
 import org.apache.shardingsphere.elasticjob.lite.fixture.TestSimpleJob;
 import org.apache.shardingsphere.elasticjob.lite.integrate.AbstractBaseStdJobTest;
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 
 import java.io.IOException;
@@ -28,16 +30,26 @@ import static org.junit.Assert.assertNull;
 
 public final class MonitorServiceEnableTest extends AbstractBaseStdJobTest {
     
-    private static final int MONITOR_PORT = 9000;
-    
     public MonitorServiceEnableTest() {
-        super(TestSimpleJob.class, MONITOR_PORT);
+        super(TestSimpleJob.class);
+    }
+
+    @Before
+    public void setUp() {
+        super.setUp();
+        getMonitorService().listen();
+    }
+
+    @After
+    public void tearDown() {
+        super.tearDown();
+        getMonitorService().close();
     }
     
     @Test
     public void assertMonitorWithCommand() throws IOException {
         initJob();
-        assertNotNull(SocketUtils.sendCommand(MonitorService.DUMP_COMMAND, MONITOR_PORT));
+        assertNotNull(SocketUtils.sendCommand(MonitorService.DUMP_COMMAND + getJobName(), MONITOR_PORT));
         assertNull(SocketUtils.sendCommand("unknown_command", MONITOR_PORT));
     }
 }
diff --git a/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/internal/schedule/SchedulerFacadeTest.java b/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/internal/schedule/SchedulerFacadeTest.java
index 6e13bcd..cdfe3ff 100644
--- a/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/internal/schedule/SchedulerFacadeTest.java
+++ b/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/internal/schedule/SchedulerFacadeTest.java
@@ -19,7 +19,6 @@ package org.apache.shardingsphere.elasticjob.lite.internal.schedule;
 
 import org.apache.shardingsphere.elasticjob.lite.handler.sharding.JobInstance;
 import org.apache.shardingsphere.elasticjob.lite.internal.election.LeaderService;
-import org.apache.shardingsphere.elasticjob.lite.internal.monitor.MonitorService;
 import org.apache.shardingsphere.elasticjob.lite.internal.reconcile.ReconcileService;
 import org.apache.shardingsphere.elasticjob.lite.internal.sharding.ShardingService;
 import org.apache.shardingsphere.elasticjob.lite.reg.base.CoordinatorRegistryCenter;
@@ -50,9 +49,6 @@ public final class SchedulerFacadeTest {
     private ShardingService shardingService;
     
     @Mock
-    private MonitorService monitorService;
-    
-    @Mock
     private ReconcileService reconcileService;
     
     private SchedulerFacade schedulerFacade;
@@ -63,7 +59,6 @@ public final class SchedulerFacadeTest {
         schedulerFacade = new SchedulerFacade(null, "test_job");
         ReflectionUtils.setFieldValue(schedulerFacade, "leaderService", leaderService);
         ReflectionUtils.setFieldValue(schedulerFacade, "shardingService", shardingService);
-        ReflectionUtils.setFieldValue(schedulerFacade, "monitorService", monitorService);
         ReflectionUtils.setFieldValue(schedulerFacade, "reconcileService", reconcileService);
     }
     
@@ -73,7 +68,6 @@ public final class SchedulerFacadeTest {
         JobRegistry.getInstance().registerJob("test_job", jobScheduleController);
         schedulerFacade.shutdownInstance();
         verify(leaderService, times(0)).removeLeader();
-        verify(monitorService).close();
         verify(reconcileService, times(0)).stopAsync();
         verify(jobScheduleController).shutdown();
     }
@@ -86,7 +80,6 @@ public final class SchedulerFacadeTest {
         JobRegistry.getInstance().registerJob("test_job", jobScheduleController);
         schedulerFacade.shutdownInstance();
         verify(leaderService).removeLeader();
-        verify(monitorService).close();
         verify(reconcileService).stopAsync();
         verify(jobScheduleController).shutdown();
     }
diff --git a/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/internal/setup/SetUpFacadeTest.java b/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/internal/setup/SetUpFacadeTest.java
index 56cdba6..c45d1b7 100644
--- a/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/internal/setup/SetUpFacadeTest.java
+++ b/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/internal/setup/SetUpFacadeTest.java
@@ -26,7 +26,6 @@ import org.apache.shardingsphere.elasticjob.lite.internal.config.ConfigurationSe
 import org.apache.shardingsphere.elasticjob.lite.internal.election.LeaderService;
 import org.apache.shardingsphere.elasticjob.lite.internal.instance.InstanceService;
 import org.apache.shardingsphere.elasticjob.lite.internal.listener.ListenerManager;
-import org.apache.shardingsphere.elasticjob.lite.internal.monitor.MonitorService;
 import org.apache.shardingsphere.elasticjob.lite.internal.reconcile.ReconcileService;
 import org.apache.shardingsphere.elasticjob.lite.internal.schedule.JobRegistry;
 import org.apache.shardingsphere.elasticjob.lite.internal.schedule.JobScheduleController;
@@ -72,9 +71,6 @@ public final class SetUpFacadeTest {
     private ShardingService shardingService;
     
     @Mock
-    private MonitorService monitorService;
-    
-    @Mock
     private ReconcileService reconcileService;
     
     @Mock
@@ -91,7 +87,6 @@ public final class SetUpFacadeTest {
         ReflectionUtils.setFieldValue(setUpFacade, "serverService", serverService);
         ReflectionUtils.setFieldValue(setUpFacade, "instanceService", instanceService);
         ReflectionUtils.setFieldValue(setUpFacade, "shardingService", shardingService);
-        ReflectionUtils.setFieldValue(setUpFacade, "monitorService", monitorService);
         ReflectionUtils.setFieldValue(setUpFacade, "reconcileService", reconcileService);
         ReflectionUtils.setFieldValue(setUpFacade, "listenerManager", listenerManager);
     }
@@ -112,6 +107,5 @@ public final class SetUpFacadeTest {
         verify(leaderService).electLeader();
         verify(serverService).persistOnline(true);
         verify(shardingService).setReshardingFlag();
-        verify(monitorService).listen();
     }
 }
diff --git a/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/util/yaml/YamlEngineTest.java b/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/util/yaml/YamlEngineTest.java
index a52e30e..5e565fa 100644
--- a/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/util/yaml/YamlEngineTest.java
+++ b/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/util/yaml/YamlEngineTest.java
@@ -42,7 +42,6 @@ public final class YamlEngineTest {
             + "maxTimeDiffSeconds: 0\n"
             + "misfire: false\n"
             + "monitorExecution: false\n"
-            + "monitorPort: 0\n"
             + "overwrite: false\n"
             + "props:\n"
             + "  key: value\n"
@@ -58,7 +57,6 @@ public final class YamlEngineTest {
             + "maxTimeDiffSeconds: 0\n"
             + "misfire: false\n"
             + "monitorExecution: false\n"
-            + "monitorPort: 0\n"
             + "overwrite: false\n"
             + "reconcileIntervalMinutes: 0\n"
             + "shardingTotalCount: 3\n";
diff --git a/elastic-job-lite-lifecycle/src/main/java/org/apache/shardingsphere/elasticjob/lite/lifecycle/domain/JobSettings.java b/elastic-job-lite-lifecycle/src/main/java/org/apache/shardingsphere/elasticjob/lite/lifecycle/domain/JobSettings.java
index 00112c6..f53cf6d 100644
--- a/elastic-job-lite-lifecycle/src/main/java/org/apache/shardingsphere/elasticjob/lite/lifecycle/domain/JobSettings.java
+++ b/elastic-job-lite-lifecycle/src/main/java/org/apache/shardingsphere/elasticjob/lite/lifecycle/domain/JobSettings.java
@@ -57,8 +57,6 @@ public final class JobSettings implements Serializable {
     
     private int reconcileIntervalMinutes;
     
-    private int monitorPort = -1;
-    
     private String jobShardingStrategyType;
     
     private String jobExecutorServiceHandlerType;
@@ -89,7 +87,6 @@ public final class JobSettings implements Serializable {
         result.setMisfire(misfire);
         result.setMaxTimeDiffSeconds(maxTimeDiffSeconds);
         result.setReconcileIntervalMinutes(reconcileIntervalMinutes);
-        result.setMonitorPort(monitorPort);
         result.setJobShardingStrategyType(jobShardingStrategyType);
         result.setJobExecutorServiceHandlerType(jobExecutorServiceHandlerType);
         result.setJobErrorHandlerType(jobErrorHandlerType);
diff --git a/elastic-job-lite-lifecycle/src/main/java/org/apache/shardingsphere/elasticjob/lite/lifecycle/internal/settings/JobSettingsAPIImpl.java b/elastic-job-lite-lifecycle/src/main/java/org/apache/shardingsphere/elasticjob/lite/lifecycle/internal/settings/JobSettingsAPIImpl.java
index 3971459..23d41a7 100644
--- a/elastic-job-lite-lifecycle/src/main/java/org/apache/shardingsphere/elasticjob/lite/lifecycle/internal/settings/JobSettingsAPIImpl.java
+++ b/elastic-job-lite-lifecycle/src/main/java/org/apache/shardingsphere/elasticjob/lite/lifecycle/internal/settings/JobSettingsAPIImpl.java
@@ -64,7 +64,6 @@ public final class JobSettingsAPIImpl implements JobSettingsAPI {
         jobSettings.setJobParameter(jobConfig.getJobParameter());
         jobSettings.setMonitorExecution(jobConfig.isMonitorExecution());
         jobSettings.setMaxTimeDiffSeconds(jobConfig.getMaxTimeDiffSeconds());
-        jobSettings.setMonitorPort(jobConfig.getMonitorPort());
         jobSettings.setFailover(jobConfig.isFailover());
         jobSettings.setMisfire(jobConfig.isMisfire());
         jobSettings.setJobShardingStrategyType(jobConfig.getJobShardingStrategyType());
diff --git a/elastic-job-lite-lifecycle/src/test/java/org/apache/shardingsphere/elasticjob/lite/lifecycle/fixture/LifecycleYamlConstants.java b/elastic-job-lite-lifecycle/src/test/java/org/apache/shardingsphere/elasticjob/lite/lifecycle/fixture/LifecycleYamlConstants.java
index b60c5d9..bb020a5 100644
--- a/elastic-job-lite-lifecycle/src/test/java/org/apache/shardingsphere/elasticjob/lite/lifecycle/fixture/LifecycleYamlConstants.java
+++ b/elastic-job-lite-lifecycle/src/test/java/org/apache/shardingsphere/elasticjob/lite/lifecycle/fixture/LifecycleYamlConstants.java
@@ -32,7 +32,6 @@ public final class LifecycleYamlConstants {
             + "failover: true\n"
             + "misfire: false\n"
             + "maxTimeDiffSeconds: 100\n"
-            + "monitorPort: 8888\n"
             + "jobShardingStrategyType: AVG_ALLOCATION\n"
             + "description: %s\n"
             + "disabled: false\n"
@@ -48,7 +47,6 @@ public final class LifecycleYamlConstants {
             + "maxTimeDiffSeconds: -1\n"
             + "misfire: true\n"
             + "monitorExecution: true\n"
-            + "monitorPort: 8888\n"
             + "overwrite: false\n"
             + "props:\n"
             + "  streaming.process: 'true'\n"
@@ -65,7 +63,6 @@ public final class LifecycleYamlConstants {
             + "misfire: true\n"
             + "maxTimeDiffSeconds: -1\n"
             + "reconcileIntervalMinutes: 10\n"
-            + "monitorPort: 8888\n"
             + "description: ''\n"
             + "props:\n"
             + "  script.command.line: test.sh\n"
diff --git a/elastic-job-lite-lifecycle/src/test/java/org/apache/shardingsphere/elasticjob/lite/lifecycle/internal/settings/JobSettingsAPIImplTest.java b/elastic-job-lite-lifecycle/src/test/java/org/apache/shardingsphere/elasticjob/lite/lifecycle/internal/settings/JobSettingsAPIImplTest.java
index ee5a55a..89e2a5b 100644
--- a/elastic-job-lite-lifecycle/src/test/java/org/apache/shardingsphere/elasticjob/lite/lifecycle/internal/settings/JobSettingsAPIImplTest.java
+++ b/elastic-job-lite-lifecycle/src/test/java/org/apache/shardingsphere/elasticjob/lite/lifecycle/internal/settings/JobSettingsAPIImplTest.java
@@ -74,7 +74,6 @@ public final class JobSettingsAPIImplTest {
         assertThat(jobSettings.getJobParameter(), is("param"));
         assertThat(jobSettings.isMonitorExecution(), is(true));
         assertThat(jobSettings.getMaxTimeDiffSeconds(), is(-1));
-        assertThat(jobSettings.getMonitorPort(), is(8888));
         assertFalse(jobSettings.isFailover());
         assertTrue(jobSettings.isMisfire());
         assertNull(jobSettings.getJobShardingStrategyType());
@@ -101,7 +100,6 @@ public final class JobSettingsAPIImplTest {
         jobSettings.setMisfire(true);
         jobSettings.setMaxTimeDiffSeconds(-1);
         jobSettings.setReconcileIntervalMinutes(10);
-        jobSettings.setMonitorPort(8888);
         jobSettings.setDescription("");
         jobSettings.setStreamingProcess(true);
         jobSettingsAPI.updateJobSettings(jobSettings);
diff --git a/elastic-job-lite-spring/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/job/parser/common/AbstractJobBeanDefinitionParser.java b/elastic-job-lite-spring/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/job/parser/common/AbstractJobBeanDefinitionParser.java
index d6f3c47..0f29d17 100644
--- a/elastic-job-lite-spring/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/job/parser/common/AbstractJobBeanDefinitionParser.java
+++ b/elastic-job-lite-spring/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/job/parser/common/AbstractJobBeanDefinitionParser.java
@@ -73,7 +73,6 @@ public abstract class AbstractJobBeanDefinitionParser extends AbstractBeanDefini
         result.addConstructorArgValue(element.getAttribute(BaseJobBeanDefinitionParserTag.MISFIRE_ATTRIBUTE));
         result.addConstructorArgValue(element.getAttribute(BaseJobBeanDefinitionParserTag.MAX_TIME_DIFF_SECONDS_ATTRIBUTE));
         result.addConstructorArgValue(element.getAttribute(BaseJobBeanDefinitionParserTag.RECONCILE_INTERVAL_MINUTES));
-        result.addConstructorArgValue(element.getAttribute(BaseJobBeanDefinitionParserTag.MONITOR_PORT_ATTRIBUTE));
         result.addConstructorArgValue(element.getAttribute(BaseJobBeanDefinitionParserTag.JOB_SHARDING_STRATEGY_TYPE_ATTRIBUTE));
         result.addConstructorArgValue(element.getAttribute(BaseJobBeanDefinitionParserTag.JOB_EXECUTOR_SERVICE_HANDLER_ATTRIBUTE));
         result.addConstructorArgValue(element.getAttribute(BaseJobBeanDefinitionParserTag.JOB_ERROR_HANDLER_ATTRIBUTE));
diff --git a/elastic-job-lite-spring/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/job/parser/common/BaseJobBeanDefinitionParserTag.java b/elastic-job-lite-spring/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/job/parser/common/BaseJobBeanDefinitionParserTag.java
index da6d507..cf9bf9c 100644
--- a/elastic-job-lite-spring/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/job/parser/common/BaseJobBeanDefinitionParserTag.java
+++ b/elastic-job-lite-spring/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/job/parser/common/BaseJobBeanDefinitionParserTag.java
@@ -42,8 +42,6 @@ public final class BaseJobBeanDefinitionParserTag {
     
     public static final String MONITOR_EXECUTION_ATTRIBUTE = "monitor-execution";
     
-    public static final String MONITOR_PORT_ATTRIBUTE = "monitor-port";
-    
     public static final String FAILOVER_ATTRIBUTE = "failover";
     
     public static final String MAX_TIME_DIFF_SECONDS_ATTRIBUTE = "max-time-diff-seconds";
diff --git a/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/internal/monitor/MonitorServiceDisableTest.java b/elastic-job-lite-spring/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/monitor/handler/MonitorNamespaceHandler.java
similarity index 56%
copy from elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/internal/monitor/MonitorServiceDisableTest.java
copy to elastic-job-lite-spring/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/monitor/handler/MonitorNamespaceHandler.java
index e30b504..6c75e0f 100644
--- a/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/internal/monitor/MonitorServiceDisableTest.java
+++ b/elastic-job-lite-spring/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/monitor/handler/MonitorNamespaceHandler.java
@@ -15,22 +15,18 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.elasticjob.lite.internal.monitor;
+package org.apache.shardingsphere.elasticjob.lite.spring.monitor.handler;
 
-import org.apache.shardingsphere.elasticjob.lite.fixture.TestSimpleJob;
-import org.apache.shardingsphere.elasticjob.lite.integrate.AbstractBaseStdJobTest;
-import org.junit.Test;
+import org.apache.shardingsphere.elasticjob.lite.spring.monitor.parser.EmbedMonitorBeanDefinitionParser;
+import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
 
-import java.io.IOException;
-
-public final class MonitorServiceDisableTest extends AbstractBaseStdJobTest {
-    
-    public MonitorServiceDisableTest() {
-        super(TestSimpleJob.class, -1);
-    }
+/**
+ * Monitor spring namespace handler.
+ */
+public final class MonitorNamespaceHandler extends NamespaceHandlerSupport {
     
-    @Test(expected = IOException.class)
-    public void assertMonitorWithDumpCommand() throws IOException {
-        SocketUtils.sendCommand(MonitorService.DUMP_COMMAND, 9000);
+    @Override
+    public void init() {
+        registerBeanDefinitionParser("embed", new EmbedMonitorBeanDefinitionParser());
     }
 }
diff --git a/elastic-job-lite-spring/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/monitor/parser/EmbedMonitorBeanDefinitionParser.java b/elastic-job-lite-spring/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/monitor/parser/EmbedMonitorBeanDefinitionParser.java
new file mode 100644
index 0000000..9740e89
--- /dev/null
+++ b/elastic-job-lite-spring/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/monitor/parser/EmbedMonitorBeanDefinitionParser.java
@@ -0,0 +1,41 @@
+/*
+ * 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.lite.spring.monitor.parser;
+
+import org.apache.shardingsphere.elasticjob.lite.internal.monitor.MonitorService;
+import org.springframework.beans.factory.support.AbstractBeanDefinition;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+/**
+ * Bean definition parser for embed monitor.
+ */
+public class EmbedMonitorBeanDefinitionParser extends AbstractBeanDefinitionParser {
+
+    @Override
+    protected AbstractBeanDefinition parseInternal(final Element element, final ParserContext parserContext) {
+        BeanDefinitionBuilder result = BeanDefinitionBuilder.rootBeanDefinition(MonitorService.class);
+        result.addConstructorArgReference(element.getAttribute(MonitorBeanDefinitionParserTag.REGISTRY_CENTER_REF_ATTRIBUTE));
+        result.addConstructorArgValue(element.getAttribute(MonitorBeanDefinitionParserTag.MONITOR_PORT_ATTRIBUTE));
+        result.setInitMethodName("listen");
+        result.setDestroyMethodName("close");
+        return result.getBeanDefinition();
+    }
+}
diff --git a/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/internal/monitor/MonitorServiceDisableTest.java b/elastic-job-lite-spring/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/monitor/parser/MonitorBeanDefinitionParserTag.java
similarity index 56%
copy from elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/internal/monitor/MonitorServiceDisableTest.java
copy to elastic-job-lite-spring/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/monitor/parser/MonitorBeanDefinitionParserTag.java
index e30b504..785c9ab 100644
--- a/elastic-job-lite-core/src/test/java/org/apache/shardingsphere/elasticjob/lite/internal/monitor/MonitorServiceDisableTest.java
+++ b/elastic-job-lite-spring/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/monitor/parser/MonitorBeanDefinitionParserTag.java
@@ -15,22 +15,18 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.elasticjob.lite.internal.monitor;
+package org.apache.shardingsphere.elasticjob.lite.spring.monitor.parser;
 
-import org.apache.shardingsphere.elasticjob.lite.fixture.TestSimpleJob;
-import org.apache.shardingsphere.elasticjob.lite.integrate.AbstractBaseStdJobTest;
-import org.junit.Test;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
 
-import java.io.IOException;
-
-public final class MonitorServiceDisableTest extends AbstractBaseStdJobTest {
+/**
+ * Monitor bean definition parser tag.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class MonitorBeanDefinitionParserTag {
     
-    public MonitorServiceDisableTest() {
-        super(TestSimpleJob.class, -1);
-    }
+    public static final String REGISTRY_CENTER_REF_ATTRIBUTE = "registry-center-ref";
     
-    @Test(expected = IOException.class)
-    public void assertMonitorWithDumpCommand() throws IOException {
-        SocketUtils.sendCommand(MonitorService.DUMP_COMMAND, 9000);
-    }
+    public static final String MONITOR_PORT_ATTRIBUTE = "monitor-port";
 }
diff --git a/elastic-job-lite-spring/src/main/resources/META-INF/namespace/job.xsd b/elastic-job-lite-spring/src/main/resources/META-INF/namespace/job.xsd
index d787ce3..7395e80 100644
--- a/elastic-job-lite-spring/src/main/resources/META-INF/namespace/job.xsd
+++ b/elastic-job-lite-spring/src/main/resources/META-INF/namespace/job.xsd
@@ -50,7 +50,6 @@
                 <xsd:attribute name="sharding-item-parameters" type="xsd:string" />
                 <xsd:attribute name="job-parameter" type="xsd:string" />
                 <xsd:attribute name="monitor-execution" type="xsd:string" default="true"/>
-                <xsd:attribute name="monitor-port" type="xsd:string" default="-1"/>
                 <xsd:attribute name="max-time-diff-seconds" type="xsd:string" default="-1"/>
                 <xsd:attribute name="failover" type="xsd:string" default="false"/>
                 <xsd:attribute name="reconcile-interval-minutes" type="xsd:string" default="10"/>
diff --git a/elastic-job-lite-spring/src/main/resources/META-INF/namespace/monitor.xsd b/elastic-job-lite-spring/src/main/resources/META-INF/namespace/monitor.xsd
new file mode 100644
index 0000000..e89f13c
--- /dev/null
+++ b/elastic-job-lite-spring/src/main/resources/META-INF/namespace/monitor.xsd
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<xsd:schema xmlns="http://elasticjob.shardingsphere.apache.org/schema/monitor"
+        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+        xmlns:beans="http://www.springframework.org/schema/beans"
+        targetNamespace="http://elasticjob.shardingsphere.apache.org/schema/monitor"
+        elementFormDefault="qualified"
+        attributeFormDefault="unqualified">
+    <xsd:import namespace="http://www.springframework.org/schema/beans"/>
+    
+    <xsd:element name="embed">
+        <xsd:complexType>
+            <xsd:complexContent>
+                <xsd:extension base="beans:identifiedType">
+                    <xsd:attribute name="registry-center-ref" type="xsd:string" use="required" />
+                    <xsd:attribute name="monitor-port" type="xsd:string" default="-1"/>
+                </xsd:extension>
+            </xsd:complexContent>
+        </xsd:complexType>
+    </xsd:element>
+</xsd:schema>
diff --git a/elastic-job-lite-spring/src/main/resources/META-INF/spring.handlers b/elastic-job-lite-spring/src/main/resources/META-INF/spring.handlers
index b49817a..eaf6a89 100644
--- a/elastic-job-lite-spring/src/main/resources/META-INF/spring.handlers
+++ b/elastic-job-lite-spring/src/main/resources/META-INF/spring.handlers
@@ -17,3 +17,4 @@
 
 http\://elasticjob.shardingsphere.apache.org/schema/reg=org.apache.shardingsphere.elasticjob.lite.spring.reg.handler.RegNamespaceHandler
 http\://elasticjob.shardingsphere.apache.org/schema/job=org.apache.shardingsphere.elasticjob.lite.spring.job.handler.JobNamespaceHandler
+http\://elasticjob.shardingsphere.apache.org/schema/monitor=org.apache.shardingsphere.elasticjob.lite.spring.monitor.handler.MonitorNamespaceHandler
diff --git a/elastic-job-lite-spring/src/main/resources/META-INF/spring.schemas b/elastic-job-lite-spring/src/main/resources/META-INF/spring.schemas
index 322a036..988fb6b 100644
--- a/elastic-job-lite-spring/src/main/resources/META-INF/spring.schemas
+++ b/elastic-job-lite-spring/src/main/resources/META-INF/spring.schemas
@@ -17,3 +17,4 @@
 
 http\://elasticjob.shardingsphere.apache.org/schema/reg/reg.xsd=META-INF/namespace/reg.xsd
 http\://elasticjob.shardingsphere.apache.org/schema/job/job.xsd=META-INF/namespace/job.xsd
+http\://elasticjob.shardingsphere.apache.org/schema/monitor/monitor.xsd=META-INF/namespace/monitor.xsd
diff --git a/examples/elastic-job-example-lite-spring/src/main/resources/META-INF/applicationContext.xml b/examples/elastic-job-example-lite-spring/src/main/resources/META-INF/applicationContext.xml
index f47d915..e3fc5d2 100644
--- a/examples/elastic-job-example-lite-spring/src/main/resources/META-INF/applicationContext.xml
+++ b/examples/elastic-job-example-lite-spring/src/main/resources/META-INF/applicationContext.xml
@@ -28,7 +28,7 @@
     <bean id="simpleJob" class="org.apache.shardingsphere.elasticjob.lite.example.job.simple.SpringSimpleJob" />
     <bean id="dataflowJob" class="org.apache.shardingsphere.elasticjob.lite.example.job.dataflow.SpringDataflowJob" />
     
-    <job:simple id="${simple.id}" job-ref="simpleJob" registry-center-ref="regCenter" sharding-total-count="${simple.shardingTotalCount}" cron="${simple.cron}" sharding-item-parameters="${simple.shardingItemParameters}" monitor-execution="${simple.monitorExecution}" monitor-port="${simple.monitorPort}" failover="${simple.failover}" description="${simple.description}" disabled="${simple.disabled}" overwrite="${simple.overwrite}" event-trace-rdb-data-source="elasticJobLog" />
+    <job:simple id="${simple.id}" job-ref="simpleJob" registry-center-ref="regCenter" sharding-total-count="${simple.shardingTotalCount}" cron="${simple.cron}" sharding-item-parameters="${simple.shardingItemParameters}" monitor-execution="${simple.monitorExecution}" failover="${simple.failover}" description="${simple.description}" disabled="${simple.disabled}" overwrite="${simple.overwrite}" event-trace-rdb-data-source="elasticJobLog" />
     <job:dataflow id="${dataflow.id}" job-ref="dataflowJob" registry-center-ref="regCenter" sharding-total-count="${dataflow.shardingTotalCount}" cron="${dataflow.cron}" sharding-item-parameters="${dataflow.shardingItemParameters}" monitor-execution="${dataflow.monitorExecution}" failover="${dataflow.failover}" max-time-diff-seconds="${dataflow.maxTimeDiffSeconds}" streaming-process="${dataflow.streamingProcess}" description="${dataflow.description}" disabled="${dataflow.disabled}" overw [...]
     
     <!-- use absolute path to run script job -->
diff --git a/examples/elastic-job-example-lite-spring/src/main/resources/conf/job.properties b/examples/elastic-job-example-lite-spring/src/main/resources/conf/job.properties
index f186836..5ff86c7 100644
--- a/examples/elastic-job-example-lite-spring/src/main/resources/conf/job.properties
+++ b/examples/elastic-job-example-lite-spring/src/main/resources/conf/job.properties
@@ -17,7 +17,6 @@ simple.failover=true
 simple.description=\u53EA\u8FD0\u884C\u4E00\u6B21\u7684\u4F5C\u4E1A\u793A\u4F8B
 simple.disabled=false
 simple.overwrite=true
-simple.monitorPort=9888
 
 dataflow.id=springDataflowJob
 dataflow.cron=0/5 * * * * ?