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/16 09:29:23 UTC

[shardingsphere-elasticjob] branch master updated: Use CloudAppConfigurationPOJO instead of CloudAppConfiguration (#1084)

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 160dd9d  Use CloudAppConfigurationPOJO instead of CloudAppConfiguration (#1084)
160dd9d is described below

commit 160dd9dda88d94f40e9fa8efb76806b7d9a1bcff
Author: 于玉桔 <zh...@apache.org>
AuthorDate: Thu Jul 16 17:29:15 2020 +0800

    Use CloudAppConfigurationPOJO instead of CloudAppConfiguration (#1084)
    
    * Use CloudAppConfigurationPOJO instead of CloudAppConfiguration for CloudAppRestfulApi
---
 .../app/CloudAppConfigurationGsonFactory.java      | 120 ---------------------
 .../config/app/CloudAppConfigurationService.java   |  18 ++--
 .../scheduler/mesos/AppConstraintEvaluator.java    |  10 +-
 .../cloud/scheduler/mesos/FacadeService.java       |   4 +-
 .../mesos/TaskLaunchScheduledService.java          |  10 +-
 .../cloud/scheduler/producer/ProducerManager.java  |   4 +-
 .../scheduler/restful/CloudAppRestfulApi.java      |  15 ++-
 .../app/CloudAppConfigurationServiceTest.java      |   9 +-
 .../fixture/CloudAppConfigurationBuilder.java      |   6 +-
 .../cloud/scheduler/mesos/FacadeServiceTest.java   |   3 +-
 .../scheduler/producer/ProducerManagerTest.java    |   4 +-
 11 files changed, 42 insertions(+), 161 deletions(-)

diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/config/app/CloudAppConfigurationGsonFactory.java b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/config/app/CloudAppConfigurationGsonFactory.java
deleted file mode 100755
index 5232418..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/config/app/CloudAppConfigurationGsonFactory.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app;
-
-import org.apache.shardingsphere.elasticjob.cloud.util.json.CloudConfigurationConstants;
-import org.apache.shardingsphere.elasticjob.cloud.util.json.GsonFactory;
-import com.google.gson.TypeAdapter;
-import com.google.gson.stream.JsonReader;
-import com.google.gson.stream.JsonWriter;
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
-
-import java.io.IOException;
-
-/**
- * Cloud app configuration gson factory.
- */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class CloudAppConfigurationGsonFactory {
-    
-    static {
-        GsonFactory.registerTypeAdapter(CloudAppConfiguration.class, new CloudAppConfigurationGsonTypeAdapter());
-    }
-    
-    /**
-     * Convert cloud app configuration to json string.
-     *
-     * @param cloudAppConfig cloud app config
-     * @return json string
-     */
-    public static String toJson(final CloudAppConfiguration cloudAppConfig) {
-        return GsonFactory.getGson().toJson(cloudAppConfig);
-    }
-    
-    /**
-     * Convert json string to cloud app configuration.
-     *
-     * @param cloudAppConfigJson json string of the cloud app configuration
-     * @return cloud app configuration
-     */
-    public static CloudAppConfiguration fromJson(final String cloudAppConfigJson) {
-        return GsonFactory.getGson().fromJson(cloudAppConfigJson, CloudAppConfiguration.class);
-    }
-    
-    /**
-     * Json adapter of the cloud app configuration.
-     */
-    public static final class CloudAppConfigurationGsonTypeAdapter extends TypeAdapter<CloudAppConfiguration> {
-    
-        @Override
-        public CloudAppConfiguration read(final JsonReader in) throws IOException {
-            String appURL = "";
-            String appName = "";
-            String bootstrapScript = "";
-            double cpuCount = 1.0d;
-            double memoryMB = 128.0d;
-            boolean appCacheEnable = true;
-            int eventTraceSamplingCount = 0;
-            in.beginObject();
-            while (in.hasNext()) {
-                String jsonName = in.nextName();
-                switch (jsonName) {
-                    case CloudConfigurationConstants.APP_NAME:
-                        appName = in.nextString();
-                        break;
-                    case CloudConfigurationConstants.APP_URL:
-                        appURL = in.nextString();
-                        break;
-                    case CloudConfigurationConstants.BOOTSTRAP_SCRIPT:
-                        bootstrapScript = in.nextString();
-                        break;
-                    case CloudConfigurationConstants.CPU_COUNT:
-                        cpuCount = in.nextDouble();
-                        break;
-                    case CloudConfigurationConstants.MEMORY_MB:
-                        memoryMB = in.nextDouble();
-                        break;
-                    case CloudConfigurationConstants.APP_CACHE_ENABLE:
-                        appCacheEnable = in.nextBoolean();
-                        break;
-                    case CloudConfigurationConstants.EVENT_TRACE_SAMPLING_COUNT:
-                        eventTraceSamplingCount = in.nextInt();
-                        break;
-                    default:
-                        break;
-                }
-            }
-            in.endObject();
-            return new CloudAppConfiguration(appName, appURL, bootstrapScript, cpuCount, memoryMB, appCacheEnable, eventTraceSamplingCount);
-        }
-    
-        @Override
-        public void write(final JsonWriter out, final CloudAppConfiguration value) throws IOException {
-            out.beginObject();
-            out.name(CloudConfigurationConstants.APP_NAME).value(value.getAppName());
-            out.name(CloudConfigurationConstants.APP_URL).value(value.getAppURL());
-            out.name(CloudConfigurationConstants.BOOTSTRAP_SCRIPT).value(value.getBootstrapScript());
-            out.name(CloudConfigurationConstants.CPU_COUNT).value(value.getCpuCount());
-            out.name(CloudConfigurationConstants.MEMORY_MB).value(value.getMemoryMB());
-            out.name(CloudConfigurationConstants.APP_CACHE_ENABLE).value(value.isAppCacheEnable());
-            out.name(CloudConfigurationConstants.EVENT_TRACE_SAMPLING_COUNT).value(value.getEventTraceSamplingCount());
-            out.endObject();
-        }
-    }
-}
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/config/app/CloudAppConfigurationService.java b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/config/app/CloudAppConfigurationService.java
index f2bdd2a..589df88 100755
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/config/app/CloudAppConfigurationService.java
+++ b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/config/app/CloudAppConfigurationService.java
@@ -42,8 +42,8 @@ public final class CloudAppConfigurationService {
      *
      * @param appConfig cloud app configuration
      */
-    public void add(final CloudAppConfiguration appConfig) {
-        regCenter.persist(CloudAppConfigurationNode.getRootNodePath(appConfig.getAppName()), YamlEngine.marshal(CloudAppConfigurationPOJO.fromCloudAppConfiguration(appConfig)));
+    public void add(final CloudAppConfigurationPOJO appConfig) {
+        regCenter.persist(CloudAppConfigurationNode.getRootNodePath(appConfig.getAppName()), YamlEngine.marshal(appConfig));
     }
     
     /**
@@ -51,8 +51,8 @@ public final class CloudAppConfigurationService {
      *
      * @param appConfig cloud app configuration
      */
-    public void update(final CloudAppConfiguration appConfig) {
-        regCenter.update(CloudAppConfigurationNode.getRootNodePath(appConfig.getAppName()), YamlEngine.marshal(CloudAppConfigurationPOJO.fromCloudAppConfiguration(appConfig)));
+    public void update(final CloudAppConfigurationPOJO appConfig) {
+        regCenter.update(CloudAppConfigurationNode.getRootNodePath(appConfig.getAppName()), YamlEngine.marshal(appConfig));
     }
     
     /**
@@ -61,9 +61,9 @@ public final class CloudAppConfigurationService {
      * @param appName application name
      * @return cloud app configuration
      */
-    public Optional<CloudAppConfiguration> load(final String appName) {
+    public Optional<CloudAppConfigurationPOJO> load(final String appName) {
         String configContent = regCenter.get(CloudAppConfigurationNode.getRootNodePath(appName));
-        return Strings.isNullOrEmpty(configContent) ? Optional.empty() : Optional.of(YamlEngine.unmarshal(configContent, CloudAppConfigurationPOJO.class).toCloudAppConfiguration());
+        return Strings.isNullOrEmpty(configContent) ? Optional.empty() : Optional.of(YamlEngine.unmarshal(configContent, CloudAppConfigurationPOJO.class));
     }
     
     /**
@@ -71,14 +71,14 @@ public final class CloudAppConfigurationService {
      *
      * @return collection of the registered cloud app configuration
      */
-    public Collection<CloudAppConfiguration> loadAll() {
+    public Collection<CloudAppConfigurationPOJO> loadAll() {
         if (!regCenter.isExisted(CloudAppConfigurationNode.ROOT)) {
             return Collections.emptyList();
         }
         List<String> appNames = regCenter.getChildrenKeys(CloudAppConfigurationNode.ROOT);
-        Collection<CloudAppConfiguration> result = new ArrayList<>(appNames.size());
+        Collection<CloudAppConfigurationPOJO> result = new ArrayList<>(appNames.size());
         for (String each : appNames) {
-            Optional<CloudAppConfiguration> config = load(each);
+            Optional<CloudAppConfigurationPOJO> config = load(each);
             config.ifPresent(result::add);
         }
         return result;
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/mesos/AppConstraintEvaluator.java b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/mesos/AppConstraintEvaluator.java
index e83a4cf..e4c16e0 100755
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/mesos/AppConstraintEvaluator.java
+++ b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/mesos/AppConstraintEvaluator.java
@@ -29,8 +29,8 @@ import lombok.AccessLevel;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.shardingsphere.elasticjob.cloud.config.CloudJobConfiguration;
+import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app.pojo.CloudAppConfigurationPOJO;
 import org.apache.shardingsphere.elasticjob.cloud.config.pojo.CloudJobConfigurationPOJO;
-import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app.CloudAppConfiguration;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.mesos.MesosStateService.ExecutorStateInfo;
 import org.apache.shardingsphere.elasticjob.infra.context.TaskContext;
 import org.codehaus.jettison.json.JSONException;
@@ -107,7 +107,7 @@ public final class AppConstraintEvaluator implements ConstraintEvaluator {
                 if (isAppRunningOnSlave(each.getId(), slaveId)) {
                     continue;
                 }
-                CloudAppConfiguration assigningAppConfig = getAppConfiguration(each.getId());
+                CloudAppConfigurationPOJO assigningAppConfig = getAppConfiguration(each.getId());
                 if (!calculatedApps.add(assigningAppConfig.getAppName())) {
                     continue;
                 }
@@ -138,15 +138,15 @@ public final class AppConstraintEvaluator implements ConstraintEvaluator {
         return runningApps.contains(taskContext.getExecutorId(getJobConfiguration(taskContext).getAppName()));
     }
     
-    private CloudAppConfiguration getAppConfiguration(final String taskId) throws LackConfigException {
+    private CloudAppConfigurationPOJO getAppConfiguration(final String taskId) throws LackConfigException {
         CloudJobConfiguration cloudJobConfig = getJobConfiguration(TaskContext.from(taskId));
-        Optional<CloudAppConfiguration> appConfigOptional = facadeService.loadAppConfig(cloudJobConfig.getAppName());
+        Optional<CloudAppConfigurationPOJO> appConfigOptional = facadeService.loadAppConfig(cloudJobConfig.getAppName());
         if (!appConfigOptional.isPresent()) {
             throw new LackConfigException("APP", cloudJobConfig.getAppName());
         }
         return appConfigOptional.get();
     }
-    
+
     private CloudJobConfiguration getJobConfiguration(final TaskContext taskContext) throws LackConfigException {
         Optional<CloudJobConfigurationPOJO> cloudJobConfig = facadeService.load(taskContext.getMetaInfo().getJobName());
         if (!cloudJobConfig.isPresent()) {
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/mesos/FacadeService.java b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/mesos/FacadeService.java
index a61f62d..116d207 100755
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/mesos/FacadeService.java
+++ b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/mesos/FacadeService.java
@@ -20,8 +20,8 @@ package org.apache.shardingsphere.elasticjob.cloud.scheduler.mesos;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.shardingsphere.elasticjob.cloud.config.CloudJobExecutionType;
 import org.apache.shardingsphere.elasticjob.cloud.config.pojo.CloudJobConfigurationPOJO;
-import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app.CloudAppConfiguration;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app.CloudAppConfigurationService;
+import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app.pojo.CloudAppConfigurationPOJO;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.job.CloudJobConfigurationService;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.context.JobContext;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.mesos.MesosStateService.ExecutorStateInfo;
@@ -201,7 +201,7 @@ public final class FacadeService {
      * @param appName app name
      * @return cloud app config
      */
-    public Optional<CloudAppConfiguration> loadAppConfig(final String appName) {
+    public Optional<CloudAppConfigurationPOJO> loadAppConfig(final String appName) {
         return appConfigService.load(appName);
     }
     
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/mesos/TaskLaunchScheduledService.java b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/mesos/TaskLaunchScheduledService.java
index c9bc110..86bc173 100755
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/mesos/TaskLaunchScheduledService.java
+++ b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/mesos/TaskLaunchScheduledService.java
@@ -35,8 +35,8 @@ import org.apache.mesos.SchedulerDriver;
 import org.apache.shardingsphere.elasticjob.api.listener.ShardingContexts;
 import org.apache.shardingsphere.elasticjob.cloud.config.CloudJobConfiguration;
 import org.apache.shardingsphere.elasticjob.cloud.config.CloudJobExecutionType;
+import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app.pojo.CloudAppConfigurationPOJO;
 import org.apache.shardingsphere.elasticjob.cloud.config.pojo.CloudJobConfigurationPOJO;
-import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app.CloudAppConfiguration;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.env.BootstrapEnvironment;
 import org.apache.shardingsphere.elasticjob.cloud.util.config.ShardingItemParameters;
 import org.apache.shardingsphere.elasticjob.cloud.util.json.GsonFactory;
@@ -156,7 +156,7 @@ public final class TaskLaunchScheduledService extends AbstractScheduledService {
         if (!cloudJobConfig.isPresent()) {
             return null;
         }
-        Optional<CloudAppConfiguration> appConfig = facadeService.loadAppConfig(cloudJobConfig.get().getAppName());
+        Optional<CloudAppConfigurationPOJO> appConfig = facadeService.loadAppConfig(cloudJobConfig.get().getAppName());
         if (!appConfig.isPresent()) {
             return null;
         }
@@ -177,7 +177,7 @@ public final class TaskLaunchScheduledService extends AbstractScheduledService {
         }
     }
     
-    private ShardingContexts getShardingContexts(final TaskContext taskContext, final CloudAppConfiguration appConfig, final CloudJobConfiguration cloudJobConfig) {
+    private ShardingContexts getShardingContexts(final TaskContext taskContext, final CloudAppConfigurationPOJO appConfig, final CloudJobConfiguration cloudJobConfig) {
         Map<Integer, String> shardingItemParameters = new ShardingItemParameters(cloudJobConfig.getJobConfig().getShardingItemParameters()).getMap();
         Map<Integer, String> assignedShardingItemParameters = new HashMap<>(1, 1);
         int shardingItem = taskContext.getMetaInfo().getShardingItems().get(0);
@@ -196,7 +196,7 @@ public final class TaskLaunchScheduledService extends AbstractScheduledService {
         return result.setCommand(command).build();
     }
     
-    private Protos.TaskInfo buildCustomizedExecutorTaskInfo(final TaskContext taskContext, final CloudAppConfiguration appConfig, final CloudJobConfiguration cloudJobConfig, 
+    private Protos.TaskInfo buildCustomizedExecutorTaskInfo(final TaskContext taskContext, final CloudAppConfigurationPOJO appConfig, final CloudJobConfiguration cloudJobConfig,
                                                             final ShardingContexts shardingContexts, final Protos.Offer offer, final Protos.CommandInfo command) {
         Protos.TaskInfo.Builder result = Protos.TaskInfo.newBuilder().setTaskId(Protos.TaskID.newBuilder().setValue(taskContext.getId()).build())
                 .setName(taskContext.getTaskName()).setSlaveId(offer.getSlaveId())
@@ -213,7 +213,7 @@ public final class TaskLaunchScheduledService extends AbstractScheduledService {
         return result.setExecutor(executorBuilder.build()).build();
     }
     
-    private Protos.CommandInfo.URI buildURI(final CloudAppConfiguration appConfig, final boolean isCommandExecutor) {
+    private Protos.CommandInfo.URI buildURI(final CloudAppConfigurationPOJO appConfig, final boolean isCommandExecutor) {
         Protos.CommandInfo.URI.Builder result = Protos.CommandInfo.URI.newBuilder().setValue(appConfig.getAppURL()).setCache(appConfig.isAppCacheEnable());
         if (isCommandExecutor && !SupportedExtractionType.isExtraction(appConfig.getAppURL())) {
             result.setExecutable(true);
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/producer/ProducerManager.java b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/producer/ProducerManager.java
index 8b20925..152961d 100755
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/producer/ProducerManager.java
+++ b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/producer/ProducerManager.java
@@ -25,8 +25,8 @@ import org.apache.mesos.SchedulerDriver;
 import org.apache.shardingsphere.elasticjob.cloud.config.CloudJobExecutionType;
 import org.apache.shardingsphere.elasticjob.cloud.config.pojo.CloudJobConfigurationPOJO;
 import org.apache.shardingsphere.elasticjob.cloud.exception.AppConfigurationException;
-import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app.CloudAppConfiguration;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app.CloudAppConfigurationService;
+import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app.pojo.CloudAppConfigurationPOJO;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.job.CloudJobConfigurationService;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.state.disable.app.DisableAppService;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.state.disable.job.DisableJobService;
@@ -92,7 +92,7 @@ public final class ProducerManager {
         if (disableJobService.isDisabled(cloudJobConfig.getJobName())) {
             throw new JobConfigurationException("Job '%s' has been disable.", cloudJobConfig.getJobName());
         }
-        Optional<CloudAppConfiguration> appConfigFromZk = appConfigService.load(cloudJobConfig.getAppName());
+        Optional<CloudAppConfigurationPOJO> appConfigFromZk = appConfigService.load(cloudJobConfig.getAppName());
         if (!appConfigFromZk.isPresent()) {
             throw new AppConfigurationException("Register app '%s' firstly.", cloudJobConfig.getAppName());
         }
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/restful/CloudAppRestfulApi.java b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/restful/CloudAppRestfulApi.java
index 8e6b28e..3475486 100755
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/restful/CloudAppRestfulApi.java
+++ b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/restful/CloudAppRestfulApi.java
@@ -21,15 +21,13 @@ import org.apache.mesos.Protos.ExecutorID;
 import org.apache.mesos.Protos.SlaveID;
 import org.apache.shardingsphere.elasticjob.cloud.config.pojo.CloudJobConfigurationPOJO;
 import org.apache.shardingsphere.elasticjob.cloud.exception.AppConfigurationException;
-import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app.CloudAppConfiguration;
-import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app.CloudAppConfigurationGsonFactory;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app.CloudAppConfigurationService;
+import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app.pojo.CloudAppConfigurationPOJO;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.job.CloudJobConfigurationService;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.mesos.MesosStateService;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.mesos.MesosStateService.ExecutorStateInfo;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.producer.ProducerManager;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.state.disable.app.DisableAppService;
-import org.apache.shardingsphere.elasticjob.cloud.util.json.GsonFactory;
 import org.apache.shardingsphere.elasticjob.infra.exception.JobSystemException;
 import org.apache.shardingsphere.elasticjob.reg.base.CoordinatorRegistryCenter;
 import org.codehaus.jettison.json.JSONException;
@@ -81,7 +79,6 @@ public final class CloudAppRestfulApi {
     public static void init(final CoordinatorRegistryCenter regCenter, final ProducerManager producerManager) {
         CloudAppRestfulApi.regCenter = regCenter;
         CloudAppRestfulApi.producerManager = producerManager;
-        GsonFactory.registerTypeAdapter(CloudAppConfiguration.class, new CloudAppConfigurationGsonFactory.CloudAppConfigurationGsonTypeAdapter());
     }
     
     /**
@@ -91,8 +88,8 @@ public final class CloudAppRestfulApi {
      */
     @POST
     @Consumes(MediaType.APPLICATION_JSON)
-    public void register(final CloudAppConfiguration appConfig) {
-        Optional<CloudAppConfiguration> appConfigFromZk = appConfigService.load(appConfig.getAppName());
+    public void register(final CloudAppConfigurationPOJO appConfig) {
+        Optional<CloudAppConfigurationPOJO> appConfigFromZk = appConfigService.load(appConfig.getAppName());
         if (appConfigFromZk.isPresent()) {
             throw new AppConfigurationException("app '%s' already existed.", appConfig.getAppName());
         }
@@ -106,7 +103,7 @@ public final class CloudAppRestfulApi {
      */
     @PUT
     @Consumes(MediaType.APPLICATION_JSON)
-    public void update(final CloudAppConfiguration appConfig) {
+    public void update(final CloudAppConfigurationPOJO appConfig) {
         appConfigService.update(appConfig);
     }
     
@@ -120,7 +117,7 @@ public final class CloudAppRestfulApi {
     @Path("/{appName}")
     @Consumes(MediaType.APPLICATION_JSON)
     public Response detail(@PathParam("appName") final String appName) {
-        Optional<CloudAppConfiguration> appConfig = appConfigService.load(appName);
+        Optional<CloudAppConfigurationPOJO> appConfig = appConfigService.load(appName);
         if (!appConfig.isPresent()) {
             return Response.status(Response.Status.NOT_FOUND).build();
         }
@@ -135,7 +132,7 @@ public final class CloudAppRestfulApi {
     @GET
     @Path("/list")
     @Produces(MediaType.APPLICATION_JSON)
-    public Collection<CloudAppConfiguration> findAllApps() {
+    public Collection<CloudAppConfigurationPOJO> findAllApps() {
         return appConfigService.loadAll();
     }
     
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/test/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/config/app/CloudAppConfigurationServiceTest.java b/elasticjob-cloud/elasticjob-cloud-scheduler/src/test/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/config/app/CloudAppConfigurationServiceTest.java
index f9ebd5f..f5a84c3 100755
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/test/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/config/app/CloudAppConfigurationServiceTest.java
+++ b/elasticjob-cloud/elasticjob-cloud-scheduler/src/test/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/config/app/CloudAppConfigurationServiceTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app;
 
+import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app.pojo.CloudAppConfigurationPOJO;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.fixture.CloudAppConfigurationBuilder;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.fixture.CloudAppJsonConstants;
 import org.apache.shardingsphere.elasticjob.reg.base.CoordinatorRegistryCenter;
@@ -56,14 +57,14 @@ public final class CloudAppConfigurationServiceTest {
     
     @Test
     public void assertAdd() {
-        CloudAppConfiguration appConfig = CloudAppConfigurationBuilder.createCloudAppConfiguration("test_app");
+        CloudAppConfigurationPOJO appConfig = CloudAppConfigurationBuilder.createCloudAppConfiguration("test_app");
         configService.add(appConfig);
         verify(regCenter).persist("/config/app/test_app", YAML);
     }
     
     @Test
     public void assertUpdate() {
-        CloudAppConfiguration appConfig = CloudAppConfigurationBuilder.createCloudAppConfiguration("test_app");
+        CloudAppConfigurationPOJO appConfig = CloudAppConfigurationBuilder.createCloudAppConfiguration("test_app");
         configService.update(appConfig);
         verify(regCenter).update("/config/app/test_app", YAML);
     }
@@ -80,7 +81,7 @@ public final class CloudAppConfigurationServiceTest {
         when(regCenter.isExisted("/config/app")).thenReturn(true);
         when(regCenter.getChildrenKeys(CloudAppConfigurationNode.ROOT)).thenReturn(Arrays.asList("test_app_1", "test_app_2"));
         when(regCenter.get("/config/app/test_app_1")).thenReturn(CloudAppJsonConstants.getAppJson("test_app_1"));
-        Collection<CloudAppConfiguration> actual = configService.loadAll();
+        Collection<CloudAppConfigurationPOJO> actual = configService.loadAll();
         assertThat(actual.size(), is(1));
         assertThat(actual.iterator().next().getAppName(), is("test_app_1"));
         verify(regCenter).isExisted("/config/app");
@@ -97,7 +98,7 @@ public final class CloudAppConfigurationServiceTest {
     @Test
     public void assertLoadWithConfig() {
         when(regCenter.get("/config/app/test_app")).thenReturn(CloudAppJsonConstants.getAppJson("test_app"));
-        Optional<CloudAppConfiguration> actual = configService.load("test_app");
+        Optional<CloudAppConfigurationPOJO> actual = configService.load("test_app");
         assertTrue(actual.isPresent());
         assertThat(actual.get().getAppName(), is("test_app"));
     }
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/test/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/fixture/CloudAppConfigurationBuilder.java b/elasticjob-cloud/elasticjob-cloud-scheduler/src/test/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/fixture/CloudAppConfigurationBuilder.java
index dafb25f..f414717 100755
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/test/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/fixture/CloudAppConfigurationBuilder.java
+++ b/elasticjob-cloud/elasticjob-cloud-scheduler/src/test/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/fixture/CloudAppConfigurationBuilder.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.elasticjob.cloud.scheduler.fixture;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app.CloudAppConfiguration;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app.pojo.CloudAppConfigurationPOJO;
 
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class CloudAppConfigurationBuilder {
@@ -29,7 +30,8 @@ public final class CloudAppConfigurationBuilder {
      * @param appName app name
      * @return CloudAppConfiguration
      */
-    public static CloudAppConfiguration createCloudAppConfiguration(final String appName) {
-        return new CloudAppConfiguration(appName, "http://localhost/app.jar", "bin/start.sh");
+    public static CloudAppConfigurationPOJO createCloudAppConfiguration(final String appName) {
+        return CloudAppConfigurationPOJO.fromCloudAppConfiguration(new CloudAppConfiguration(appName,
+                "http://localhost/app.jar", "bin/start.sh"));
     }
 }
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/test/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/mesos/FacadeServiceTest.java b/elasticjob-cloud/elasticjob-cloud-scheduler/src/test/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/mesos/FacadeServiceTest.java
index 368dfcc..25900a6 100755
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/test/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/mesos/FacadeServiceTest.java
+++ b/elasticjob-cloud/elasticjob-cloud-scheduler/src/test/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/mesos/FacadeServiceTest.java
@@ -24,6 +24,7 @@ import org.apache.shardingsphere.elasticjob.cloud.config.CloudJobExecutionType;
 import org.apache.shardingsphere.elasticjob.cloud.config.pojo.CloudJobConfigurationPOJO;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app.CloudAppConfiguration;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app.CloudAppConfigurationService;
+import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app.pojo.CloudAppConfigurationPOJO;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.job.CloudJobConfigurationService;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.context.JobContext;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.fixture.CloudAppConfigurationBuilder;
@@ -200,7 +201,7 @@ public final class FacadeServiceTest {
     
     @Test
     public void assertLoadAppConfig() {
-        Optional<CloudAppConfiguration> appConfigOptional = Optional.of(CloudAppConfigurationBuilder.createCloudAppConfiguration("test_app"));
+        Optional<CloudAppConfigurationPOJO> appConfigOptional = Optional.of(CloudAppConfigurationBuilder.createCloudAppConfiguration("test_app"));
         when(appConfigService.load("test_app")).thenReturn(appConfigOptional);
         assertThat(facadeService.loadAppConfig("test_app"), is(appConfigOptional));
     }
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/test/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/producer/ProducerManagerTest.java b/elasticjob-cloud/elasticjob-cloud-scheduler/src/test/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/producer/ProducerManagerTest.java
index 5b4a573..a72f6fe 100755
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/test/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/producer/ProducerManagerTest.java
+++ b/elasticjob-cloud/elasticjob-cloud-scheduler/src/test/java/org/apache/shardingsphere/elasticjob/cloud/scheduler/producer/ProducerManagerTest.java
@@ -23,8 +23,8 @@ import org.apache.shardingsphere.elasticjob.cloud.ReflectionUtils;
 import org.apache.shardingsphere.elasticjob.cloud.config.CloudJobExecutionType;
 import org.apache.shardingsphere.elasticjob.cloud.config.pojo.CloudJobConfigurationPOJO;
 import org.apache.shardingsphere.elasticjob.cloud.exception.AppConfigurationException;
-import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app.CloudAppConfiguration;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app.CloudAppConfigurationService;
+import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.app.pojo.CloudAppConfigurationPOJO;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.config.job.CloudJobConfigurationService;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.fixture.CloudAppConfigurationBuilder;
 import org.apache.shardingsphere.elasticjob.cloud.scheduler.fixture.CloudJobConfigurationBuilder;
@@ -78,7 +78,7 @@ public final class ProducerManagerTest {
     
     private ProducerManager producerManager;
     
-    private final CloudAppConfiguration appConfig = CloudAppConfigurationBuilder.createCloudAppConfiguration("test_app");
+    private final CloudAppConfigurationPOJO appConfig = CloudAppConfigurationBuilder.createCloudAppConfiguration("test_app");
     
     private final CloudJobConfigurationPOJO transientJobConfig = CloudJobConfigurationBuilder.createCloudJobConfiguration("transient_test_job");