You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rocketmq.apache.org by zh...@apache.org on 2022/08/25 08:28:39 UTC

[rocketmq-connect] branch master updated: [ISSUE #255]Standardize configuration and update documentation (#259)

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

zhoubo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/rocketmq-connect.git


The following commit(s) were added to refs/heads/master by this push:
     new 037aaf6  [ISSUE #255]Standardize configuration and update documentation (#259)
037aaf6 is described below

commit 037aaf617a4a1593db2cc2a150506ec0503c6912
Author: xiaoyi <su...@163.com>
AuthorDate: Thu Aug 25 16:28:33 2022 +0800

    [ISSUE #255]Standardize configuration and update documentation (#259)
    
    * Fix debezium demecial type conversion problem #190
    
    * Upgrade rocketmq-replicator API to v0.1.3 #189
    
    * Encountered change event for table databasename.tablename whose schema isn`t known to this connector #191
    
    * Debezium mysql source connector delete event causes null pointer #196
    
    * remove local config
    
    * Debezium mysql source connector delete event causes null pointer #196
    
    * Rocketmq replicator running null pointer #205
    
    * Add pause and resume to the task, and optimize some rest APIs #238
    
    * fixed
    
    * fixed
    
    * remove useless code
    
    * Optimize WorkerSinkTask,add pause and resume feature, replace DefaultMQPullConsumer with DefaultLitePullConsumerImpl #238
    
    * fixed
    
    * fixed
    
    * fixed
    
    * fixed
    
    * fixed
    
    * custom MessageQueueListener #238
    
    * fixed
    
    * remove useless info
    
    * optimize rest APIs #238
    
    * add task rest api #238
    
    * fixed
    
    * fixed
    
    * fixed
    
    * fixed
    
    * Upgrade JAVALIN 2.8.0 to 4.6.4
    
    * fixed
    
    * fixed
    
    * fixed
    
    * fixed
    
    * fixed
    
    * fixed
    
    * test fixed bug
    
    * Optimize rest api #238
    
    * Fix state persistence logic
    
    * format code
    
    * fixed
    
    * optimize method
    
    * sink close auto commit
    
    * standard config
    
    * fixed
    
    * fixed
    
    * add config validate
    
    * fixed
    
    * fixed
    
    * update readme
    
    * add jackson
    
    * fixed
    
    * update config
    
    * add transform config
    
    * add debezium mysql config demo
    
    * fixed get status bug
    
    * format code
    
    * fixed
    
    * validate timestamp empty
    
    * reformat code
    
    * fix conflict
---
 README.md                                          | 302 +++++++++++++++------
 .../rocketmq-connect-debezium-mysql/README.md      |  28 ++
 connectors/rocketmq-connect-jdbc/README.md         |  73 ++---
 distribution/conf/connect-file-sink.properties     |   2 +-
 distribution/conf/connect-file-source.properties   |   2 +-
 pom.xml                                            |   5 +
 .../connect/runtime/DistributedConnectStartup.java |   4 +-
 .../connect/runtime/StandaloneConnectStartup.java  |   4 +-
 .../connect/runtime/config/ConnectorConfig.java    | 127 +++++++++
 .../runtime/config/RuntimeConfigDefine.java        | 111 --------
 .../runtime/config/SinkConnectorConfig.java        |  55 +++-
 .../runtime/config/SourceConnectorConfig.java      |  16 ++
 .../{ConnectConfig.java => WorkerConfig.java}      | 262 +++++++++++-------
 .../SourceTaskOffsetCommitter.java                 |  10 +-
 .../runtime/connectorwrapper/TransformChain.java   |  10 +-
 .../connect/runtime/connectorwrapper/Worker.java   |  30 +-
 .../runtime/connectorwrapper/WorkerConnector.java  |  11 +-
 .../runtime/connectorwrapper/WorkerDirectTask.java |   4 +-
 .../runtime/connectorwrapper/WorkerSinkTask.java   |  17 +-
 .../runtime/connectorwrapper/WorkerSourceTask.java |  16 +-
 .../runtime/connectorwrapper/WorkerTask.java       |   6 +-
 .../controller/AbstractConnectController.java      |  14 +-
 .../controller/distributed/DistributedConfig.java  |   4 +-
 .../distributed/DistributedConnectController.java  |   4 +-
 .../runtime/controller/isolation/Plugin.java       |   4 +-
 .../controller/standalone/StandaloneConfig.java    |   4 +-
 .../runtime/errors/DeadLetterQueueConfig.java      |  62 ++---
 .../runtime/errors/DeadLetterQueueReporter.java    |   9 +-
 .../runtime/errors/ReporterManagerUtil.java        |   4 +-
 .../service/AbstractConfigManagementService.java   |  34 ++-
 .../runtime/service/ClusterManagementService.java  |   6 +-
 .../service/ClusterManagementServiceImpl.java      |   8 +-
 .../runtime/service/ConfigManagementService.java   |   6 +-
 .../service/ConfigManagementServiceImpl.java       |  78 +++---
 .../runtime/service/DefaultConnectorContext.java   |   4 +-
 .../runtime/service/PositionManagementService.java |   6 +-
 .../service/PositionManagementServiceImpl.java     |   6 +-
 .../connect/runtime/service/RebalanceImpl.java     |   4 +-
 .../runtime/service/StateManagementService.java    |   4 +-
 .../service/StateManagementServiceImpl.java        |  18 +-
 .../memory/FilePositionManagementServiceImpl.java  |   4 +-
 .../memory/MemoryClusterManagementServiceImpl.java |   6 +-
 .../memory/MemoryConfigManagementServiceImpl.java  |  53 ++--
 .../memory/MemoryStateManagementServiceImpl.java   |   4 +-
 ...llocateConnAndTaskStrategyByConsistentHash.java |   6 +-
 .../connect/runtime/stats/ConnectStatsManager.java |   6 +-
 .../connect/runtime/utils/ConnectUtil.java         |  37 +--
 .../runtime/utils/datasync/BrokerBasedLog.java     |  18 +-
 .../connect/runtime/config/ConnectConfigTest.java  |   9 +-
 .../runtime/config/SinkConnectorConfigTest.java    |   6 +-
 .../SourceTaskOffsetCommitterTest.java             |   6 +-
 .../connectorwrapper/TransformChainTest.java       |   4 +-
 .../connectorwrapper/WorkerSinkTaskTest.java       |  20 +-
 .../connectorwrapper/WorkerSourceTaskTest.java     |  15 +-
 .../runtime/connectorwrapper/WorkerTest.java       |  33 ++-
 .../testimpl/TestPositionManageServiceImpl.java    |   4 +-
 .../DistributedConnectControllerTest.java          |   6 +-
 .../distributed/TestConfigManagementService.java   |   4 +-
 .../connect/runtime/rest/RestHandlerTest.java      |  18 +-
 .../service/ConfigManagementServiceImplTest.java   |  12 +-
 .../service/PositionManagementServiceImplTest.java |   6 +-
 .../connect/runtime/utils/TransferUtilsTest.java   |  14 +-
 .../runtime/utils/datasync/BrokerBasedLogTest.java |   6 +-
 .../rocketmq/connect/file/FilterTransform.java     |   1 -
 64 files changed, 1017 insertions(+), 655 deletions(-)

diff --git a/README.md b/README.md
index 2fb2e34..376af57 100644
--- a/README.md
+++ b/README.md
@@ -17,14 +17,15 @@ rocketmq-connect-sample的主要作用是从源文件中读取数据发送到Roc
 2. 64bit JDK 1.8+;
 3. Maven 3.2.x或以上版本;
 4. 启动 [RocketMQ](https://rocketmq.apache.org/docs/quick-start/);
-5. 创建测试Topic
-    sh  ${ROCKETMQ_HOME}/bin/mqadmin updateTopic -t fileTopic -n localhost:9876 -c DefaultCluster -r 8 -w 8
+5. 创建测试Topic 
+> sh ${ROCKETMQ_HOME}/bin/mqadmin updateTopic -t fileTopic -n localhost:9876 -c DefaultCluster -r 8 -w 8
 
-**tips** : ${ROCKETMQ_HOME} 位置说明
 
-bin-release.zip 版本:/rocketmq-all-4.9.4-bin-release
+**tips** : ${ROCKETMQ_HOME} 位置说明
 
-source-release.zip 版本:/rocketmq-all-4.9.4-source-release/distribution
+>bin-release.zip 版本:/rocketmq-all-4.9.4-bin-release
+> 
+>source-release.zip 版本:/rocketmq-all-4.9.4-source-release/distribution
 
 
 ## 2.构建Connect
@@ -48,16 +49,15 @@ sh bin/connect-standalone.sh -c conf/connect-standalone.conf &
 ```
 **tips**: 可修改 /bin/runconnect.sh 适当调整 JVM Parameters Configuration
 
-```
-JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m"
-```
+>JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m"
+
 runtime启动成功:
 
-The standalone worker boot success.
+>The standalone worker boot success.
 
 查看启动日志文件:
 
-tail -100f ~/logs/rocketmqconnect/connect_runtime.log
+>tail -100f ~/logs/rocketmqconnect/connect_runtime.log
 
 ctrl + c 退出日志
 
@@ -69,48 +69,49 @@ touch test-source-file.txt
 
 echo "Hello \r\nRocketMQ\r\n Connect" >> test-source-file.txt
 
-curl -X POST -H "Content-Type: application/json" http://127.0.0.1:8082/connectors/fileSourceConnector -d '{"connector-class":"org.apache.rocketmq.connect.file.FileSourceConnector","filename":"test-source-file.txt","connect-topicname":"fileTopic"}'
+curl -X POST -H "Content-Type: application/json" http://127.0.0.1:8082/connectors/fileSourceConnector -d '{"connector.class":"org.apache.rocketmq.connect.file.FileSourceConnector","filename":"test-source-file.txt","connect.topicname":"fileTopic"}'
 ```
 
 看到以下日志说明 file source connector 启动成功了
 
-tail -100f ~/logs/rocketmqconnect/connect_runtime.log
-
-2019-07-16 11:18:39 INFO pool-7-thread-1 - **Source task start**, config:{"properties":{"source-record-...
+>tail -100f ~/logs/rocketmqconnect/connect_runtime.log
+>
+>2019-07-16 11:18:39 INFO pool-7-thread-1 - **Source task start**, config:{"properties":{"source-record-...
 
 #### source connector配置说明
 
-| key                     | nullable | default               | description |
-| ----------------------- | -------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
-| connector-class         | false    |                                                  |实现 Connector接口的类名称(包含包名)|
-| filename                | false    |                                                                          | 数据源文件名称 |
-| connect-topicname       | false    |                                                                   |同步文件数据所需topic|
+| key               | nullable | default              | description              |
+|-------------------| -------- | ---------------------|--------------------------|
+| connector.class   | false    |                      | 实现 Connector接口的类名称(包含包名) |
+| filename          | false    |                      | 数据源文件名称                  |
+| connect.topicname | false    |                      | 同步文件数据所需topic            |
 
 
 ## 5.启动sink connector
 
 ```
-curl -X POST -H "Content-Type: application/json" http://127.0.0.1:8082/connectors/fileSinkConnector -d '{"connector-class":"org.apache.rocketmq.connect.file.FileSinkConnector","filename":"test-sink-file.txt","connect-topicname":"fileTopic"}'
+curl -X POST -H "Content-Type: application/json" http://127.0.0.1:8082/connectors/fileSinkConnector -d '{"connector.class":"org.apache.rocketmq.connect.file.FileSinkConnector","filename":"test-sink-file.txt","connect.topicnames":"fileTopic"}'
 
 cat test-sink-file.txt
 ```
 
-tail -100f ~/logs/rocketmqconnect/connect_runtime.log
+
+> tail -100f ~/logs/rocketmqconnect/connect_runtime.log
 
 看到以下日志说明file sink connector 启动成功了
 
-2019-07-16 11:24:58 INFO pool-7-thread-2 - **Sink task start**, config:{"properties":{"source-record-...
+> 2019-07-16 11:24:58 INFO pool-7-thread-2 - **Sink task start**, config:{"properties":{"source-record-...
 
 如果 test-sink-file.txt 生成并且与 source-file.txt 内容一样,说明整个流程正常运行。
 文件内容可能顺序不一样,这主要是因为RocketMQ发到不同queue时,接收不同queue消息顺序可能也不一致导致的,是正常的。
 
 #### sink connector配置说明
 
-| key                     | nullable | default | description                                                                            |
-| ----------------------- | -------- | ------- | -------------------------------------------------------------------------------------- |
-| connector-class         | false    |         | 实现Connector接口的类名称(包含包名)                                                  |
-| filename      | false    |         | sink拉去的数据保存到文件                                               |
-| connect-topicname | false    |         | sink需要处理数据消息topics                                             |
+| key                | nullable | default | description                                                                            |
+|--------------------| -------- | ------- | -------------------------------------------------------------------------------------- |
+| connector.class    | false    |         | 实现Connector接口的类名称(包含包名)                                                  |
+| filename           | false    |         | sink拉去的数据保存到文件                                               |
+| connect.topicnames | false    |         | sink需要处理数据消息topics                                             |
 
 ```  
 注:source/sink配置文件说明是以rocketmq-connect-sample为demo,不同source/sink connector配置有差异,请以具体sourc/sink connector 为准
@@ -129,7 +130,7 @@ curl     http://127.0.0.1:8082/connectors/fileSourceConnector/stop
 ```
 看到以下日志说明connector停止成功了
 
-**Source task stop**, config:{"properties":{"source-record-converter":"org.apache.rocketmq.connect.runtime.converter.JsonConverter","filename":"/home/zhoubo/IdeaProjects/my-new3-rocketmq-externals/rocketmq-connect/rocketmq-connect-runtime/source-file.txt","task-class":"org.apache.rocketmq.connect.file.FileSourceTask","topic":"fileTopic","connector-class":"org.apache.rocketmq.connect.file.FileSourceConnector","update-timestamp":"1564765189322"}}
+>**Source task stop**, config:{"properties":{"source-record-converter":"org.apache.rocketmq.connect.runtime.converter.JsonConverter","filename":"/home/zhoubo/IdeaProjects/my-new3-rocketmq-externals/rocketmq-connect/rocketmq-connect-runtime/source-file.txt","task-class":"org.apache.rocketmq.connect.file.FileSourceTask","topic":"fileTopic","connector-class":"org.apache.rocketmq.connect.file.FileSourceConnector","update-timestamp":"1564765189322"}}
 
 ## 7.停止Worker进程
 
@@ -137,19 +138,22 @@ curl     http://127.0.0.1:8082/connectors/fileSourceConnector/stop
 sh bin/connectshutdown.sh
 ```
 
-
 ## 8.日志目录
 
- ${user.home}/logs/rocketmqconnect 
+ >${user.home}/logs/rocketmqconnect 
 
 ## 9.配置文件
 
 持久化配置文件默认目录 /tmp/storeRoot
 
-1. connectorConfig.json connector配置持久化文件
-2. position.json        source connect数据处理进度持久化文件
-3. taskConfig.json      task配置持久化文件
-4. offset.json          sink connect数据消费进度持久化文件
+| key                  | description               |
+|----------------------|---------------------------|
+| connectorConfig.json | connector配置持久化文件          |
+| position.json        | source connect数据处理进度持久化文件 |
+| taskConfig.json      | task配置持久化文件               |
+| offset.json          | sink connect数据消费进度持久化文件   |
+| connectorStatus.json | connector 状态持久化文件         |
+| taskStatus.json      | task 状态持久化文件              |
 
 ## 10.配置说明
 
@@ -182,77 +186,208 @@ pluginPaths=rocketmq-connect-sample/target/rocketmq-connect-sample-0.0.1-SNAPSHO
 
 ## 11.其它restful接口
 
-
-查看集群节点信息:
-
+### 集群信息
++ 查看集群节点信息:
 ```
 curl -X GET http://(your worker ip):(port)/getClusterInfo
 ```
 
-查看集群中Connector和Task配置信息:
++ 重新加载Connector插件目录下的Connector包:
 
 ```
-curl -X GET http://(your worker ip):(port)/getConfigInfo
+curl -X GET http://(your worker ip):(port)/plugin/reload
 ```
 
-查看当前节点分配Connector和Task配置信息:
+### Connector/Task管理
 
++ 创建或更新connector(存在且配置不同会更新,不存在创建)
 ```
-curl -X GET http://(your worker ip):(port)/getAllocatedInfo
+curl -X GET http://(your worker ip):(port)/connectors/{connectorName}
 ```
-
-查看指定Connector配置信息:
-
++ Pause(暂停)指定的connector
+```
+curl -X GET http://(your worker ip):(port)/connectors/{connectorName}/pause
+```
++ Resume(重启)指定的connector
+```
+curl -X GET http://(your worker ip):(port)/connectors/{connectorName}/resume
+```
++ Pause(暂停)所有的connector
 ```
-curl -X GET http://(your worker ip):(port)/connectors/(connector name)/config
+curl -X GET http://(your worker ip):(port)/connectors/pause/all
 ```
 
-查看指定Connector状态:
++ Resume(重启)所有的connector
+```
+curl -X GET http://(your worker ip):(port)/connectors/resume/all
+```
 
++ 停止并删除指定的connector(谨慎使用)
+```
+curl -X GET http://(your worker ip):(port)/connectors/{connectorName}/stop
 ```
-curl -X GET http://(your worker ip):(port)/connectors/(connector name)/status
++ 停止并删除所有的connector(谨慎使用)
+```
+curl -X GET http://(your worker ip):(port)/connectors/stop/all
 ```
 
-停止所有Connector:
++ 列举集群中所有connector信息
+```
+curl -X GET http://(your worker ip):(port)/connectors/list
+```
++ 根据connectorName获取connector的配置信息
+```
+curl -X GET http://(your worker ip):(port)/connectors/{connectorName}/config
+```
++ 根据connectorName获取connector的状态
+```
+curl -X GET http://(your worker ip):(port)/connectors/{connectorName}/status
+```
++ 根据connectorName获取connector下所有task信息
+```
+curl -X GET http://(your worker ip):(port)/connectors/{connectorName}/tasks
+```
 
++ 根据connectorName和task id获取task状态
 ```
-curl -X GET http://(your worker ip):(port)/connectors/stopAll
+curl -X GET http://(your worker ip):(port)/connectors/{connectorName}/tasks/{task}/status
 ```
 
-重新加载Connector插件目录下的Connector包:
++ 获取当前worker分配的connector信息
+```
+curl -X GET http://(your worker ip):(port)/allocated/connectors
+```
 
++ 获取当前worker分配的task信息
 ```
-curl -X GET http://(your worker ip):(port)/plugin/reload
+curl -X GET http://(your worker ip):(port)/allocated/tasks
 ```
 
+
 从内存删除Connector配置信息(谨慎使用):
 
 ```
 curl -X GET http://(your worker ip):(port)/connectors/(connector name)/delete
 ```
+## 12.Connector通用配置参数说明
+
+| key                         | nullable | default                                     | description                                                                 |
+|-----------------------------|----------|---------------------------------------------|-----------------------------------------------------------------------------|
+| connector.class             | false    |                                             | 指定插件的class信息                                                                |
+| max.tasks                   | false    | 1                                           | connector下运行的task的数量,根据情况而定                                                 |
+| value.converter             | false    | org.apache.rocketmq.connect.runtime.converter.record.StringConverter | ConnectRecord key的转换器                                                       |
+| key.converter               | false    | org.apache.rocketmq.connect.runtime.converter.record.StringConverter | ConnectRecord value的转换器                                                     |
+| transforms                  | true     |                                             | 配置的数据转换器,多个需要用 ","分割                                                        |
+| errors.log.include.messages | true     | false                                       | 是否将导致故障的connector异常信息纪录在日志中                                                 |
+| errors.log.enable           | true     | false                                       | 如果为true,请将每个错误以及失败操作和问题记录的详细信息写入Connect应用程序日志。默认情况下,这是“false”,因此只报告不可容忍的错误。 |
+| errors.retry.timeout        | true     | 0                                           | 重试超时时间                                                                      |
+| errors.retry.delay.max.ms   | true     | 60000                                       | 重试延迟时间                                                                      |
+| errors.tolerance            | true     | ToleranceType.NONE                          | 在Connector操作期间容忍错误的行为。“NONE”是默认值,表示任何错误都将导致连接器任务立即失败;"ALL“更改行为以跳过有问题的记录。    |
+#### Transform配置案例[单个配置]
+```
+"transforms": "Replace",
+"transforms.Replace.field.pattern": "company",
+"transforms.Replace.field.replacement": "company02",
+"transforms.Replace.class": "org.apache.rocketmq.connect.transforms.PatternRename$Value",
+```
+#### Transform配置案例[多个配置],会按照配置顺序依次执行
+```
+"transforms": "Replace, Replace02",
+"transforms.Replace.field.pattern": "company",
+"transforms.Replace.field.replacement": "company02",
+"transforms.Replace.class": "org.apache.rocketmq.connect.transforms.PatternRename$Value",
+"transforms.Replace02.field.pattern": "company02",
+"transforms.Replace02.field.replacement": "company03",
+"transforms.Replace02.class": "org.apache.rocketmq.connect.transforms.PatternRename$Value",
+```
+> 1.transforms: 为固定配置,不可变
+> 
+> 2.Replace, Replace02: 为配置名称,可自定义, 多个用","分割,若为多个,下面配置均需重复配置
+> 
+> 3.transforms.${transform-name}.class: 用此配置来表示transform的class
+> 
+> 4.transforms.${transform-name}.{config.key}: transform中使用的多个配置项;
+
+#### Transform接口
+```java
+
+package io.openmessaging.connector.api.component;
+
+import io.openmessaging.KeyValue;
+import io.openmessaging.connector.api.data.ConnectRecord;
+
+public interface Transform<R extends ConnectRecord> extends Component {
+    default void validate(KeyValue config) {
+    }
+
+    R doTransform(R var1);
+}
 
 
-## 12.runtime配置参数说明
-
-| key                      | nullable | default                                                      | description                                                  |
-| ------------------------ | -------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
-| workerId                 | false    | DEFAULT_WORKER_1                                             | 集群节点唯一标识                                             |
-| namesrvAddr              | false    | loacalhost:9876                                              | RocketMQ Name Server地址列表,多个NameServer地址用分号隔开   |
-| httpPort                 | false    | 8082                                                         | runtime提供restful接口服务端口                               |
-| pluginPaths              | false    |                                                              | source或者sink目录,启动runttime时加载                       |
-| storePathRootDir         | true     | /tmp/connectorStore                                          | 持久化文件保存目录                                           |
-| positionPersistInterval  | true     | 20s                                                          | source端持久化position数据间隔                               |
-| offsetPersistInterval    | true     | 20s                                                          | sink端持久化offset数据间隔                                   |
-| configPersistInterval    | true     | 20s                                                          | 集群中配置信息持久化间隔                                     |
-| rmqProducerGroup         | true     | defaultProducerGroup                                         | Producer组名,多个Producer如果属于一个应用,发送同样的消息,则应该将它们归为同一组 |
-| rmqConsumerGroup         | true     | defaultConsumerGroup                                         | Consumer组名,多个Consumer如果属于一个应用,发送同样的消息,则应该将它们归为同一组 |
-| maxMessageSize           | true     | 4MB                                                          | RocketMQ最大消息大小                                         |
-| operationTimeout         | true     | 3s                                                           | Producer发送消息超时时间                                     |
-| rmqMaxRedeliveryTimes    | true     |                                                              | 最大重新消费次数                                             |
-| rmqMessageConsumeTimeout | true     | 3s                                                           | Consumer超时时间                                             |
-| rmqMaxConsumeThreadNums  | true     | 32                                                           | Consumer客户端最大线程数                                     |
-| rmqMinConsumeThreadNums  | true     | 1                                                            | Consumer客户端最小线程数                                     |
-| allocTaskStrategy        | true     | org.apache.rocketmq.connect.<br>runtime.service.strategy.<br>DefaultAllocateConnAndTaskStrategy | 负载均衡策略类                                               |
+```
+> 1. 自定义Transform只需要实现以上接口即可,将自定义包按照到 [pluginPaths]指定的插件目录下面即可;
+> 
+> 2. 平台已经实现的transform在 transforms module下面,欢迎大家定义和扩展更加丰富的transform库
+>> org.apache.rocketmq.connect.transforms.ChangeCase$Key
+>> org.apache.rocketmq.connect.transforms.ChangeCase$Value
+>> org.apache.rocketmq.connect.transforms.ExtractNestedField$Value
+>> org.apache.rocketmq.connect.transforms.ExtractNestedField$Key
+>> org.apache.rocketmq.connect.transforms.PatternRename$Key
+>> org.apache.rocketmq.connect.transforms.PatternRename$Value
+>> org.apache.rocketmq.connect.transforms.PatternFilter$Key
+>> org.apache.rocketmq.connect.transforms.PatternFilter$Value
+>> org.apache.rocketmq.connect.transforms.SetMaximumPrecision$Key
+>> org.apache.rocketmq.connect.transforms.SetMaximumPrecision$Value
+
+
+
+
+### Source Connector特殊配置
+| key                         | nullable | default | description                                          |
+|-----------------------------|---------|---------|------------------------------------------------------|
+| connect.topicname           | true    |         | 指定数据写入的topic,若不配置则直接取position中key为topic的值,若取不到则抛出异常  |
+
+### Sink Connector特殊配置
+| key                                               | nullable | default               | description                |
+|---------------------------------------------------|----------|-----------------------|----------------------------|
+| connect.topicnames                                | false    |                       | sink订阅的topic配置多个用","分割     |
+| task.group.id                                     | true     | connect-{connectName} | sink订阅topic的group id       |
+| errors.deadletterqueue.topic.name                 | true     |                       | 错误队列的topic配置               |
+| errors.deadletterqueue.read.queue.nums            | true     | 8                     | 错误队列创建时指定读的队列数             |
+| errors.deadletterqueue.write.queue.nums           | true     | 8                     | 错误队列创建时指定写的队列数             |
+| errors.deadletterqueue.context.properties.enable  | true     | false                 | 上报错误数据是否包含错误的详细的属性信息       |
+
+## 13.Worker配置参数说明
+
+> ❌ 表示该模式下不需要配置此选项
+> ✅ 表示该模式下配置生效
+
+| key                         | nullable | standalone | distributed | default                                                            | description                                       |
+|-----------------------------|----------|------------|-------------|--------------------------------------------------------------------|---------------------------------------------------|
+| workerId                    | false    | ✅ ️        | ✅           | DEFAULT_WORKER_1                                                   | 集群节点唯一标识                                          |
+| namesrvAddr                 | false    | ✅          | ✅           | loacalhost:9876                                                    | RocketMQ Name Server地址列表,多个NameServer地址用分号隔开      |
+| httpPort                    | false    | ✅          | ✅           | 8082                                                               | runtime提供restful接口服务端口                            |
+| pluginPaths                 | false    | ✅          | ✅           |                                                                    | source或者sink目录,启动runttime时加载                      |
+| storePathRootDir            | true     | ✅          | ✅           | /tmp/connectorStore                                                | 持久化文件保存目录                                         |
+| positionStoreTopic          | true     | ❌          | ✅           | connector-position-topic                                           | source端position变更通知topic                          |
+| positionPersistInterval     | true     | ✅          | ✅           | 20s                                                                | source端持久化position数据间隔                            |
+| configStoreTopic            | true     | ❌          | ✅           | connector-config-topic                                             | 集群connector配置变更通知topic                            |
+| configPersistInterval       | true     | ❌          | ✅           | 20s                                                                | 集群中配置信息持久化间隔                                      |
+| connectStatusTopic          | true     | ❌          | ✅           | connect-status-topic                                               | connector和task状态变更通知                              |
+| statePersistInterval        | true     | ❌          | ✅           | 20s                                                                | connector及task状态持久化间隔                             |
+| rmqProducerGroup            | true     | ✅          | ✅           | defaultProducerGroup                                               | Producer组名,多个Producer如果属于一个应用,发送同样的消息,则应该将它们归为同一组 |
+| rmqConsumerGroup            | true     | ✅          | ✅           | defaultConsumerGroup                                               | Consumer组名,多个Consumer如果属于一个应用,发送同样的消息,则应该将它们归为同一组 |
+| maxMessageSize              | true     | ✅          | ✅           | 4MB                                                                | RocketMQ最大消息大小                                    |
+| operationTimeout            | true     | ✅          | ✅           | 3s                                                                 | Producer发送消息超时时间                                  |
+| rmqMaxRedeliveryTimes       | true     | ✅          | ✅           |                                                                    | 最大重新消费次数                                          |
+| rmqMessageConsumeTimeout    | true     | ✅          | ✅           | 3s                                                                 | Consumer超时时间                                      |
+| rmqMaxConsumeThreadNums     | true     | ✅          | ✅           | 32                                                                 | Consumer客户端最大线程数                                  |
+| rmqMinConsumeThreadNums     | true     | ✅          | ✅           | 1                                                                  | Consumer客户端最小线程数                                  |
+| allocTaskStrategy           | true     | ✅          | ✅           | org.apache.rocketmq.connect.<br>runtime.service.strategy.<br>DefaultAllocateConnAndTaskStrategy | 负载均衡策略类                                           |
+| offsetCommitTimeoutMsConfig | true     | ✅          | ✅           | 5000L                                                              | source和sink offset提交超时时间                          |
+| offsetCommitIntervalMsConfig| true     | ✅          | ✅           | 60000L                                                             | source和sink offset提交间隔时间配置                        |
+| keyConverter                | true     | ✅          | ✅           | org.apache.rocketmq.connect.runtime.converter.record.StringConverter | 集群配置默认 key 转换器                                    |
+| valueConverter              | true     | ✅          | ✅           | org.apache.rocketmq.connect.runtime.converter.record.StringConverter | 集群配置默认 Value 转换器                                  |
 
 ### allocTaskStrategy说明
 
@@ -271,7 +406,7 @@ org.apache.rocketmq.connect.runtime.service.strategy.AllocateConnAndTaskStrategy
 
 [负载均衡](https://rocketmq-1.gitbook.io/rocketmq-connector/rocketmq-connect-1/rocketmq-runtime/fu-zai-jun-heng)
 
-## 13.runtime支持JVM参数说明
+## 14.runtime支持JVM参数说明
 
 | key                                             | nullable | default | description             |
 | ----------------------------------------------- | -------- | ------- | ----------------------- |
@@ -330,37 +465,38 @@ private static class MD5Hash implements HashFunction {
 }
 ```
 
-##开发指南
-如何在IDE中启动Connect Worker ?
+### 开发指南
 
-###单机模式启动Connect Worker
+> 如何在IDE中启动Connect Worker ?
 
-Main Class配置
-org.apache.rocketmq.connect.runtime.StandaloneConnectStartup
+### 单机模式启动Connect Worker
+
+Main Class配置:
+>org.apache.rocketmq.connect.runtime.StandaloneConnectStartup
 
 ![img_2.png](img_2.png)
 
 Program arguments配置
 
--c  ${user path}/rocketmq-connect/distribution/conf/connect-standalone.conf
+> -c  ${user path}/rocketmq-connect/distribution/conf/connect-standalone.conf
 
 Environment variables配置
 
-CONNECT_HOME=${user path}/rocketmq-connect/distribution
+> CONNECT_HOME=${user path}/rocketmq-connect/distribution
 
 ###集群模式启动Connect Worker
 
 Main Class配置
-org.apache.rocketmq.connect.runtime.DistributedConnectStartup
+>org.apache.rocketmq.connect.runtime.DistributedConnectStartup
 
 
 Program arguments配置
 
--c  ${user path}/rocketmq-connect/distribution/conf/connect-distributed.conf
+>-c  ${user path}/rocketmq-connect/distribution/conf/connect-distributed.conf
 
 Environment variables配置
 
-CONNECT_HOME=${user path}/rocketmq-connect/distribution
+>CONNECT_HOME=${user path}/rocketmq-connect/distribution
 
 
 
diff --git a/connectors/rocketmq-connect-debezium/rocketmq-connect-debezium-mysql/README.md b/connectors/rocketmq-connect-debezium/rocketmq-connect-debezium-mysql/README.md
new file mode 100644
index 0000000..7e1dce1
--- /dev/null
+++ b/connectors/rocketmq-connect-debezium/rocketmq-connect-debezium-mysql/README.md
@@ -0,0 +1,28 @@
+```
+{
+    "connector.class":"org.apache.rocketmq.connect.debezium.mysql.DebeziumMysqlConnector",
+    "max.tasks":"1",
+    "connect.topicname":"debezium-mysql-source",
+    "kafka.transforms": "Unwrap",
+    "kafka.transforms.Unwrap.delete.handling.mode": "none",
+    "kafka.transforms.Unwrap.type": "io.debezium.transforms.ExtractNewRecordState",
+    "kafka.transforms.Unwrap.add.headers": "op,source.db,source.table",
+    "database.history.name.srv.addr": "localhost:9876",
+    "database.history.rocketmq.topic": "db-history-debezium-topic",
+    "database.history.store.only.monitored.tables.ddl": true,
+    "include.schema.changes": false,
+    "database.server.name": "server-1",
+    "database.port": 3306,
+    "database.hostname": “localhost”,
+    "database.user": “*******”,
+    "database.password": “**********”,
+    "database.connectionTimeZone": "Asia/Shanghai",
+    "table.include.list": "testdb.testTable",
+    "max.batch.size": 5,
+    "database.include.list": "testdb",
+    "snapshot.mode": "when_needed",
+    "key.converter":"org.apache.rocketmq.connect.runtime.converter.record.json.JsonConverter",
+    "value.converter":"org.apache.rocketmq.connect.runtime.converter.record.json.JsonConverter"
+}
+
+```
\ No newline at end of file
diff --git a/connectors/rocketmq-connect-jdbc/README.md b/connectors/rocketmq-connect-jdbc/README.md
index d295290..ddd6b3e 100644
--- a/connectors/rocketmq-connect-jdbc/README.md
+++ b/connectors/rocketmq-connect-jdbc/README.md
@@ -17,18 +17,17 @@ mvn clean package -Dmaven.test.skip=true
 ```
 POST  http://${runtime-ip}:${runtime-port}/connectors/${rocketmq-jdbc-source-connector-name}
 {
-    "connector-class":"org.apache.rocketmq.connect.jdbc.connector.JdbcSourceConnector",
-    "max-task":"2",
-    "connection.url":"jdbc:mysql://XXXXXXXXX:3306/{sourceDbName}",
+    "connector.class":"org.apache.rocketmq.connect.jdbc.connector.JdbcSourceConnector",
+    "max.tasks":"2",
+    "connection.url":"jdbc:mysql://XXXXXXXXX:3306",
     "connection.user":"*****",
     "connection.password":"*****",
     "table.whitelist":"db.table",
     "mode": "incrementing",
     "incrementing.column.name":"id",
     "timestamp.initial": -1,
-    "connect-topicname":"targetTopic",
-    "key-converter":"org.apache.rocketmq.connect.runtime.converter.record.json.JsonConverter",
-    "value-converter":"org.apache.rocketmq.connect.runtime.converter.record.json.JsonConverter"
+    "key.converter":"org.apache.rocketmq.connect.runtime.converter.JsonConverter",
+    "value.converter":"org.apache.rocketmq.connect.runtime.converter.JsonConverter"
 }
 ```
 
@@ -46,8 +45,8 @@ POST  http://${runtime-ip}:${runtime-port}/connectors/${rocketmq-jdbc-sink-conne
     "pk.fields":"id",
     "pk.mode":"record_value",
     "insert.mode":"UPSERT",
-    "key-converter":"org.apache.rocketmq.connect.runtime.converter.record.json.JsonConverter",
-    "value-converter":"org.apache.rocketmq.connect.runtime.converter.record.json.JsonConverter"
+    "key.converter":"org.apache.rocketmq.connect.runtime.converter.JsonConverter",
+    "value.converter":"org.apache.rocketmq.connect.runtime.converter.JsonConverter"
 }
 ```
 
@@ -63,21 +62,22 @@ http://${runtime-ip}:${runtime-port}/connectors/${rocketmq-jdbc-connector-name}/
 
 * **jdbc-source-connector 参数说明**
 
-|         KEY                 |  TYPE   | Must be filled | Description| Example
-|------------------------|----|---------|---------------|------------------|
-|connection.url               | String  | YES           | source端 jdbc连接 | jdbc:mysql://XXXXXXXXX:3306|
-|connection.user              | String  | YES           | source端 DB 用户名 | root |
-|connection.password          | String  | YES           | source端 DB 密码   | root |
-|connection.attempts          | String  | YES           | source端 DB连接重试次数 | 3 |
-|connection.backoff.ms        | Long    | YES           |  |
-|poll.interval.ms             | Long    | YES           |拉取间隔时间  | 3000ms |
-|batch.max.rows               | Integer | NO            |每次拉取数量 | 300 |
-|mode                         | Integer | NO            |拉取模式 | bulk、timestamp、incrementing、timestamp+incrementing |
-|incrementing.column.name     | Integer | NO            |增量字段,常用ID  | id |
-|timestamp.column.name        | String  | YES           |时间增量字段 | modified_time |
-|table.whitelist              | String  | YES           |需要扫描的表 | db.table,db.table01 |
-|max-task                     | Integer | YES           |任务数量,最大不能大于表的数量 | 2 |
-|source-record-converter      | Integer | YES           |data转换器  | org.apache.rocketmq.connect.runtime.converter.JsonConverter |
+| KEY                      |  TYPE   | Must be filled | Description      | Example                                                     
+|--------------------------|----|---------|------------------|-------------------------------------------------------------|
+| connection.url           | String  | YES           | source端 jdbc连接   | jdbc:mysql://XXXXXXXXX:3306                                 |
+| connection.user          | String  | YES           | source端 DB 用户名   | root                                                        |
+| connection.password      | String  | YES           | source端 DB 密码    | root                                                        |
+| connection.attempts      | String  | YES           | source端 DB连接重试次数 | 3                                                           |
+| connection.backoff.ms    | Long    | YES           |                  |
+| poll.interval.ms         | Long    | YES           | 拉取间隔时间           | 3000ms                                                      |
+| batch.max.rows           | Integer | NO            | 每次拉取数量           | 300                                                         |
+| mode                     | Integer | NO            | 拉取模式             | bulk、timestamp、incrementing、timestamp+incrementing          |
+| incrementing.column.name | Integer | NO            | 增量字段,常用ID        | id                                                          |
+| timestamp.column.name    | String  | YES           | 时间增量字段           | modified_time                                               |
+| table.whitelist          | String  | YES           | 需要扫描的表           | db.table,db.table01                                         |
+| max.tasks                | Integer | YES           | 任务数量,最大不能大于表的数量  | 默认是1                                                        |
+| value.converter          | Integer | YES           | value转换器         | org.apache.rocketmq.connect.runtime.converter.record.json.JsonConverter |
+| key.converter            | Integer | YES           | key转换器           | org.apache.rocketmq.connect.runtime.converter.record.json.JsonConverter |
 
 ```  
 注:1.source拉取的数据写入到以表名自动创建的topic中,如果需要写入特定的topic中则需要指定"connect-topicname" 参数
@@ -86,19 +86,20 @@ http://${runtime-ip}:${runtime-port}/connectors/${rocketmq-jdbc-connector-name}/
 
 * **jdbc-sink-connector 参数说明**
 
-|         KEY                 |  TYPE   | Must be filled | Description| Example
-|------------------------|----|---------|---------------|------------------|
-|connection.url               | String  | YES           | sink端 jdbc连接          | jdbc:mysql://XXXXXXXXX:3306|
-|connection.user              | String  | YES           | sink端 DB 用户名 | root |
-|connection.password          | String  | YES           | sink端 DB 密码   | root |
-|connection.attempts          | String  | NO           | sink端 DB连接重试次数 | 3 |
-|connection.backoff.ms        | Long    | NO           |  |
-|connect-topicname            | Long    | YES          |监听的topic  | topic-name |
-|pk.fields                     | String  | NO           |写入侧主键配置,用于更新使用 | id |
-|pk.mode                      | String  | NO           |获取主键的模式 | none、record_value |
-|insert.mode                  | Integer | YES           |写入模式 | UPDATE、UPSERT、INSERT |
-|max-task                     | Integer | NO           |任务数量 | 2 |
-|source-record-converter      | Integer | YES          |data转换器  | org.apache.rocketmq.connect.runtime.converter.JsonConverter |
+| KEY                     |  TYPE   | Must be filled | Description| Example
+|-------------------------|----|---------|---------------|------------------|
+| connection.url          | String  | YES           | sink端 jdbc连接          | jdbc:mysql://XXXXXXXXX:3306|
+| connection.user         | String  | YES           | sink端 DB 用户名 | root |
+| connection.password     | String  | YES           | sink端 DB 密码   | root |
+| connection.attempts     | String  | NO           | sink端 DB连接重试次数 | 3 |
+| connection.backoff.ms   | Long    | NO           |  |
+| connect-topicname       | Long    | YES          |监听的topic  | topic-name |
+| pk.fields               | String  | NO           |写入侧主键配置,用于更新使用 | id |
+| pk.mode                 | String  | NO           |获取主键的模式 | none、record_value |
+| insert.mode             | Integer | YES           |写入模式 | UPDATE、UPSERT、INSERT |
+| max.tasks               | Integer | NO           |任务数量 | 2 |
+| value.converter          | Integer | YES           | value转换器         | org.apache.rocketmq.connect.runtime.converter.record.json.JsonConverter |
+| key.converter            | Integer | YES           | key转换器           | org.apache.rocketmq.connect.runtime.converter.record.json.JsonConverter |
 
 ```  
 注: openMLDB maven包的引入:
diff --git a/distribution/conf/connect-file-sink.properties b/distribution/conf/connect-file-sink.properties
index 6efe7e5..dc0d191 100644
--- a/distribution/conf/connect-file-sink.properties
+++ b/distribution/conf/connect-file-sink.properties
@@ -16,4 +16,4 @@
 name=FileSinkConnector
 connector.class=org.apache.rocketmq.connect.file.FileSinkConnector
 file=test-sink.txt
-connect-topicname=TopicTest
\ No newline at end of file
+connect.topicnames=TopicTest
\ No newline at end of file
diff --git a/distribution/conf/connect-file-source.properties b/distribution/conf/connect-file-source.properties
index 5b3fc71..139f48e 100644
--- a/distribution/conf/connect-file-source.properties
+++ b/distribution/conf/connect-file-source.properties
@@ -16,4 +16,4 @@
 name=FileSourceConnector
 connector.class=org.apache.rocketmq.connect.file.FileSourceConnector
 file=test-source.txt
-connect-topicname=TopicTest
\ No newline at end of file
+connect.topicname=TopicTest
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 59ac233..19f5e4d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -123,6 +123,11 @@
                 <artifactId>rocketmq-client</artifactId>
                 <version>${rocketmq.version}</version>
             </dependency>
+            <dependency>
+                <groupId>com.fasterxml.jackson.core</groupId>
+                <artifactId>jackson-databind</artifactId>
+                <version>${jackson.version}</version>
+            </dependency>
             <dependency>
                 <groupId>org.reflections</groupId>
                 <artifactId>reflections</artifactId>
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/DistributedConnectStartup.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/DistributedConnectStartup.java
index 4e468a3..53e644b 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/DistributedConnectStartup.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/DistributedConnectStartup.java
@@ -32,7 +32,7 @@ import org.apache.commons.cli.Options;
 import org.apache.commons.cli.PosixParser;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.rocketmq.connect.runtime.common.LoggerName;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.connect.runtime.controller.distributed.DistributedConfig;
 import org.apache.rocketmq.connect.runtime.controller.distributed.DistributedConnectController;
 import org.apache.rocketmq.connect.runtime.service.ClusterManagementService;
@@ -110,7 +110,7 @@ public class DistributedConnectStartup {
             }
 
             if (null == connectConfig.getConnectHome()) {
-                System.out.printf("Please set the %s variable in your environment to match the location of the Connect installation", ConnectConfig.CONNECT_HOME_ENV);
+                System.out.printf("Please set the %s variable in your environment to match the location of the Connect installation", WorkerConfig.CONNECT_HOME_ENV);
                 System.exit(-2);
             }
 
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/StandaloneConnectStartup.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/StandaloneConnectStartup.java
index 3b61f53..ad1d64a 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/StandaloneConnectStartup.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/StandaloneConnectStartup.java
@@ -25,7 +25,7 @@ import org.apache.commons.cli.Options;
 import org.apache.commons.cli.PosixParser;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.rocketmq.connect.runtime.common.LoggerName;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.connect.runtime.controller.isolation.Plugin;
 import org.apache.rocketmq.connect.runtime.controller.standalone.StandaloneConfig;
 import org.apache.rocketmq.connect.runtime.controller.standalone.StandaloneConnectController;
@@ -109,7 +109,7 @@ public class StandaloneConnectStartup {
             }
 
             if (null == connectConfig.getConnectHome()) {
-                System.out.printf("Please set the %s variable in your environment to match the location of the Connect installation", ConnectConfig.CONNECT_HOME_ENV);
+                System.out.printf("Please set the %s variable in your environment to match the location of the Connect installation", WorkerConfig.CONNECT_HOME_ENV);
                 System.exit(-2);
             }
 
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/config/ConnectorConfig.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/config/ConnectorConfig.java
new file mode 100644
index 0000000..fcc7ba2
--- /dev/null
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/config/ConnectorConfig.java
@@ -0,0 +1,127 @@
+/*
+ * 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.rocketmq.connect.runtime.config;
+
+import io.openmessaging.connector.api.data.ConnectRecord;
+import io.openmessaging.connector.api.errors.ConnectException;
+import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
+import org.apache.rocketmq.connect.runtime.errors.ToleranceType;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Define keys for connector and task configs.
+ */
+public class ConnectorConfig {
+    protected ConnectKeyValue config;
+
+    public ConnectorConfig(ConnectKeyValue config) {
+        this.config = config;
+        validate();
+    }
+
+    /**
+     * original config
+     *
+     * @return
+     */
+    public Map<String, String> originalConfig() {
+        return config.getProperties();
+    }
+
+    /**
+     * The full class name of a specific connector implements.
+     */
+    public static final String CONNECTOR_CLASS = "connector.class";
+
+    public static final String TASK_CLASS = "task.class";
+
+    public static final String TASK_ID = "task.id";
+
+    public static final String MAX_TASK = "max.tasks";
+    public static final int TASKS_MAX_DEFAULT = 1;
+
+    public static final String TASK_TYPE = "task.type";
+
+    public static final String CONNECTOR_DIRECT_ENABLE = "connector.direct.enable";
+    public static final String SOURCE_TASK_CLASS = "source.task.class";
+    public static final String SINK_TASK_CLASS = "sink.task.class";
+
+
+    /**
+     * Last updated time of the configuration.
+     */
+    public static final String UPDATE_TIMESTAMP = "update.timestamp";
+
+    /**
+     * The full class name of record converter. Which is used to parse {@link ConnectRecord} to/from byte[].
+     */
+    public static final String VALUE_CONVERTER = "value.converter";
+    public static final String KEY_CONVERTER = "key.converter";
+
+    public static final String TRANSFORMS = "transforms";
+
+    public static final String CONNECT_TIMESTAMP = "connect.timestamp";
+
+    public static final String HASH_FUNC = "consistentHashFunc";
+
+    public static final String VIRTUAL_NODE = "virtualNode";
+
+    public static final String ERRORS_LOG_INCLUDE_MESSAGES_CONFIG = "errors.log.include.messages";
+    public static final boolean ERRORS_LOG_INCLUDE_MESSAGES_DEFAULT = false;
+
+    public static final String ERRORS_LOG_ENABLE_CONFIG = "errors.log.enable";
+    public static final boolean ERRORS_LOG_ENABLE_DEFAULT = false;
+
+    // The default is 0, which means no retries will be attempted. Use -1 for infinite retries.
+    public static final String ERRORS_RETRY_TIMEOUT_CONFIG = "errors.retry.timeout";
+    public static final int ERRORS_RETRY_TIMEOUT_DEFAULT = 0;
+
+    public static final String ERRORS_RETRY_MAX_DELAY_CONFIG = "errors.retry.delay.max.ms";
+    public static final int ERRORS_RETRY_MAX_DELAY_DEFAULT = 60000;
+
+    public static final String ERRORS_TOLERANCE_CONFIG = "errors.tolerance";
+    public static final ToleranceType ERRORS_TOLERANCE_DEFAULT = ToleranceType.NONE;
+
+    /**
+     * The required key for all configurations.
+     */
+    public static final Set<String> REQUEST_CONFIG = new HashSet<String>() {
+        {
+            add(CONNECTOR_CLASS);
+        }
+    };
+
+    /**
+     * Maximum allowed message size in bytes, the default value is 4M.
+     */
+    public static final int MAX_MESSAGE_SIZE = Integer.parseInt(System.getProperty("rocketmq.runtime.max.message.size", "4194304"));
+
+
+    /**
+     * validate
+     */
+    public void validate() {
+        if (!config.containsKey(CONNECTOR_CLASS)) {
+            throw new ConnectException("Config connector.class cannot be empty");
+        }
+    }
+}
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/config/RuntimeConfigDefine.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/config/RuntimeConfigDefine.java
deleted file mode 100644
index 7139596..0000000
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/config/RuntimeConfigDefine.java
+++ /dev/null
@@ -1,111 +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.rocketmq.connect.runtime.config;
-
-import io.openmessaging.connector.api.data.ConnectRecord;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Define keys for connector and task configs.
- */
-public class RuntimeConfigDefine {
-
-    /**
-     * The full class name of a specific connector implements.
-     */
-    public static final String CONNECTOR_CLASS = "connector-class";
-
-    public static final String CONNECTOR_DIRECT_ENABLE = "connector-direct-enable";
-
-    public static final String TASK_CLASS = "task-class";
-
-    public static final String TASK_ID = "task-id";
-
-    public static final String TASK_GROUP_ID = "task-group-id";
-
-    public static final String TASK_TYPE = "task-type";
-
-    public static final String SOURCE_TASK_CLASS = "source-task-class";
-
-    public static final String SINK_TASK_CLASS = "sink-task-class";
-
-    public static final String MAX_TASK = "max-task";
-
-    public static final String CONNECTOR_ID = "connector-id";
-
-    /**
-     * Last updated time of the configuration.
-     */
-    public static final String UPDATE_TIMESTAMP = "update-timestamp";
-    
-    /**
-     * The full class name of record converter. Which is used to parse {@link ConnectRecord} to/from byte[].
-     */
-    public static final String SOURCE_RECORD_CONVERTER = "value-converter";
-    public static final String SOURCE_RECORD_CONVERTER_DEFAULT = "org.apache.rocketmq.connect.runtime.converter.record.StringConverter";
-    public static final String SOURCE_RECORD_KEY_CONVERTER = "key-converter";
-    public static final String SOURCE_RECORD_KEY_CONVERTER_DEFAULT = "org.apache.rocketmq.connect.runtime.converter.record.StringConverter";
-
-    public static final String NAMESRV_ADDR = "namesrv-addr";
-
-    public static final String RMQ_PRODUCER_GROUP = "rmq-producer-group";
-
-    public static final String RMQ_CONSUMNER_GROUP = "rmq-consumer-group";
-
-    public static final String OPERATION_TIMEOUT = "operation-timeout";
-
-    public static final String HASH_FUNC = "consistentHashFunc";
-
-    public static final String VIRTUAL_NODE = "virtualNode";
-
-    public static final String CONNECT_SHARDINGKEY = "connect-shardingkey";
-
-    public static final String CONNECT_TOPICNAME = "connect-topicname";
-
-    public static final String CONNECT_TOPICNAMES = "connect-topicnames";
-
-    public static final String CONNECT_SOURCE_PARTITION = "connect-source-partition";
-
-    public static final String CONNECT_SOURCE_POSITION = "connect-source-position";
-
-    public static final String CONNECT_ENTRYTYPE = "connect-entrytype";
-
-    public static final String CONNECT_TIMESTAMP = "connect-timestamp";
-
-    public static final String CONNECT_SCHEMA = "connect-schema";
-
-    public static final String TRANSFORMS = "transforms";
-
-    /**
-     * The required key for all configurations.
-     */
-    public static final Set<String> REQUEST_CONFIG = new HashSet<String>() {
-        {
-            add(CONNECTOR_CLASS);
-            add(CONNECT_TOPICNAME);
-        }
-    };
-
-    /**
-     * Maximum allowed message size in bytes, the default value is 4M.
-     */
-    public static final int MAX_MESSAGE_SIZE = Integer.parseInt(System.getProperty("rocketmq.runtime.max.message.size", "4194304"));
-
-}
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/config/SinkConnectorConfig.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/config/SinkConnectorConfig.java
index b513078..26f16e3 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/config/SinkConnectorConfig.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/config/SinkConnectorConfig.java
@@ -19,18 +19,56 @@
 package org.apache.rocketmq.connect.runtime.config;
 
 import com.google.common.base.Splitter;
+
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+
+import io.openmessaging.connector.api.errors.ConnectException;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.rocketmq.common.message.MessageQueue;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
+import org.apache.rocketmq.connect.runtime.errors.DeadLetterQueueConfig;
+
+/**
+ * sink connector config
+ */
+public class SinkConnectorConfig extends ConnectorConfig {
+
+    public static final String SEMICOLON = ";";
+
+
+    public static final String CONNECT_TOPICNAMES = "connect.topicnames";
+
+    public static final String TASK_GROUP_ID = "task.group.id";
+
+
+    /**
+     * dead letter queue config
+     */
+    public static final String DLQ_PREFIX = "errors.deadletterqueue.";
+    public static final String DLQ_TOPIC_NAME_CONFIG = DLQ_PREFIX + "topic.name";
 
-public class SinkConnectorConfig extends ConnectConfig {
+    public static final String DLQ_TOPIC_READ_QUEUE_NUMS = DLQ_PREFIX + "read.queue.nums";
+    public static final short DLQ_TOPIC_READ_QUEUE_NUMS_DEFAULT = 8;
 
-    public static Set<String> parseTopicList(ConnectKeyValue taskConfig) {
-        String messageQueueStr = taskConfig.getString(RuntimeConfigDefine.CONNECT_TOPICNAME);
+    public static final String DLQ_TOPIC_WRITE_QUEUE_NUMS = DLQ_PREFIX + "write.queue.nums";
+    public static final short DLQ_TOPIC_WRITE_QUEUE_NUMS_DEFAULT = 8;
+
+    public static final String DLQ_CONTEXT_PROPERTIES_ENABLE_CONFIG = DLQ_PREFIX + "context.properties.enable";
+    public static final boolean DLQ_CONTEXT_PROPERTIES_ENABLE_DEFAULT = false;
+
+    public SinkConnectorConfig(ConnectKeyValue config) {
+        super(config);
+    }
+
+    public DeadLetterQueueConfig parseDeadLetterQueueConfig() {
+        return new DeadLetterQueueConfig(super.config);
+    }
+
+    public Set<String> parseTopicList() {
+        String messageQueueStr = this.config.getString(SinkConnectorConfig.CONNECT_TOPICNAMES);
         if (StringUtils.isBlank(messageQueueStr)) {
             return null;
         }
@@ -45,4 +83,15 @@ public class SinkConnectorConfig extends ConnectConfig {
         }
         return new MessageQueue(messageQueueStrList.get(0), messageQueueStrList.get(1), Integer.valueOf(messageQueueStrList.get(2)));
     }
+
+    /**
+     * validate
+     */
+    @Override
+    public void validate() {
+        super.validate();
+        if (!config.containsKey(CONNECT_TOPICNAMES)) {
+            throw new ConnectException("Config connect.topicnames cannot be empty");
+        }
+    }
 }
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/config/SourceConnectorConfig.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/config/SourceConnectorConfig.java
new file mode 100644
index 0000000..7fc12ec
--- /dev/null
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/config/SourceConnectorConfig.java
@@ -0,0 +1,16 @@
+package org.apache.rocketmq.connect.runtime.config;
+
+import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
+
+/**
+ * source connector config
+ */
+public class SourceConnectorConfig extends ConnectorConfig {
+
+    public static final String CONNECT_TOPICNAME = "connect.topicname";
+
+    public SourceConnectorConfig(ConnectKeyValue config) {
+        super(config);
+    }
+
+}
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/config/ConnectConfig.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/config/WorkerConfig.java
similarity index 78%
rename from rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/config/ConnectConfig.java
rename to rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/config/WorkerConfig.java
index b4d63e9..69bcacf 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/config/ConnectConfig.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/config/WorkerConfig.java
@@ -28,16 +28,11 @@ import static org.apache.rocketmq.connect.runtime.common.LoggerName.ROCKETMQ_RUN
 /**
  * Configurations for runtime.
  */
-public class ConnectConfig {
+public class WorkerConfig {
     private static final Logger log = LoggerFactory.getLogger(ROCKETMQ_RUNTIME);
-
     public static final String CONNECT_HOME_PROPERTY = "connect.home.dir";
-
     public static final String CONNECT_HOME_ENV = "CONNECT_HOME";
-
-    public static final String COMMA = ",";
-
-    public static final String SEMICOLON = ";";
+    private String connectHome = System.getProperty(CONNECT_HOME_PROPERTY, System.getenv(CONNECT_HOME_ENV));
 
     /**
      * The unique ID of each worker instance in the cluster
@@ -45,55 +40,95 @@ public class ConnectConfig {
     private String workerId = "DefaultWorker";
 
     /**
-     * Storage directory for file store.
+     * Group listening for cluster changes
      */
-    private String storePathRootDir = System.getProperty("user.home") + File.separator + "connectorStore";
-
-    private String connectHome = System.getProperty(CONNECT_HOME_PROPERTY, System.getenv(CONNECT_HOME_ENV));
+    private String connectClusterId = "DefaultConnectCluster";
 
+    /**
+     * config example:
+     * namesrvAddr = localhost:9876
+     */
     private String namesrvAddr = System.getProperty(MixAll.NAMESRV_ADDR_PROPERTY, System.getenv(MixAll.NAMESRV_ADDR_ENV));
 
-    private String rmqProducerGroup = "connector-producer-group";
-
-    private int maxMessageSize;
-
-    private int operationTimeout = 3000;
-
-    private String rmqConsumerGroup = "connector-consumer-group";
+    /**
+     * Http port for REST API.
+     */
+    private int httpPort = 8082;
 
-    private int rmqMaxRedeliveryTimes;
+    /**
+     * plugin paths config;
+     * Multiple use ',' split
+     * config example:
+     * pluginPaths = /tmp/plugins/,/app/plugins/
+     */
+    private String pluginPaths;
 
-    private int rmqMessageConsumeTimeout = 3000;
+    /**
+     * rocketmq access control config;
+     * config example:
+     * aclEnable = true
+     * accessKey = 12345
+     * secretKey = 11111
+     */
+    private boolean aclEnable = false;
+    private String accessKey;
+    private String secretKey;
 
-    private int rmqMaxConsumeThreadNums = 32;
+    /**
+     * auto create group enable config:
+     * config example:
+     * autoCreateGroupEnable = false
+     */
+    private boolean autoCreateGroupEnable = false;
 
-    private int rmqMinConsumeThreadNums = 1;
+    /**
+     * Configure cluster converter
+     */
+    private String keyConverter = "org.apache.rocketmq.connect.runtime.converter.record.StringConverter";
+    private String valueConverter = "org.apache.rocketmq.connect.runtime.converter.record.StringConverter";
 
-    /** Task start timeout mills, default 3 minute */
-    private long maxStartTimeoutMills = 1000 * 60 * 3;
+    /**
+     * Storage directory for file store.
+     * config example:
+     * storePathRootDir = /tmp/storeRoot
+     */
+    private String storePathRootDir = System.getProperty("user.home") + File.separator + "connectorStore";
 
-    // task stop timeout mills, default 1 minute
-    private long maxStopTimeoutMills = 1000 * 60;
+    private int maxMessageSize;
 
-    // offset commit timeout
-    private long offsetCommitTimeoutMsConfig = 1000 * 30;
+    private int operationTimeout = 3000;
 
-    private int brokerSuspendMaxTimeMillis = 300;
 
     /**
      * Default topic to send/consume online or offline message.
      */
     private String clusterStoreTopic = "connector-cluster-topic";
+    /**
+     * Task allocated strategy
+     * config example with default:
+     * allocTaskStrategy
+     */
+    private String allocTaskStrategy = "org.apache.rocketmq.connect.runtime.service.strategy.DefaultAllocateConnAndTaskStrategy";
+
 
     /**
      * Default topic to send/consume config change message.
      */
     private String configStoreTopic = "connector-config-topic";
 
+    /**
+     * Connector configuration persistence interval.
+     */
+    private int configPersistInterval = 20 * 1000;
+
     /**
      * Default topic to send/consume position change message.
      */
     private String positionStoreTopic = "connector-position-topic";
+    /**
+     * Source task position persistence interval.
+     */
+    private int positionPersistInterval = 20 * 1000;
 
     /**
      * Default topic to send/consume offset change message.
@@ -101,54 +136,77 @@ public class ConnectConfig {
     private String offsetStoreTopic = "connector-offset-topic";
 
     /**
-     * Default topic to send/consume offset change message.
+     * Sink task offset persistence interval.
      */
-    private String connectStatusTopic = "connect-status-topic";
+    private int offsetPersistInterval = 20 * 1000;
 
     /**
-     * Http port for REST API.
+     * Default topic to send/consume state change message.
      */
-    private int httpPort = 8082;
+    private String connectStatusTopic = "connect-status-topic";
 
     /**
-     * Source task position persistence interval.
+     * Connector state persistence interval.
      */
-    private int positionPersistInterval = 20 * 1000;
+    private int statePersistInterval = 20 * 1000;
+
 
     /**
-     * Sink task offset persistence interval.
+     * RocketMq store topic producer group
+     * config example with default:
+     * rmqProducerGroup = connector-producer-group;
      */
-    private int offsetPersistInterval = 20 * 1000;
-
+    private String rmqProducerGroup = "connector-producer-group";
     /**
-     * Connector configuration persistence interval.
+     * RocketMq store topic consumer group
+     * config example with default:
+     * rmqConsumerGroup = connector-consumer-group;
      */
-    private int configPersistInterval = 20 * 1000;
-
-    private String pluginPaths;
+    private String rmqConsumerGroup = "connector-consumer-group";
 
-    private String connectClusterId = "DefaultConnectCluster";
+    /**
+     * RocketMq admin group
+     * config example with default:
+     * adminExtGroup = connector-admin-group;
+     */
+    private String adminExtGroup = "connector-admin-group";
 
-    private String allocTaskStrategy = "org.apache.rocketmq.connect.runtime.service.strategy.DefaultAllocateConnAndTaskStrategy";
+    private int rmqMaxRedeliveryTimes;
 
-    private boolean aclEnable = false;
+    private int rmqMessageConsumeTimeout = 3000;
+    private int rmqMaxConsumeThreadNums = 32;
+    private int rmqMinConsumeThreadNums = 1;
+    private int brokerSuspendMaxTimeMillis = 300;
 
-    private String accessKey;
 
-    private String secretKey;
+    /**
+     * Task start timeout mills, default 3 minute
+     * config example by default:
+     * maxStartTimeoutMills = 1000 * 60 * 3
+     */
+    private long maxStartTimeoutMills = 1000 * 60 * 3;
 
-    private boolean autoCreateGroupEnable = false;
+    /**
+     * task stop timeout mills, default 1 minute
+     * config example by default:
+     * maxStopTimeoutMills = 1000 * 60
+     */
+    private long maxStopTimeoutMills = 1000 * 60;
 
-    private String clusterName;
 
-    private String adminExtGroup = "connector-admin-group";
+    /**
+     * offset commit timeout(ms)
+     * config example with default
+     * offsetCommitTimeoutMsConfig = 5000L
+     */
+    private long offsetCommitTimeoutMsConfig = 5000L;
 
     /**
      * offset commit interval ms
+     * config example with default
+     * offsetCommitIntervalMsConfig = 60000L
      */
-    private long offsetCommitIntervalMs = 1000L * 30;
-
-
+    private long offsetCommitIntervalMsConfig = 60000L;
 
 
     public String getWorkerId() {
@@ -367,14 +425,6 @@ public class ConnectConfig {
         this.autoCreateGroupEnable = autoCreateGroupEnable;
     }
 
-    public String getClusterName() {
-        return clusterName;
-    }
-
-    public void setClusterName(String clusterName) {
-        this.clusterName = clusterName;
-    }
-
     public String getAdminExtGroup() {
         return adminExtGroup;
     }
@@ -392,12 +442,12 @@ public class ConnectConfig {
     }
 
 
-    public long getOffsetCommitIntervalMs() {
-        return offsetCommitIntervalMs;
+    public long getOffsetCommitIntervalMsConfig() {
+        return offsetCommitIntervalMsConfig;
     }
 
-    public void setOffsetCommitIntervalMs(long offsetCommitIntervalMs) {
-        this.offsetCommitIntervalMs = offsetCommitIntervalMs;
+    public void setOffsetCommitIntervalMsConfig(long offsetCommitIntervalMsConfig) {
+        this.offsetCommitIntervalMsConfig = offsetCommitIntervalMsConfig;
     }
 
     public long getMaxStartTimeoutMills() {
@@ -432,44 +482,74 @@ public class ConnectConfig {
         this.brokerSuspendMaxTimeMillis = brokerSuspendMaxTimeMillis;
     }
 
+    public boolean isAclEnable() {
+        return aclEnable;
+    }
+
+    public String getKeyConverter() {
+        return keyConverter;
+    }
+
+    public void setKeyConverter(String keyConverter) {
+        this.keyConverter = keyConverter;
+    }
+
+    public String getValueConverter() {
+        return valueConverter;
+    }
+
+    public void setValueConverter(String valueConverter) {
+        this.valueConverter = valueConverter;
+    }
+
+    public int getStatePersistInterval() {
+        return statePersistInterval;
+    }
+
+    public void setStatePersistInterval(int statePersistInterval) {
+        this.statePersistInterval = statePersistInterval;
+    }
+
     @Override
     public String toString() {
-        return "ConnectConfig{" +
-                "workerId='" + workerId + '\'' +
-                ", storePathRootDir='" + storePathRootDir + '\'' +
-                ", connectHome='" + connectHome + '\'' +
+        return "WorkerConfig{" +
+                "connectHome='" + connectHome + '\'' +
+                ", workerId='" + workerId + '\'' +
+                ", connectClusterId='" + connectClusterId + '\'' +
                 ", namesrvAddr='" + namesrvAddr + '\'' +
-                ", rmqProducerGroup='" + rmqProducerGroup + '\'' +
+                ", httpPort=" + httpPort +
+                ", pluginPaths='" + pluginPaths + '\'' +
+                ", aclEnable=" + aclEnable +
+                ", accessKey='" + accessKey + '\'' +
+                ", secretKey='" + secretKey + '\'' +
+                ", autoCreateGroupEnable=" + autoCreateGroupEnable +
+                ", keyConverter='" + keyConverter + '\'' +
+                ", valueConverter='" + valueConverter + '\'' +
+                ", storePathRootDir='" + storePathRootDir + '\'' +
                 ", maxMessageSize=" + maxMessageSize +
                 ", operationTimeout=" + operationTimeout +
+                ", clusterStoreTopic='" + clusterStoreTopic + '\'' +
+                ", allocTaskStrategy='" + allocTaskStrategy + '\'' +
+                ", configStoreTopic='" + configStoreTopic + '\'' +
+                ", configPersistInterval=" + configPersistInterval +
+                ", positionStoreTopic='" + positionStoreTopic + '\'' +
+                ", positionPersistInterval=" + positionPersistInterval +
+                ", offsetStoreTopic='" + offsetStoreTopic + '\'' +
+                ", offsetPersistInterval=" + offsetPersistInterval +
+                ", connectStatusTopic='" + connectStatusTopic + '\'' +
+                ", statePersistInterval=" + statePersistInterval +
+                ", rmqProducerGroup='" + rmqProducerGroup + '\'' +
                 ", rmqConsumerGroup='" + rmqConsumerGroup + '\'' +
+                ", adminExtGroup='" + adminExtGroup + '\'' +
                 ", rmqMaxRedeliveryTimes=" + rmqMaxRedeliveryTimes +
                 ", rmqMessageConsumeTimeout=" + rmqMessageConsumeTimeout +
                 ", rmqMaxConsumeThreadNums=" + rmqMaxConsumeThreadNums +
                 ", rmqMinConsumeThreadNums=" + rmqMinConsumeThreadNums +
+                ", brokerSuspendMaxTimeMillis=" + brokerSuspendMaxTimeMillis +
                 ", maxStartTimeoutMills=" + maxStartTimeoutMills +
                 ", maxStopTimeoutMills=" + maxStopTimeoutMills +
                 ", offsetCommitTimeoutMsConfig=" + offsetCommitTimeoutMsConfig +
-                ", brokerSuspendMaxTimeMillis=" + brokerSuspendMaxTimeMillis +
-                ", clusterStoreTopic='" + clusterStoreTopic + '\'' +
-                ", configStoreTopic='" + configStoreTopic + '\'' +
-                ", positionStoreTopic='" + positionStoreTopic + '\'' +
-                ", offsetStoreTopic='" + offsetStoreTopic + '\'' +
-                ", connectStatusTopic='" + connectStatusTopic + '\'' +
-                ", httpPort=" + httpPort +
-                ", positionPersistInterval=" + positionPersistInterval +
-                ", offsetPersistInterval=" + offsetPersistInterval +
-                ", configPersistInterval=" + configPersistInterval +
-                ", pluginPaths='" + pluginPaths + '\'' +
-                ", connectClusterId='" + connectClusterId + '\'' +
-                ", allocTaskStrategy='" + allocTaskStrategy + '\'' +
-                ", aclEnable=" + aclEnable +
-                ", accessKey='" + accessKey + '\'' +
-                ", secretKey='" + secretKey + '\'' +
-                ", autoCreateGroupEnable=" + autoCreateGroupEnable +
-                ", clusterName='" + clusterName + '\'' +
-                ", adminExtGroup='" + adminExtGroup + '\'' +
-                ", offsetCommitIntervalMs=" + offsetCommitIntervalMs +
+                ", offsetCommitIntervalMsConfig=" + offsetCommitIntervalMsConfig +
                 '}';
     }
-}
+}
\ No newline at end of file
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/SourceTaskOffsetCommitter.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/SourceTaskOffsetCommitter.java
index b069417..2eb7faf 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/SourceTaskOffsetCommitter.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/SourceTaskOffsetCommitter.java
@@ -19,7 +19,7 @@ package org.apache.rocketmq.connect.runtime.connectorwrapper;
 
 import io.openmessaging.connector.api.errors.ConnectException;
 import org.apache.rocketmq.common.utils.ThreadUtils;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.connect.runtime.utils.ConnectorTaskId;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -39,12 +39,12 @@ import java.util.concurrent.TimeUnit;
 class SourceTaskOffsetCommitter {
     private static final Logger log = LoggerFactory.getLogger(SourceTaskOffsetCommitter.class);
 
-    private final ConnectConfig config;
+    private final WorkerConfig config;
     private final ScheduledExecutorService commitExecutorService;
     private final ConcurrentMap<ConnectorTaskId, ScheduledFuture<?>> committers;
 
 
-    SourceTaskOffsetCommitter(ConnectConfig config,
+    SourceTaskOffsetCommitter(WorkerConfig config,
                               ScheduledExecutorService commitExecutorService,
                               ConcurrentMap<ConnectorTaskId, ScheduledFuture<?>> committers) {
         this.config = config;
@@ -52,7 +52,7 @@ class SourceTaskOffsetCommitter {
         this.committers = committers;
     }
 
-    public SourceTaskOffsetCommitter(ConnectConfig config) {
+    public SourceTaskOffsetCommitter(WorkerConfig config) {
         this(config, Executors.newSingleThreadScheduledExecutor(ThreadUtils.newGenericThreadFactory(
                 SourceTaskOffsetCommitter.class.getSimpleName(), false)),
                 new ConcurrentHashMap<>());
@@ -70,7 +70,7 @@ class SourceTaskOffsetCommitter {
     }
 
     public void schedule(final ConnectorTaskId id, final WorkerSourceTask workerTask) {
-        long commitIntervalMs = config.getOffsetCommitIntervalMs();
+        long commitIntervalMs = config.getOffsetCommitIntervalMsConfig();
         ScheduledFuture<?> commitFuture = commitExecutorService.scheduleWithFixedDelay(() -> {
             commit(workerTask);
         }, commitIntervalMs, commitIntervalMs, TimeUnit.MILLISECONDS);
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/TransformChain.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/TransformChain.java
index c6e46e2..b487d02 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/TransformChain.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/TransformChain.java
@@ -27,7 +27,7 @@ import io.openmessaging.internal.DefaultKeyValue;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.rocketmq.connect.runtime.common.LoggerName;
-import org.apache.rocketmq.connect.runtime.config.RuntimeConfigDefine;
+import org.apache.rocketmq.connect.runtime.config.ConnectorConfig;
 import org.apache.rocketmq.connect.runtime.controller.isolation.Plugin;
 import org.apache.rocketmq.connect.runtime.errors.ErrorReporter;
 import org.apache.rocketmq.connect.runtime.errors.RetryWithToleranceOperator;
@@ -56,7 +56,7 @@ public class TransformChain<R extends ConnectRecord> implements AutoCloseable {
 
     private static final String COMMA = ",";
 
-    private static final String PREFIX = RuntimeConfigDefine.TRANSFORMS + "-";
+    private static final String PREFIX = ConnectorConfig.TRANSFORMS + ".";
 
     private RetryWithToleranceOperator retryWithToleranceOperator;
 
@@ -75,7 +75,7 @@ public class TransformChain<R extends ConnectRecord> implements AutoCloseable {
     }
 
     private void init() {
-        String transformsStr = config.getString(RuntimeConfigDefine.TRANSFORMS);
+        String transformsStr = config.getString(ConnectorConfig.TRANSFORMS);
         if (StringUtils.isBlank(transformsStr)) {
             log.warn("no transforms config, {}", JSON.toJSONString(config));
             return;
@@ -86,7 +86,7 @@ public class TransformChain<R extends ConnectRecord> implements AutoCloseable {
             return;
         }
         transformList.stream().forEach(transformStr -> {
-            String transformClassKey = PREFIX + transformStr + "-class";
+            String transformClassKey = PREFIX + transformStr + ".class";
             String transformClass = config.getString(transformClassKey);
             try {
                 Transform transform = newTransform(transformClass);
@@ -94,7 +94,7 @@ public class TransformChain<R extends ConnectRecord> implements AutoCloseable {
                 Set<String> configKeys = config.keySet();
                 for (String key : configKeys) {
                     if (key.startsWith(PREFIX + transformStr) && !key.equals(transformClassKey)) {
-                        String originKey = key.replace(PREFIX + transformStr + "-", "");
+                        String originKey = key.replace(PREFIX + transformStr + ".", "");
                         transformConfig.put(originKey, config.getString(key));
                     }
                 }
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/Worker.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/Worker.java
index 07b5351..bcd889b 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/Worker.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/Worker.java
@@ -32,8 +32,8 @@ import org.apache.rocketmq.client.consumer.DefaultLitePullConsumer;
 import org.apache.rocketmq.client.producer.DefaultMQProducer;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
 import org.apache.rocketmq.connect.runtime.common.LoggerName;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
-import org.apache.rocketmq.connect.runtime.config.RuntimeConfigDefine;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
+import org.apache.rocketmq.connect.runtime.config.ConnectorConfig;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.status.WrapperStatusListener;
 import org.apache.rocketmq.connect.runtime.controller.AbstractConnectController;
 import org.apache.rocketmq.connect.runtime.controller.isolation.Plugin;
@@ -112,7 +112,7 @@ public class Worker {
     private final PositionManagementService positionManagementService;
 
     private Optional<SourceTaskOffsetCommitter> sourceTaskOffsetCommitter;
-    private final ConnectConfig workerConfig;
+    private final WorkerConfig workerConfig;
     private final Plugin plugin;
 
     /**
@@ -129,7 +129,7 @@ public class Worker {
 
     private final ConfigManagementService configManagementService;
 
-    public Worker(ConnectConfig workerConfig,
+    public Worker(WorkerConfig workerConfig,
                   PositionManagementService positionManagementService,
                   ConfigManagementService configManagementService,
                   Plugin plugin,
@@ -359,7 +359,7 @@ public class Worker {
             ClassLoader savedLoader = plugin.currentThreadLoader();
             try {
                 ConnectKeyValue keyValue = newConnectors.get(connectorName);
-                String connectorClass = keyValue.getString(RuntimeConfigDefine.CONNECTOR_CLASS);
+                String connectorClass = keyValue.getString(ConnectorConfig.CONNECTOR_CLASS);
                 ClassLoader connectorLoader = plugin.delegatingLoader().pluginClassLoader(connectorClass);
                 savedLoader = Plugin.compareAndSwapLoaders(connectorLoader);
 
@@ -782,9 +782,9 @@ public class Worker {
     private void startTask(Map<String, List<ConnectKeyValue>> newTasks) throws Exception {
         for (String connectorName : newTasks.keySet()) {
             for (ConnectKeyValue keyValue : newTasks.get(connectorName)) {
-                int taskId = keyValue.getInt(RuntimeConfigDefine.TASK_ID);
+                int taskId = keyValue.getInt(ConnectorConfig.TASK_ID);
                 ConnectorTaskId id = new ConnectorTaskId(connectorName, taskId);
-                String taskType = keyValue.getString(RuntimeConfigDefine.TASK_TYPE);
+                String taskType = keyValue.getString(ConnectorConfig.TASK_TYPE);
                 if (TaskType.DIRECT.name().equalsIgnoreCase(taskType)) {
                     createDirectTask(id, keyValue);
                     continue;
@@ -792,27 +792,27 @@ public class Worker {
 
                 ClassLoader savedLoader = plugin.currentThreadLoader();
                 try {
-                    String connType = keyValue.getString(RuntimeConfigDefine.CONNECTOR_CLASS);
+                    String connType = keyValue.getString(ConnectorConfig.CONNECTOR_CLASS);
                     ClassLoader connectorLoader = plugin.delegatingLoader().connectorLoader(connType);
                     savedLoader = Plugin.compareAndSwapLoaders(connectorLoader);
                     // new task
-                    final Class<? extends Task> taskClass = plugin.currentThreadLoader().loadClass(keyValue.getString(RuntimeConfigDefine.TASK_CLASS)).asSubclass(Task.class);
+                    final Class<? extends Task> taskClass = plugin.currentThreadLoader().loadClass(keyValue.getString(ConnectorConfig.TASK_CLASS)).asSubclass(Task.class);
                     final Task task = plugin.newTask(taskClass);
 
                     /**
                      * create key/value converter
                      */
-                    RecordConverter valueConverter = plugin.newConverter(keyValue, RuntimeConfigDefine.SOURCE_RECORD_CONVERTER, Plugin.ClassLoaderUsage.CURRENT_CLASSLOADER);
-                    RecordConverter keyConverter = plugin.newConverter(keyValue, RuntimeConfigDefine.SOURCE_RECORD_KEY_CONVERTER, Plugin.ClassLoaderUsage.CURRENT_CLASSLOADER);
+                    RecordConverter valueConverter = plugin.newConverter(keyValue, ConnectorConfig.VALUE_CONVERTER, workerConfig.getValueConverter(), Plugin.ClassLoaderUsage.CURRENT_CLASSLOADER);
+                    RecordConverter keyConverter = plugin.newConverter(keyValue, ConnectorConfig.KEY_CONVERTER, workerConfig.getKeyConverter(), Plugin.ClassLoaderUsage.CURRENT_CLASSLOADER);
 
                     if (keyConverter == null) {
-                        keyConverter = plugin.newConverter(keyValue, RuntimeConfigDefine.SOURCE_RECORD_KEY_CONVERTER, Plugin.ClassLoaderUsage.PLUGINS);
+                        keyConverter = plugin.newConverter(keyValue, ConnectorConfig.KEY_CONVERTER, workerConfig.getValueConverter(), Plugin.ClassLoaderUsage.PLUGINS);
                         log.info("Set up the key converter {} for task {} using the worker config", keyConverter.getClass(), id);
                     } else {
                         log.info("Set up the key converter {} for task {} using the connector config", keyConverter.getClass(), id);
                     }
                     if (valueConverter == null) {
-                        valueConverter = plugin.newConverter(keyValue, RuntimeConfigDefine.SOURCE_RECORD_CONVERTER, Plugin.ClassLoaderUsage.PLUGINS);
+                        valueConverter = plugin.newConverter(keyValue, ConnectorConfig.VALUE_CONVERTER, workerConfig.getKeyConverter(), Plugin.ClassLoaderUsage.PLUGINS);
                         log.info("Set up the value converter {} for task {} using the worker config", valueConverter.getClass(), id);
                     } else {
                         log.info("Set up the value converter {} for task {} using the connector config", valueConverter.getClass(), id);
@@ -884,10 +884,10 @@ public class Worker {
     }
 
     private void createDirectTask(ConnectorTaskId id, ConnectKeyValue keyValue) throws Exception {
-        String sourceTaskClass = keyValue.getString(RuntimeConfigDefine.SOURCE_TASK_CLASS);
+        String sourceTaskClass = keyValue.getString(ConnectorConfig.SOURCE_TASK_CLASS);
         Task sourceTask = getTask(sourceTaskClass);
 
-        String sinkTaskClass = keyValue.getString(RuntimeConfigDefine.SINK_TASK_CLASS);
+        String sinkTaskClass = keyValue.getString(ConnectorConfig.SINK_TASK_CLASS);
         Task sinkTask = getTask(sinkTaskClass);
 
         TransformChain<ConnectRecord> transformChain = new TransformChain<>(keyValue, plugin);
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerConnector.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerConnector.java
index 82bae4e..0ed4871 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerConnector.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerConnector.java
@@ -38,7 +38,7 @@ import java.util.concurrent.atomic.AtomicReference;
 /**
  * A wrapper of {@link Connector} for runtime.
  */
-public class WorkerConnector implements Runnable  {
+public class WorkerConnector implements Runnable {
     private static final Logger log = LoggerFactory.getLogger(WorkerConnector.class);
     private static final String THREAD_NAME_PREFIX = "connector-thread-";
 
@@ -129,7 +129,7 @@ public class WorkerConnector implements Runnable  {
 
     @Override
     public void run() {
-        try  {
+        try {
             ClassLoader savedLoader = Plugin.compareAndSwapLoaders(classloader);
             String savedName = Thread.currentThread().getName();
             try {
@@ -162,7 +162,8 @@ public class WorkerConnector implements Runnable  {
                 }
                 try {
                     wait();
-                } catch (InterruptedException e) {}
+                } catch (InterruptedException e) {
+                }
             }
         }
         doShutdown();
@@ -346,6 +347,7 @@ public class WorkerConnector implements Runnable  {
 
     /**
      * connector name
+     *
      * @return
      */
     public String getConnectorName() {
@@ -354,6 +356,7 @@ public class WorkerConnector implements Runnable  {
 
     /**
      * connector config
+     *
      * @return
      */
     public ConnectKeyValue getKeyValue() {
@@ -376,7 +379,7 @@ public class WorkerConnector implements Runnable  {
     public String toString() {
         StringBuilder sb = new StringBuilder();
         sb.append("connectorName:" + connectorName)
-            .append("\nConfigs:" + JSON.toJSONString(keyValue));
+                .append("\nConfigs:" + JSON.toJSONString(keyValue));
         return sb.toString();
     }
 }
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerDirectTask.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerDirectTask.java
index f4e24b5..efbeaf4 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerDirectTask.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerDirectTask.java
@@ -29,7 +29,7 @@ import io.openmessaging.connector.api.data.RecordPartition;
 import io.openmessaging.connector.api.storage.OffsetStorageReader;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
 import org.apache.rocketmq.connect.runtime.common.LoggerName;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.status.WrapperStatusListener;
 import org.apache.rocketmq.connect.runtime.errors.RetryWithToleranceOperator;
 import org.apache.rocketmq.connect.runtime.service.PositionManagementService;
@@ -65,7 +65,7 @@ public class WorkerDirectTask extends WorkerSourceTask {
     private SinkTask sinkTask;
     private final OffsetStorageReader positionStorageReader;
 
-    public WorkerDirectTask(ConnectConfig workerConfig,
+    public WorkerDirectTask(WorkerConfig workerConfig,
                             ConnectorTaskId id,
                             SourceTask sourceTask,
                             ClassLoader classLoader,
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerSinkTask.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerSinkTask.java
index 809e517..14dc9cb 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerSinkTask.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerSinkTask.java
@@ -39,8 +39,8 @@ import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.message.MessageQueue;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
 import org.apache.rocketmq.connect.runtime.common.LoggerName;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
-import org.apache.rocketmq.connect.runtime.config.RuntimeConfigDefine;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
+import org.apache.rocketmq.connect.runtime.config.ConnectorConfig;
 import org.apache.rocketmq.connect.runtime.config.SinkConnectorConfig;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.status.WrapperStatusListener;
 import org.apache.rocketmq.connect.runtime.errors.ErrorReporter;
@@ -148,7 +148,7 @@ public class WorkerSinkTask extends WorkerTask {
         }
     };
 
-    public WorkerSinkTask(ConnectConfig workerConfig,
+    public WorkerSinkTask(WorkerConfig workerConfig,
                           ConnectorTaskId id,
                           SinkTask sinkTask,
                           ClassLoader classLoader,
@@ -181,7 +181,7 @@ public class WorkerSinkTask extends WorkerTask {
         this.messageBatch = new ArrayList<>();
 
         // commit
-        this.nextCommit = System.currentTimeMillis() + workerConfig.getOffsetCommitIntervalMs();
+        this.nextCommit = System.currentTimeMillis() + workerConfig.getOffsetCommitIntervalMsConfig();
         this.committing = false;
         this.commitSeqno = 0;
         this.commitStarted = -1;
@@ -191,7 +191,7 @@ public class WorkerSinkTask extends WorkerTask {
 
 
     protected void iteration() {
-        final long offsetCommitIntervalMs = workerConfig.getOffsetCommitIntervalMs();
+        final long offsetCommitIntervalMs = workerConfig.getOffsetCommitIntervalMsConfig();
         long now = System.currentTimeMillis();
         // check committing
         if (!committing && now >= nextCommit) {
@@ -448,7 +448,6 @@ public class WorkerSinkTask extends WorkerTask {
         return msgs;
     }
 
-
     @Override
     public void close() {
         sinkTask.stop();
@@ -507,8 +506,8 @@ public class WorkerSinkTask extends WorkerTask {
     private ConnectRecord convertMessages(MessageExt message) {
         Map<String, String> properties = message.getProperties();
         // timestamp
-        String connectTimestamp = properties.get(RuntimeConfigDefine.CONNECT_TIMESTAMP);
-        Long timestamp = StringUtils.isNotEmpty(connectTimestamp) ? Long.valueOf(connectTimestamp) : null;
+        String connectTimestamp = properties.get(ConnectorConfig.CONNECT_TIMESTAMP);
+        Long timestamp = StringUtils.isNotEmpty(connectTimestamp) ? Long.valueOf(connectTimestamp) : message.getBornTimestamp();
 
         // partition and offset
         RecordPartition recordPartition = ConnectUtil.convertToRecordPartition(message.getTopic(), message.getBrokerName(), message.getQueueId());
@@ -566,7 +565,7 @@ public class WorkerSinkTask extends WorkerTask {
      */
     @Override
     protected void initializeAndStart() {
-        Set<String> topics = SinkConnectorConfig.parseTopicList(taskConfig);
+        Set<String> topics = new SinkConnectorConfig(taskConfig).parseTopicList();
         if (org.apache.commons.collections4.CollectionUtils.isEmpty(topics)) {
             throw new ConnectException("Sink connector topics config can be null, please check sink connector config info");
         }
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerSourceTask.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerSourceTask.java
index d480c02..28f2bdb 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerSourceTask.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerSourceTask.java
@@ -41,8 +41,9 @@ import org.apache.rocketmq.common.message.MessageAccessor;
 import org.apache.rocketmq.common.message.MessageConst;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
 import org.apache.rocketmq.connect.runtime.common.LoggerName;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
-import org.apache.rocketmq.connect.runtime.config.RuntimeConfigDefine;
+import org.apache.rocketmq.connect.runtime.config.SourceConnectorConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
+import org.apache.rocketmq.connect.runtime.config.ConnectorConfig;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.status.WrapperStatusListener;
 import org.apache.rocketmq.connect.runtime.errors.ErrorReporter;
 import org.apache.rocketmq.connect.runtime.errors.RetryWithToleranceOperator;
@@ -132,7 +133,7 @@ public class WorkerSourceTask extends WorkerTask {
         WHITE_KEY_SET.add(MessageConst.PROPERTY_TAGS);
     }
 
-    public WorkerSourceTask(ConnectConfig workerConfig,
+    public WorkerSourceTask(WorkerConfig workerConfig,
                             ConnectorTaskId id,
                             SourceTask sourceTask,
                             ClassLoader classLoader,
@@ -371,8 +372,8 @@ public class WorkerSourceTask extends WorkerTask {
 
         byte[] value = retryWithToleranceOperator.execute(() -> valueConverter.fromConnectData(topic, record.getSchema(), record.getData()),
                 ErrorReporter.Stage.CONVERTER, valueConverter.getClass());
-        if (value.length > RuntimeConfigDefine.MAX_MESSAGE_SIZE) {
-            log.error("Send record, message size is greater than {} bytes, record: {}", RuntimeConfigDefine.MAX_MESSAGE_SIZE, JSON.toJSONString(record));
+        if (value.length > ConnectorConfig.MAX_MESSAGE_SIZE) {
+            log.error("Send record, message size is greater than {} bytes, record: {}", ConnectorConfig.MAX_MESSAGE_SIZE, JSON.toJSONString(record));
         }
         if (key != null) {
             sourceMessage.setKeys(Base64Util.base64Encode(key));
@@ -393,7 +394,7 @@ public class WorkerSourceTask extends WorkerTask {
      * @return
      */
     private String maybeCreateAndGetTopic(ConnectRecord record) {
-        String topic = taskConfig.getString(RuntimeConfigDefine.CONNECT_TOPICNAME);
+        String topic = taskConfig.getString(SourceConnectorConfig.CONNECT_TOPICNAME);
         if (StringUtils.isBlank(topic)) {
             RecordPosition recordPosition = record.getPosition();
             if (null == recordPosition) {
@@ -433,6 +434,9 @@ public class WorkerSourceTask extends WorkerTask {
             log.info("extension keySet null.");
             return;
         }
+        if (sourceDataEntry.getTimestamp() != null) {
+            MessageAccessor.putProperty(sourceMessage, ConnectorConfig.CONNECT_TIMESTAMP, sourceDataEntry.getTimestamp().toString());
+        }
         for (String key : keySet) {
             if (WHITE_KEY_SET.contains(key)) {
                 MessageAccessor.putProperty(sourceMessage, key, extensionKeyValues.getString(key));
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerTask.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerTask.java
index d60e23a..9dace23 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerTask.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerTask.java
@@ -18,7 +18,7 @@ package org.apache.rocketmq.connect.runtime.connectorwrapper;
 
 import io.openmessaging.connector.api.data.ConnectRecord;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.status.TaskStatus;
 import org.apache.rocketmq.connect.runtime.controller.isolation.Plugin;
 import org.apache.rocketmq.connect.runtime.errors.RetryWithToleranceOperator;
@@ -39,7 +39,7 @@ public abstract class WorkerTask implements Runnable {
     private static final Logger log = LoggerFactory.getLogger(WorkerTask.class);
     private static final String THREAD_NAME_PREFIX = "task-thread-";
 
-    protected final ConnectConfig workerConfig;
+    protected final WorkerConfig workerConfig;
 
     protected final ConnectorTaskId id;
     protected final ClassLoader loader;
@@ -61,7 +61,7 @@ public abstract class WorkerTask implements Runnable {
 
     private final CountDownLatch shutdownLatch = new CountDownLatch(1);
 
-    public WorkerTask(ConnectConfig workerConfig, ConnectorTaskId id, ClassLoader loader, ConnectKeyValue taskConfig, RetryWithToleranceOperator retryWithToleranceOperator, TransformChain<ConnectRecord> transformChain, AtomicReference<WorkerState> workerState, TaskStatus.Listener taskListener) {
+    public WorkerTask(WorkerConfig workerConfig, ConnectorTaskId id, ClassLoader loader, ConnectKeyValue taskConfig, RetryWithToleranceOperator retryWithToleranceOperator, TransformChain<ConnectRecord> transformChain, AtomicReference<WorkerState> workerState, TaskStatus.Listener taskListener) {
         this.workerConfig = workerConfig;
         this.id = id;
         this.loader = loader;
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/controller/AbstractConnectController.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/controller/AbstractConnectController.java
index 69c8342..7b1f982 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/controller/AbstractConnectController.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/controller/AbstractConnectController.java
@@ -20,8 +20,8 @@ package org.apache.rocketmq.connect.runtime.controller;
 import io.openmessaging.connector.api.errors.ConnectException;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
 import org.apache.rocketmq.connect.runtime.common.LoggerName;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
-import org.apache.rocketmq.connect.runtime.config.RuntimeConfigDefine;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
+import org.apache.rocketmq.connect.runtime.config.ConnectorConfig;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.Worker;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.status.ConnectorStatus;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.status.TaskStatus;
@@ -59,7 +59,7 @@ public abstract class AbstractConnectController implements ConnectController {
     /**
      * Configuration of current runtime.
      */
-    protected final ConnectConfig connectConfig;
+    protected final WorkerConfig connectConfig;
 
     /**
      * All the configurations of current running connectors and tasks in cluster.
@@ -107,7 +107,7 @@ public abstract class AbstractConnectController implements ConnectController {
      */
     public AbstractConnectController(
             Plugin plugin,
-            ConnectConfig connectConfig,
+            WorkerConfig connectConfig,
             ClusterManagementService clusterManagementService,
             ConfigManagementService configManagementService,
             PositionManagementService positionManagementService,
@@ -164,7 +164,7 @@ public abstract class AbstractConnectController implements ConnectController {
 
     }
 
-    public ConnectConfig getConnectConfig() {
+    public WorkerConfig getConnectConfig() {
         return connectConfig;
     }
 
@@ -286,7 +286,7 @@ public abstract class AbstractConnectController implements ConnectController {
         Collections.sort(taskStates);
         Map<String, String> conf = rawConfig(connName);
         return new ConnectorStateInfo(connName, connectorState, taskStates,
-                conf == null ? ConnectorType.UNKNOWN : connectorTypeForClass(conf.get(RuntimeConfigDefine.CONNECTOR_CLASS)));
+                conf == null ? ConnectorType.UNKNOWN : connectorTypeForClass(conf.get(ConnectorConfig.CONNECTOR_CLASS)));
     }
 
 
@@ -309,7 +309,7 @@ public abstract class AbstractConnectController implements ConnectController {
                 connector,
                 config,
                 configState.tasks(connector),
-                connectorTypeForClass(config.get(RuntimeConfigDefine.CONNECTOR_CLASS))
+                connectorTypeForClass(config.get(ConnectorConfig.CONNECTOR_CLASS))
         );
     }
 
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/controller/distributed/DistributedConfig.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/controller/distributed/DistributedConfig.java
index 4784b21..9cdedba 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/controller/distributed/DistributedConfig.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/controller/distributed/DistributedConfig.java
@@ -17,10 +17,10 @@
 
 package org.apache.rocketmq.connect.runtime.controller.distributed;
 
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 
 /**
  * distributed worker config
  */
-public class DistributedConfig extends ConnectConfig {
+public class DistributedConfig extends WorkerConfig {
 }
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/controller/distributed/DistributedConnectController.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/controller/distributed/DistributedConnectController.java
index 1872161..a93a5c2 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/controller/distributed/DistributedConnectController.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/controller/distributed/DistributedConnectController.java
@@ -93,7 +93,7 @@ public class DistributedConnectController extends AbstractConnectController {
         }, 1000, this.connectConfig.getPositionPersistInterval(), TimeUnit.MILLISECONDS);
 
 
-        // Persist position information of source tasks.
+        // Persist state information of connector
         scheduledExecutorService.scheduleAtFixedRate(() -> {
 
             try {
@@ -102,7 +102,7 @@ public class DistributedConnectController extends AbstractConnectController {
                 log.error("schedule persist position error.", e);
             }
 
-        }, 1000, this.connectConfig.getPositionPersistInterval(), TimeUnit.MILLISECONDS);
+        }, 1000, this.connectConfig.getStatePersistInterval(), TimeUnit.MILLISECONDS);
 
     }
 
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/controller/isolation/Plugin.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/controller/isolation/Plugin.java
index cc698a8..a4511d3 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/controller/isolation/Plugin.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/controller/isolation/Plugin.java
@@ -159,9 +159,9 @@ public class Plugin {
         return newPlugin(taskClass);
     }
 
-    public RecordConverter newConverter(ConnectKeyValue config, String classPropertyName, ClassLoaderUsage classLoaderUsage) {
+    public RecordConverter newConverter(ConnectKeyValue config, String classPropertyName, String defaultConverter, ClassLoaderUsage classLoaderUsage) {
         if (!config.containsKey(classPropertyName)) {
-            return null;
+            config.put(classPropertyName, defaultConverter);
         }
         Class<? extends RecordConverter> klass = null;
         switch (classLoaderUsage) {
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/controller/standalone/StandaloneConfig.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/controller/standalone/StandaloneConfig.java
index 967c72e..5f353c6 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/controller/standalone/StandaloneConfig.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/controller/standalone/StandaloneConfig.java
@@ -16,11 +16,11 @@
  */
 package org.apache.rocketmq.connect.runtime.controller.standalone;
 
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 
 /**
  *  worker standalone config
  *
  */
-public class StandaloneConfig extends ConnectConfig  {
+public class StandaloneConfig extends WorkerConfig {
 }
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/errors/DeadLetterQueueConfig.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/errors/DeadLetterQueueConfig.java
index 0a27494..e157e0c 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/errors/DeadLetterQueueConfig.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/errors/DeadLetterQueueConfig.java
@@ -19,42 +19,28 @@ package org.apache.rocketmq.connect.runtime.errors;
 
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
 
+import static org.apache.rocketmq.connect.runtime.config.ConnectorConfig.ERRORS_LOG_ENABLE_CONFIG;
+import static org.apache.rocketmq.connect.runtime.config.ConnectorConfig.ERRORS_LOG_ENABLE_DEFAULT;
+import static org.apache.rocketmq.connect.runtime.config.ConnectorConfig.ERRORS_LOG_INCLUDE_MESSAGES_CONFIG;
+import static org.apache.rocketmq.connect.runtime.config.ConnectorConfig.ERRORS_LOG_INCLUDE_MESSAGES_DEFAULT;
+import static org.apache.rocketmq.connect.runtime.config.ConnectorConfig.ERRORS_RETRY_MAX_DELAY_CONFIG;
+import static org.apache.rocketmq.connect.runtime.config.ConnectorConfig.ERRORS_RETRY_MAX_DELAY_DEFAULT;
+import static org.apache.rocketmq.connect.runtime.config.ConnectorConfig.ERRORS_RETRY_TIMEOUT_CONFIG;
+import static org.apache.rocketmq.connect.runtime.config.ConnectorConfig.ERRORS_RETRY_TIMEOUT_DEFAULT;
+import static org.apache.rocketmq.connect.runtime.config.ConnectorConfig.ERRORS_TOLERANCE_CONFIG;
+import static org.apache.rocketmq.connect.runtime.config.ConnectorConfig.ERRORS_TOLERANCE_DEFAULT;
+import static org.apache.rocketmq.connect.runtime.config.SinkConnectorConfig.DLQ_CONTEXT_PROPERTIES_ENABLE_CONFIG;
+import static org.apache.rocketmq.connect.runtime.config.SinkConnectorConfig.DLQ_CONTEXT_PROPERTIES_ENABLE_DEFAULT;
+import static org.apache.rocketmq.connect.runtime.config.SinkConnectorConfig.DLQ_TOPIC_NAME_CONFIG;
+import static org.apache.rocketmq.connect.runtime.config.SinkConnectorConfig.DLQ_TOPIC_READ_QUEUE_NUMS;
+import static org.apache.rocketmq.connect.runtime.config.SinkConnectorConfig.DLQ_TOPIC_READ_QUEUE_NUMS_DEFAULT;
+import static org.apache.rocketmq.connect.runtime.config.SinkConnectorConfig.DLQ_TOPIC_WRITE_QUEUE_NUMS;
+import static org.apache.rocketmq.connect.runtime.config.SinkConnectorConfig.DLQ_TOPIC_WRITE_QUEUE_NUMS_DEFAULT;
+
 /**
  * dead letter queue config
  */
 public class DeadLetterQueueConfig {
-    /**
-     * dead letter queue config
-     */
-    public static final String DLQ_PREFIX = "errors.deadletterqueue.";
-    public static final String DLQ_TOPIC_NAME_CONFIG = DLQ_PREFIX + "topic.name";
-
-
-    public static final String DLQ_TOPIC_READ_QUEUE_NUMS = DLQ_PREFIX + "read.queue.nums";
-    public static final short DLQ_TOPIC_READ_QUEUE_NUMS_DEFAULT = 16;
-
-    public static final String DLQ_TOPIC_WRITE_QUEUE_NUMS = DLQ_PREFIX + "write.queue.nums";
-    public static final short DLQ_TOPIC_WRITE_QUEUE_NUMS_DEFAULT = 16;
-
-    public static final String DLQ_CONTEXT_HEADERS_ENABLE_CONFIG = DLQ_PREFIX + "context.headers.enable";
-    public static final boolean DLQ_CONTEXT_HEADERS_ENABLE_DEFAULT = false;
-
-    public static final String ERRORS_LOG_INCLUDE_MESSAGES_CONFIG = "errors.log.include.messages";
-    public static final boolean ERRORS_LOG_INCLUDE_MESSAGES_DEFAULT = false;
-
-    public static final String ERRORS_LOG_ENABLE_CONFIG = "errors.log.enable";
-    public static final boolean ERRORS_LOG_ENABLE_DEFAULT = false;
-
-
-    public static final String ERRORS_RETRY_TIMEOUT_CONFIG = "errors.retry.timeout";
-    public static final int ERRORS_RETRY_TIMEOUT_DEFAULT = 0;
-
-    public static final String ERRORS_RETRY_MAX_DELAY_CONFIG = "errors.retry.delay.max.ms";
-    public static final String ERRORS_RETRY_MAX_DELAY_DISPLAY = "Maximum Delay Between Retries for Errors";
-    public static final int ERRORS_RETRY_MAX_DELAY_DEFAULT = 60000;
-
-    public static final String ERRORS_TOLERANCE_CONFIG = "errors.tolerance";
-    public static final ToleranceType ERRORS_TOLERANCE_DEFAULT = ToleranceType.NONE;
 
     private ConnectKeyValue config;
 
@@ -84,8 +70,8 @@ public class DeadLetterQueueConfig {
      * @return
      */
     public Boolean isDlqContextHeadersEnabled() {
-        return config.getProperties().containsKey(DLQ_CONTEXT_HEADERS_ENABLE_CONFIG) ?
-                Boolean.getBoolean(config.getProperties().get(DLQ_CONTEXT_HEADERS_ENABLE_CONFIG)) : DLQ_CONTEXT_HEADERS_ENABLE_DEFAULT;
+        return config.getProperties().containsKey(DLQ_CONTEXT_PROPERTIES_ENABLE_CONFIG) ?
+                Boolean.valueOf(config.getProperties().get(DLQ_CONTEXT_PROPERTIES_ENABLE_CONFIG)) : DLQ_CONTEXT_PROPERTIES_ENABLE_DEFAULT;
     }
 
 
@@ -115,7 +101,7 @@ public class DeadLetterQueueConfig {
      */
     public boolean includeRecordDetailsInErrorLog() {
         return config.getProperties().containsKey(ERRORS_LOG_INCLUDE_MESSAGES_CONFIG) ?
-                Boolean.getBoolean(config.getProperties().get(ERRORS_LOG_INCLUDE_MESSAGES_CONFIG)) : ERRORS_LOG_INCLUDE_MESSAGES_DEFAULT;
+                Boolean.valueOf(config.getProperties().get(ERRORS_LOG_INCLUDE_MESSAGES_CONFIG)) : ERRORS_LOG_INCLUDE_MESSAGES_DEFAULT;
     }
 
 
@@ -128,16 +114,16 @@ public class DeadLetterQueueConfig {
 
     private boolean enableErrorLog() {
         return config.getProperties().containsKey(ERRORS_LOG_ENABLE_CONFIG) ?
-                Boolean.getBoolean(config.getProperties().get(ERRORS_LOG_ENABLE_CONFIG)) : ERRORS_LOG_ENABLE_DEFAULT;
+                Boolean.valueOf(config.getProperties().get(ERRORS_LOG_ENABLE_CONFIG)) : ERRORS_LOG_ENABLE_DEFAULT;
 
     }
 
     public long errorRetryTimeout() {
-        return config.getLong(ERRORS_RETRY_TIMEOUT_CONFIG);
+        return config.getLong(ERRORS_RETRY_TIMEOUT_CONFIG, ERRORS_RETRY_TIMEOUT_DEFAULT);
     }
 
     public long errorMaxDelayInMillis() {
-        return config.getLong(ERRORS_RETRY_MAX_DELAY_CONFIG);
+        return config.getLong(ERRORS_RETRY_MAX_DELAY_CONFIG, ERRORS_RETRY_MAX_DELAY_DEFAULT);
     }
 
     public ToleranceType errorToleranceType() {
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/errors/DeadLetterQueueReporter.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/errors/DeadLetterQueueReporter.java
index cf8967b..b4f0b91 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/errors/DeadLetterQueueReporter.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/errors/DeadLetterQueueReporter.java
@@ -27,7 +27,7 @@ import org.apache.rocketmq.common.TopicConfig;
 import org.apache.rocketmq.common.message.Message;
 import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.connect.runtime.utils.ConnectUtil;
 import org.apache.rocketmq.remoting.exception.RemotingException;
 import org.slf4j.Logger;
@@ -84,11 +84,6 @@ public class DeadLetterQueueReporter implements ErrorReporter {
     private String connectorName;
 
 
-    public void workerId(String workerId) {
-        this.workerId = workerId;
-    }
-
-
     /**
      * build reporter
      *
@@ -99,7 +94,7 @@ public class DeadLetterQueueReporter implements ErrorReporter {
      */
     public static DeadLetterQueueReporter build(String connectorName,
                                                 ConnectKeyValue sinkConfig,
-                                                ConnectConfig workerConfig) {
+                                                WorkerConfig workerConfig) {
 
         DeadLetterQueueConfig deadLetterQueueConfig = new DeadLetterQueueConfig(sinkConfig);
         String dlqTopic = deadLetterQueueConfig.dlqTopicName();
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/errors/ReporterManagerUtil.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/errors/ReporterManagerUtil.java
index 2da9122..a144911 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/errors/ReporterManagerUtil.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/errors/ReporterManagerUtil.java
@@ -19,7 +19,7 @@ package org.apache.rocketmq.connect.runtime.errors;
 
 import io.openmessaging.connector.api.data.RecordConverter;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -73,7 +73,7 @@ public class ReporterManagerUtil {
      */
     public static List<ErrorReporter> sinkTaskReporters(String connectName,
                                                         ConnectKeyValue connConfig,
-                                                        ConnectConfig workerConfig) {
+                                                        WorkerConfig workerConfig) {
         // ensure reporter order
         ArrayList<ErrorReporter> reporters = new ArrayList<>();
         LogReporter logReporter = new LogReporter(connectName, connConfig);
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/AbstractConfigManagementService.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/AbstractConfigManagementService.java
index 3e6f166..fe23d68 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/AbstractConfigManagementService.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/AbstractConfigManagementService.java
@@ -20,7 +20,10 @@ package org.apache.rocketmq.connect.runtime.service;
 import io.openmessaging.KeyValue;
 import io.openmessaging.connector.api.component.connector.Connector;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
-import org.apache.rocketmq.connect.runtime.config.RuntimeConfigDefine;
+import org.apache.rocketmq.connect.runtime.config.ConnectorConfig;
+import org.apache.rocketmq.connect.runtime.config.SinkConnectorConfig;
+import org.apache.rocketmq.connect.runtime.config.SourceConnectorConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.TargetState;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.Worker;
 import org.apache.rocketmq.connect.runtime.controller.isolation.Plugin;
@@ -42,6 +45,8 @@ import java.util.concurrent.ConcurrentHashMap;
  */
 public abstract class AbstractConfigManagementService implements ConfigManagementService {
 
+    protected WorkerConfig workerConfig;
+
     protected Plugin plugin;
 
     /**
@@ -57,9 +62,9 @@ public abstract class AbstractConfigManagementService implements ConfigManagemen
 
     @Override
     public void recomputeTaskConfigs(String connectorName, Connector connector, Long currentTimestamp, ConnectKeyValue configs) {
-        int maxTask = configs.getInt(RuntimeConfigDefine.MAX_TASK, 1);
+        int maxTask = configs.getInt(ConnectorConfig.MAX_TASK, ConnectorConfig.TASKS_MAX_DEFAULT);
         ConnectKeyValue connectConfig = connectorKeyValueStore.get(connectorName);
-        boolean directEnable = Boolean.parseBoolean(connectConfig.getString(RuntimeConfigDefine.CONNECTOR_DIRECT_ENABLE));
+        boolean directEnable = Boolean.parseBoolean(connectConfig.getString(ConnectorConfig.CONNECTOR_DIRECT_ENABLE, "false"));
         List<KeyValue> taskConfigs = connector.taskConfigs(maxTask);
         List<ConnectKeyValue> converterdConfigs = new ArrayList<>();
         int taskId = 0;
@@ -69,20 +74,19 @@ public abstract class AbstractConfigManagementService implements ConfigManagemen
                 newKeyValue.put(key, keyValue.getString(key));
             }
             if (directEnable) {
-                newKeyValue.put(RuntimeConfigDefine.TASK_TYPE, Worker.TaskType.DIRECT.name());
-                newKeyValue.put(RuntimeConfigDefine.SOURCE_TASK_CLASS, connectConfig.getString(RuntimeConfigDefine.SOURCE_TASK_CLASS));
-                newKeyValue.put(RuntimeConfigDefine.SINK_TASK_CLASS, connectConfig.getString(RuntimeConfigDefine.SINK_TASK_CLASS));
+                newKeyValue.put(ConnectorConfig.TASK_TYPE, Worker.TaskType.DIRECT.name());
+                newKeyValue.put(ConnectorConfig.SOURCE_TASK_CLASS, connectConfig.getString(ConnectorConfig.SOURCE_TASK_CLASS));
+                newKeyValue.put(ConnectorConfig.SINK_TASK_CLASS, connectConfig.getString(ConnectorConfig.SINK_TASK_CLASS));
             }
             // put task id
-            newKeyValue.put(RuntimeConfigDefine.TASK_ID, taskId);
-            newKeyValue.put(RuntimeConfigDefine.TASK_CLASS, connector.taskClass().getName());
-            newKeyValue.put(RuntimeConfigDefine.UPDATE_TIMESTAMP, currentTimestamp);
-
-            newKeyValue.put(RuntimeConfigDefine.CONNECT_TOPICNAME, configs.getString(RuntimeConfigDefine.CONNECT_TOPICNAME));
-            newKeyValue.put(RuntimeConfigDefine.CONNECT_TOPICNAMES, configs.getString(RuntimeConfigDefine.CONNECT_TOPICNAMES));
+            newKeyValue.put(ConnectorConfig.TASK_ID, taskId);
+            newKeyValue.put(ConnectorConfig.TASK_CLASS, connector.taskClass().getName());
+            newKeyValue.put(ConnectorConfig.UPDATE_TIMESTAMP, currentTimestamp);
+            newKeyValue.put(SourceConnectorConfig.CONNECT_TOPICNAME, configs.getString(SourceConnectorConfig.CONNECT_TOPICNAME));
+            newKeyValue.put(SinkConnectorConfig.CONNECT_TOPICNAMES, configs.getString(SinkConnectorConfig.CONNECT_TOPICNAMES));
             Set<String> connectConfigKeySet = configs.keySet();
             for (String connectConfigKey : connectConfigKeySet) {
-                if (connectConfigKey.startsWith(RuntimeConfigDefine.TRANSFORMS)) {
+                if (connectConfigKey.startsWith(ConnectorConfig.TRANSFORMS)) {
                     newKeyValue.put(connectConfigKey, configs.getString(connectConfigKey));
                 }
             }
@@ -97,7 +101,7 @@ public abstract class AbstractConfigManagementService implements ConfigManagemen
 
     @NotNull
     protected Connector loadConnector(ConnectKeyValue configs) {
-        String connectorClass = configs.getString(RuntimeConfigDefine.CONNECTOR_CLASS);
+        String connectorClass = configs.getString(ConnectorConfig.CONNECTOR_CLASS);
         Connector connector = plugin.newConnector(connectorClass);
         connector.validate(configs);
         connector.start(configs);
@@ -115,7 +119,7 @@ public abstract class AbstractConfigManagementService implements ConfigManagemen
         taskKeyValueStore.getKVMap().forEach((connectorName, taskConfigs) -> {
             connectorTaskCounts.put(connectorName, taskConfigs.size());
             taskConfigs.forEach(taskConfig -> {
-                ConnectorTaskId id = new ConnectorTaskId(connectorName, taskConfig.getInt(RuntimeConfigDefine.TASK_ID));
+                ConnectorTaskId id = new ConnectorTaskId(connectorName, taskConfig.getInt(ConnectorConfig.TASK_ID));
                 connectorTaskConfigs.put(id, taskConfig.getProperties());
             });
         });
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/ClusterManagementService.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/ClusterManagementService.java
index 346d5d0..68ec86f 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/ClusterManagementService.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/ClusterManagementService.java
@@ -18,14 +18,14 @@
 package org.apache.rocketmq.connect.runtime.service;
 
 import java.util.List;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 
 /**
  * Interface for cluster management.
  */
 public interface ClusterManagementService {
 
-    void initialize(ConnectConfig connectConfig);
+    void initialize(WorkerConfig connectConfig);
 
     /**
      * Start the cluster manager.
@@ -42,7 +42,7 @@ public interface ClusterManagementService {
      *
      * @param config can be DistributedConfig or StandaloneConfig
      */
-    default void configure(ConnectConfig config) {
+    default void configure(WorkerConfig config) {
 
     }
 
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/ClusterManagementServiceImpl.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/ClusterManagementServiceImpl.java
index 2d97737..2710432 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/ClusterManagementServiceImpl.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/ClusterManagementServiceImpl.java
@@ -28,7 +28,7 @@ import org.apache.rocketmq.common.TopicConfig;
 import org.apache.rocketmq.common.protocol.RequestCode;
 import org.apache.rocketmq.common.protocol.header.NotifyConsumerIdsChangedRequestHeader;
 import org.apache.rocketmq.connect.runtime.common.LoggerName;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.connect.runtime.utils.ConnectUtil;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.netty.NettyRequestProcessor;
@@ -45,7 +45,7 @@ public class ClusterManagementServiceImpl implements ClusterManagementService {
     /**
      * Configs of current worker.
      */
-    private ConnectConfig connectConfig;
+    private WorkerConfig connectConfig;
 
     /**
      * Used for worker discovery
@@ -60,7 +60,7 @@ public class ClusterManagementServiceImpl implements ClusterManagementService {
      *
      * @param connectConfig
      */
-    private void prepare(ConnectConfig connectConfig) {
+    private void prepare(WorkerConfig connectConfig) {
         String consumerGroup = this.defaultMQPullConsumer.getConsumerGroup();
         Set<String> consumerGroupSet = ConnectUtil.fetchAllConsumerGroupList(connectConfig);
         if (!consumerGroupSet.contains(consumerGroup)) {
@@ -76,7 +76,7 @@ public class ClusterManagementServiceImpl implements ClusterManagementService {
 
     }
 
-    @Override public void initialize(ConnectConfig connectConfig) {
+    @Override public void initialize(WorkerConfig connectConfig) {
         this.connectConfig = connectConfig;
         this.workerStatusListeners = new HashSet<>();
         this.defaultMQPullConsumer = ConnectUtil.initDefaultMQPullConsumer(connectConfig);
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/ConfigManagementService.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/ConfigManagementService.java
index fe78452..e123957 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/ConfigManagementService.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/ConfigManagementService.java
@@ -19,7 +19,7 @@ package org.apache.rocketmq.connect.runtime.service;
 
 import io.openmessaging.connector.api.component.connector.Connector;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.connect.runtime.controller.isolation.Plugin;
 import org.apache.rocketmq.connect.runtime.store.ClusterConfigState;
 
@@ -48,7 +48,7 @@ public interface ConfigManagementService {
      *
      * @param config can be DistributedConfig or StandaloneConfig
      */
-    default void configure(ConnectConfig config) {
+    default void configure(WorkerConfig config) {
 
     }
 
@@ -111,7 +111,7 @@ public interface ConfigManagementService {
      */
     void registerListener(ConnectorConfigUpdateListener listener);
 
-    void initialize(ConnectConfig connectConfig, Plugin plugin);
+    void initialize(WorkerConfig connectConfig, Plugin plugin);
 
     ClusterConfigState snapshot();
 
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/ConfigManagementServiceImpl.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/ConfigManagementServiceImpl.java
index b2b4cf0..dcc8981 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/ConfigManagementServiceImpl.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/ConfigManagementServiceImpl.java
@@ -18,13 +18,17 @@
 package org.apache.rocketmq.connect.runtime.service;
 
 import io.openmessaging.connector.api.component.connector.Connector;
+import io.openmessaging.connector.api.component.task.sink.SinkConnector;
+import io.openmessaging.connector.api.component.task.source.SourceConnector;
 import io.openmessaging.connector.api.errors.ConnectException;
 import org.apache.rocketmq.common.TopicConfig;
 import org.apache.rocketmq.connect.runtime.common.ConnAndTaskConfigs;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
 import org.apache.rocketmq.connect.runtime.common.LoggerName;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
-import org.apache.rocketmq.connect.runtime.config.RuntimeConfigDefine;
+import org.apache.rocketmq.connect.runtime.config.SinkConnectorConfig;
+import org.apache.rocketmq.connect.runtime.config.SourceConnectorConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
+import org.apache.rocketmq.connect.runtime.config.ConnectorConfig;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.TargetState;
 import org.apache.rocketmq.connect.runtime.controller.isolation.Plugin;
 import org.apache.rocketmq.connect.runtime.converter.ConnectKeyValueConverter;
@@ -48,6 +52,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import static org.apache.rocketmq.connect.runtime.config.ConnectorConfig.CONNECTOR_CLASS;
+
 public class ConfigManagementServiceImpl extends AbstractConfigManagementService {
     private static final Logger log = LoggerFactory.getLogger(LoggerName.ROCKETMQ_RUNTIME);
 
@@ -88,24 +94,25 @@ public class ConfigManagementServiceImpl extends AbstractConfigManagementService
     private final String configManagePrefix = "ConfigManage";
 
     @Override
-    public void initialize(ConnectConfig connectConfig, Plugin plugin) {
+    public void initialize(WorkerConfig workerConfig, Plugin plugin) {
         this.connectorConfigUpdateListener = new HashSet<>();
-        this.dataSynchronizer = new BrokerBasedLog<>(connectConfig,
-                connectConfig.getConfigStoreTopic(),
-                ConnectUtil.createGroupName(configManagePrefix, connectConfig.getWorkerId()),
+        this.dataSynchronizer = new BrokerBasedLog<>(workerConfig,
+                workerConfig.getConfigStoreTopic(),
+                ConnectUtil.createGroupName(configManagePrefix, workerConfig.getWorkerId()),
                 new ConfigChangeCallback(),
                 new JsonConverter(),
                 new ConnectKeyValueConverter());
         this.connectorKeyValueStore = new FileBaseKeyValueStore<>(
-                FilePathConfigUtil.getConnectorConfigPath(connectConfig.getStorePathRootDir()),
+                FilePathConfigUtil.getConnectorConfigPath(workerConfig.getStorePathRootDir()),
                 new JsonConverter(),
                 new JsonConverter(ConnectKeyValue.class));
         this.taskKeyValueStore = new FileBaseKeyValueStore<>(
-                FilePathConfigUtil.getTaskConfigPath(connectConfig.getStorePathRootDir()),
+                FilePathConfigUtil.getTaskConfigPath(workerConfig.getStorePathRootDir()),
                 new JsonConverter(),
                 new ListConverter(ConnectKeyValue.class));
         this.plugin = plugin;
-        this.prepare(connectConfig);
+        this.prepare(workerConfig);
+        this.workerConfig = workerConfig;
     }
 
 
@@ -114,7 +121,7 @@ public class ConfigManagementServiceImpl extends AbstractConfigManagementService
      *
      * @param connectConfig
      */
-    private void prepare(ConnectConfig connectConfig) {
+    private void prepare(WorkerConfig connectConfig) {
         String configStoreTopic = connectConfig.getConfigStoreTopic();
         if (!ConnectUtil.isTopicExist(connectConfig, configStoreTopic)) {
             log.info("try to create config store topic: {}!", configStoreTopic);
@@ -147,25 +154,32 @@ public class ConfigManagementServiceImpl extends AbstractConfigManagementService
 
     @Override
     public String putConnectorConfig(String connectorName, ConnectKeyValue configs) {
-        ConnectKeyValue exist = connectorKeyValueStore.get(connectorName);
-        // update version
-        if (null != exist) {
-            Long updateTimestamp = exist.getLong(RuntimeConfigDefine.UPDATE_TIMESTAMP);
+        // check request config
+        for (String requireConfig : ConnectorConfig.REQUEST_CONFIG) {
+            if (!configs.containsKey(requireConfig)) {
+                throw new ConnectException("Request config key: " + requireConfig);
+            }
+        }
+        // update timestamp
+        ConnectKeyValue oldConfig = connectorKeyValueStore.get(connectorName);
+        if (null != oldConfig) {
+            Long updateTimestamp = oldConfig.getLong(ConnectorConfig.UPDATE_TIMESTAMP);
             if (null != updateTimestamp) {
-                configs.put(RuntimeConfigDefine.UPDATE_TIMESTAMP, updateTimestamp);
+                configs.put(ConnectorConfig.UPDATE_TIMESTAMP, updateTimestamp);
             }
         }
-
-        if (configs.equals(exist)) {
+        if (configs.equals(oldConfig)) {
             throw new ConnectException("Connector with same config already exist.");
         }
-
-        for (String requireConfig : RuntimeConfigDefine.REQUEST_CONFIG) {
-            if (!configs.containsKey(requireConfig)) {
-                throw new ConnectException("Request config key: " + requireConfig);
-            }
+        // validate config
+        Connector connector = plugin.newConnector(configs.getString(CONNECTOR_CLASS));
+        if (connector instanceof SourceConnector) {
+            new SourceConnectorConfig(configs).validate();
+        } else if (connector instanceof SinkConnector) {
+            new SinkConnectorConfig(configs).validate();
         }
-        configs.put(RuntimeConfigDefine.UPDATE_TIMESTAMP, System.currentTimeMillis());
+        connector.validate(configs);
+        configs.put(ConnectorConfig.UPDATE_TIMESTAMP, System.currentTimeMillis());
         configs.setTargetState(TargetState.STARTED);
         dataSynchronizer.send(CONNECTOR_KEY(connectorName), configs);
         return connectorName;
@@ -231,7 +245,7 @@ public class ConfigManagementServiceImpl extends AbstractConfigManagementService
         newConfig.setProperties(new HashMap<>(config.getProperties()));
         newConfig.setTargetState(config.getTargetState());
         // update version by timestamp
-        newConfig.put(RuntimeConfigDefine.UPDATE_TIMESTAMP, System.currentTimeMillis());
+        newConfig.put(ConnectorConfig.UPDATE_TIMESTAMP, System.currentTimeMillis());
         return newConfig;
     }
 
@@ -290,7 +304,7 @@ public class ConfigManagementServiceImpl extends AbstractConfigManagementService
         });
         taskKeyValueStore.getKVMap().forEach((connectName, taskConfigs) -> {
             taskConfigs.forEach(taskConfig -> {
-                ConnectorTaskId taskId = new ConnectorTaskId(connectName, taskConfig.getInt(RuntimeConfigDefine.TASK_ID));
+                ConnectorTaskId taskId = new ConnectorTaskId(connectName, taskConfig.getInt(ConnectorConfig.TASK_ID));
                 dataSynchronizer.send(TASK_KEY(taskId), taskConfig);
             });
         });
@@ -339,8 +353,8 @@ public class ConfigManagementServiceImpl extends AbstractConfigManagementService
         ConnectKeyValue oldConfig = connectorKeyValueStore.get(connectorName);
         // config update
         if (!value.equals(oldConfig)) {
-            Long oldUpdateTime = oldConfig.getLong(RuntimeConfigDefine.UPDATE_TIMESTAMP);
-            Long newUpdateTime = value.getLong(RuntimeConfigDefine.UPDATE_TIMESTAMP);
+            Long oldUpdateTime = oldConfig.getLong(ConnectorConfig.UPDATE_TIMESTAMP);
+            Long newUpdateTime = value.getLong(ConnectorConfig.UPDATE_TIMESTAMP);
             if (newUpdateTime > oldUpdateTime) {
                 // remove
                 connectorKeyValueStore.remove(connectorName);
@@ -389,8 +403,8 @@ public class ConfigManagementServiceImpl extends AbstractConfigManagementService
         ConnectKeyValue oldConfig = connectorKeyValueStore.get(connectorName);
         // config update
         if (!value.equals(oldConfig)) {
-            Long oldUpdateTime = oldConfig.getLong(RuntimeConfigDefine.UPDATE_TIMESTAMP);
-            Long newUpdateTime = value.getLong(RuntimeConfigDefine.UPDATE_TIMESTAMP);
+            Long oldUpdateTime = oldConfig.getLong(ConnectorConfig.UPDATE_TIMESTAMP);
+            Long newUpdateTime = value.getLong(ConnectorConfig.UPDATE_TIMESTAMP);
             if (newUpdateTime > oldUpdateTime) {
                 // remove
                 oldConfig.setTargetState(value.getTargetState());
@@ -425,13 +439,13 @@ public class ConfigManagementServiceImpl extends AbstractConfigManagementService
     private boolean mergeConnectConfig(String connectName, ConnectKeyValue connectKeyValue) {
         if (!connectorKeyValueStore.containsKey(connectName)) {
             connectorKeyValueStore.put(connectName, connectKeyValue);
-            recomputeTaskConfigs(connectName, loadConnector(connectKeyValue), connectKeyValue.getLong(RuntimeConfigDefine.UPDATE_TIMESTAMP), connectKeyValue);
+            recomputeTaskConfigs(connectName, loadConnector(connectKeyValue), connectKeyValue.getLong(ConnectorConfig.UPDATE_TIMESTAMP), connectKeyValue);
         }
         ConnectKeyValue oldConfig = connectorKeyValueStore.get(connectName);
         // config update
         if (!connectKeyValue.equals(oldConfig)) {
-            Long oldUpdateTime = oldConfig.getLong(RuntimeConfigDefine.UPDATE_TIMESTAMP);
-            Long newUpdateTime = connectKeyValue.getLong(RuntimeConfigDefine.UPDATE_TIMESTAMP);
+            Long oldUpdateTime = oldConfig.getLong(ConnectorConfig.UPDATE_TIMESTAMP);
+            Long newUpdateTime = connectKeyValue.getLong(ConnectorConfig.UPDATE_TIMESTAMP);
             if (newUpdateTime > oldUpdateTime) {
                 connectorKeyValueStore.put(connectName, connectKeyValue);
                 recomputeTaskConfigs(connectName, loadConnector(connectKeyValue), newUpdateTime, connectKeyValue);
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/DefaultConnectorContext.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/DefaultConnectorContext.java
index d6254cd..98a63a7 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/DefaultConnectorContext.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/DefaultConnectorContext.java
@@ -24,7 +24,7 @@ import java.util.Set;
 import org.apache.rocketmq.connect.runtime.controller.AbstractConnectController;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
 import org.apache.rocketmq.connect.runtime.common.LoggerName;
-import org.apache.rocketmq.connect.runtime.config.RuntimeConfigDefine;
+import org.apache.rocketmq.connect.runtime.config.ConnectorConfig;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.WorkerConnector;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -54,7 +54,7 @@ public class DefaultConnectorContext implements ConnectorContext {
             Connector connector = currentConnector.getConnector();
             ConnectKeyValue connectKeyValue = controller.getConfigManagementService().getConnectorConfigs().get(connectorName);
             long currentTimeMillis = System.currentTimeMillis();
-            connectKeyValue.put(RuntimeConfigDefine.UPDATE_TIMESTAMP, currentTimeMillis);
+            connectKeyValue.put(ConnectorConfig.UPDATE_TIMESTAMP, currentTimeMillis);
             controller.getConfigManagementService().recomputeTaskConfigs(connectorName, connector, currentTimeMillis, connectKeyValue);
             log.info("Connector {} recompute taskConfigs success.", connectorName);
         } else {
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/PositionManagementService.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/PositionManagementService.java
index 3d1a4b0..9a78474 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/PositionManagementService.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/PositionManagementService.java
@@ -21,7 +21,7 @@ package org.apache.rocketmq.connect.runtime.service;
 import io.openmessaging.connector.api.data.RecordOffset;
 import java.util.List;
 import java.util.Map;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.connect.runtime.store.ExtendRecordPartition;
 
 /**
@@ -44,7 +44,7 @@ public interface PositionManagementService {
      *
      * @param config can be DistributedConfig or StandaloneConfig
      */
-    default void configure(ConnectConfig config) {
+    default void configure(WorkerConfig config) {
 
     }
 
@@ -93,7 +93,7 @@ public interface PositionManagementService {
      */
     void registerListener(PositionUpdateListener listener);
 
-    void initialize(ConnectConfig connectConfig);
+    void initialize(WorkerConfig connectConfig);
 
     interface PositionUpdateListener {
 
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/PositionManagementServiceImpl.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/PositionManagementServiceImpl.java
index c372d68..e2fc963 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/PositionManagementServiceImpl.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/PositionManagementServiceImpl.java
@@ -28,7 +28,7 @@ import java.util.stream.Collectors;
 
 import org.apache.rocketmq.common.TopicConfig;
 import org.apache.rocketmq.connect.runtime.common.LoggerName;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.connect.runtime.converter.JsonConverter;
 import org.apache.rocketmq.connect.runtime.converter.RecordOffsetConverter;
 import org.apache.rocketmq.connect.runtime.converter.RecordPartitionConverter;
@@ -77,7 +77,7 @@ public class PositionManagementServiceImpl implements PositionManagementService
      *
      * @param connectConfig
      */
-    private void prepare(ConnectConfig connectConfig) {
+    private void prepare(WorkerConfig connectConfig) {
         String positionStoreTopic = connectConfig.getPositionStoreTopic();
         if (!ConnectUtil.isTopicExist(connectConfig, positionStoreTopic)) {
             log.info("try to create position store topic: {}!", positionStoreTopic);
@@ -163,7 +163,7 @@ public class PositionManagementServiceImpl implements PositionManagementService
         this.positionUpdateListener.add(listener);
     }
 
-    @Override public void initialize(ConnectConfig connectConfig) {
+    @Override public void initialize(WorkerConfig connectConfig) {
         this.positionStore = new FileBaseKeyValueStore<>(FilePathConfigUtil.getPositionPath(connectConfig.getStorePathRootDir()),
             new RecordPartitionConverter(),
             new RecordOffsetConverter());
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/RebalanceImpl.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/RebalanceImpl.java
index ff49726..4fc9915 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/RebalanceImpl.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/RebalanceImpl.java
@@ -25,7 +25,7 @@ import org.apache.rocketmq.connect.runtime.controller.AbstractConnectController;
 import org.apache.rocketmq.connect.runtime.common.ConnAndTaskConfigs;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
 import org.apache.rocketmq.connect.runtime.common.LoggerName;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.Worker;
 import org.apache.rocketmq.connect.runtime.service.memory.MemoryClusterManagementServiceImpl;
 import org.apache.rocketmq.connect.runtime.service.strategy.AllocateConnAndTaskStrategy;
@@ -77,7 +77,7 @@ public class RebalanceImpl {
 
     public void checkClusterStoreTopic() {
         if (!clusterManagementService.hasClusterStoreTopic()) {
-            ConnectConfig connectConfig = this.connectController.getConnectConfig();
+            WorkerConfig connectConfig = this.connectController.getConnectConfig();
             String clusterStoreTopic = this.connectController.getConnectConfig().getClusterStoreTopic();
             log.info("cluster store topic not exist, try to create it!");
             TopicConfig topicConfig = new TopicConfig(clusterStoreTopic, 1, 1, 6);
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/StateManagementService.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/StateManagementService.java
index 39c2508..7d5d645 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/StateManagementService.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/StateManagementService.java
@@ -16,7 +16,7 @@
  */
 package org.apache.rocketmq.connect.runtime.service;
 
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.status.ConnectorStatus;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.status.TaskStatus;
 import org.apache.rocketmq.connect.runtime.utils.ConnectorTaskId;
@@ -31,7 +31,7 @@ public interface StateManagementService {
      * initialize cb config
      * @param connectConfig
      */
-    void initialize(ConnectConfig connectConfig);
+    void initialize(WorkerConfig connectConfig);
 
     /**
      * Start dependent services (if needed)
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/StateManagementServiceImpl.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/StateManagementServiceImpl.java
index a934678..9c20f7e 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/StateManagementServiceImpl.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/StateManagementServiceImpl.java
@@ -20,7 +20,7 @@ import com.alibaba.fastjson.JSON;
 import org.apache.rocketmq.common.TopicConfig;
 import org.apache.rocketmq.connect.runtime.common.ConnAndTaskStatus;
 import org.apache.rocketmq.connect.runtime.common.LoggerName;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.status.AbstractStatus;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.status.ConnectorStatus;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.status.TaskStatus;
@@ -79,7 +79,7 @@ public class StateManagementServiceImpl implements StateManagementService {
      *
      * @param connectConfig
      */
-    private void prepare(ConnectConfig connectConfig) {
+    private void prepare(WorkerConfig connectConfig) {
         String connectStatusTopic = connectConfig.getConnectStatusTopic();
         if (!ConnectUtil.isTopicExist(connectConfig, connectStatusTopic)) {
             log.info("try to create status topic: {}!", connectStatusTopic);
@@ -94,7 +94,7 @@ public class StateManagementServiceImpl implements StateManagementService {
      * @param config
      */
     @Override
-    public void initialize(ConnectConfig config) {
+    public void initialize(WorkerConfig config) {
         this.dataSynchronizer = new BrokerBasedLog(config,
                 config.getConnectStatusTopic(),
                 ConnectUtil.createGroupName(statusManagePrefix, config.getWorkerId()),
@@ -270,7 +270,11 @@ public class StateManagementServiceImpl implements StateManagementService {
      */
     @Override
     public TaskStatus get(ConnectorTaskId id) {
-        return connAndTaskStatus.getTasks().get(id.connector(), id.task()).get();
+        ConnAndTaskStatus.CacheEntry<TaskStatus> cacheEntry = connAndTaskStatus.getTasks().get(id.connector(), id.task());
+        if (cacheEntry == null) {
+            return null;
+        }
+        return cacheEntry.get();
     }
 
     /**
@@ -281,7 +285,11 @@ public class StateManagementServiceImpl implements StateManagementService {
      */
     @Override
     public ConnectorStatus get(String connector) {
-        return connAndTaskStatus.getConnectors().get(connector).get();
+        ConnAndTaskStatus.CacheEntry<ConnectorStatus> cacheEntry = connAndTaskStatus.getConnectors().get(connector);
+        if (cacheEntry == null) {
+            return null;
+        }
+        return cacheEntry.get();
     }
 
     /**
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/memory/FilePositionManagementServiceImpl.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/memory/FilePositionManagementServiceImpl.java
index 056773b..024728c 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/memory/FilePositionManagementServiceImpl.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/memory/FilePositionManagementServiceImpl.java
@@ -20,7 +20,7 @@ import io.openmessaging.connector.api.data.RecordOffset;
 import io.openmessaging.connector.api.errors.ConnectException;
 import org.apache.rocketmq.common.utils.ThreadUtils;
 import org.apache.rocketmq.connect.runtime.common.LoggerName;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.connect.runtime.converter.RecordOffsetConverter;
 import org.apache.rocketmq.connect.runtime.converter.RecordPartitionConverter;
 import org.apache.rocketmq.connect.runtime.service.PositionManagementService;
@@ -61,7 +61,7 @@ public class FilePositionManagementServiceImpl implements PositionManagementServ
 
     }
 
-    @Override public void initialize(ConnectConfig connectConfig) {
+    @Override public void initialize(WorkerConfig connectConfig) {
         this.positionStore = new FileBaseKeyValueStore<>(FilePathConfigUtil.getPositionPath(connectConfig.getStorePathRootDir()),
             new RecordPartitionConverter(),
             new RecordOffsetConverter());
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/memory/MemoryClusterManagementServiceImpl.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/memory/MemoryClusterManagementServiceImpl.java
index 8add05b..a9f24f8 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/memory/MemoryClusterManagementServiceImpl.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/memory/MemoryClusterManagementServiceImpl.java
@@ -17,7 +17,7 @@
 
 package org.apache.rocketmq.connect.runtime.service.memory;
 
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.connect.runtime.controller.standalone.StandaloneConfig;
 import org.apache.rocketmq.connect.runtime.service.ClusterManagementService;
 
@@ -36,7 +36,7 @@ public class MemoryClusterManagementServiceImpl implements ClusterManagementServ
 
     }
 
-    @Override public void initialize(ConnectConfig connectConfig) {
+    @Override public void initialize(WorkerConfig connectConfig) {
         this.configure(connectConfig);
     }
 
@@ -46,7 +46,7 @@ public class MemoryClusterManagementServiceImpl implements ClusterManagementServ
      * @param config can be DistributedConfig or StandaloneConfig
      */
     @Override
-    public void configure(ConnectConfig config) {
+    public void configure(WorkerConfig config) {
         this.config = (StandaloneConfig) config;
     }
 
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/memory/MemoryConfigManagementServiceImpl.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/memory/MemoryConfigManagementServiceImpl.java
index 515c714..a159190 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/memory/MemoryConfigManagementServiceImpl.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/memory/MemoryConfigManagementServiceImpl.java
@@ -18,11 +18,15 @@ package org.apache.rocketmq.connect.runtime.service.memory;
 
 
 import io.openmessaging.connector.api.component.connector.Connector;
+import io.openmessaging.connector.api.component.task.sink.SinkConnector;
+import io.openmessaging.connector.api.component.task.source.SourceConnector;
 import io.openmessaging.connector.api.errors.ConnectException;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
 import org.apache.rocketmq.connect.runtime.common.LoggerName;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
-import org.apache.rocketmq.connect.runtime.config.RuntimeConfigDefine;
+import org.apache.rocketmq.connect.runtime.config.SinkConnectorConfig;
+import org.apache.rocketmq.connect.runtime.config.SourceConnectorConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
+import org.apache.rocketmq.connect.runtime.config.ConnectorConfig;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.TargetState;
 import org.apache.rocketmq.connect.runtime.controller.isolation.Plugin;
 import org.apache.rocketmq.connect.runtime.service.AbstractConfigManagementService;
@@ -49,10 +53,11 @@ public class MemoryConfigManagementServiceImpl extends AbstractConfigManagementS
     }
 
     @Override
-    public void initialize(ConnectConfig connectConfig, Plugin plugin) {
+    public void initialize(WorkerConfig workerConfig, Plugin plugin) {
         this.connectorKeyValueStore = new MemoryBasedKeyValueStore<>();
         this.taskKeyValueStore = new MemoryBasedKeyValueStore<>();
         this.plugin = plugin;
+        this.workerConfig = workerConfig;
     }
 
     @Override
@@ -80,26 +85,35 @@ public class MemoryConfigManagementServiceImpl extends AbstractConfigManagementS
 
     @Override
     public String putConnectorConfig(String connectorName, ConnectKeyValue configs) {
-        ConnectKeyValue exist = connectorKeyValueStore.get(connectorName);
-        if (null != exist) {
-            Long updateTimestamp = exist.getLong(RuntimeConfigDefine.UPDATE_TIMESTAMP);
-            if (null != updateTimestamp) {
-                configs.put(RuntimeConfigDefine.UPDATE_TIMESTAMP, updateTimestamp);
-            }
-        }
-        if (configs.equals(exist)) {
-            throw new ConnectException("Connector with same config already exist.");
-        }
 
-        Long currentTimestamp = System.currentTimeMillis();
-        configs.put(RuntimeConfigDefine.UPDATE_TIMESTAMP, currentTimestamp);
-        for (String requireConfig : RuntimeConfigDefine.REQUEST_CONFIG) {
+        // check request config
+        for (String requireConfig : ConnectorConfig.REQUEST_CONFIG) {
             if (!configs.containsKey(requireConfig)) {
                 throw new ConnectException("Request config key: " + requireConfig);
             }
         }
+        // current timestamp
+        Long currentTimestamp = System.currentTimeMillis();
+        ConnectKeyValue oldConfig = connectorKeyValueStore.get(connectorName);
+        if (null != oldConfig) {
+            Long updateTimestamp = oldConfig.getLong(ConnectorConfig.UPDATE_TIMESTAMP);
+            if (null != updateTimestamp) {
+                configs.put(ConnectorConfig.UPDATE_TIMESTAMP, currentTimestamp);
+            }
+        }
+        if (configs.equals(oldConfig)) {
+            throw new ConnectException("Connector with same config already exist.");
+        }
+        // validate config
         Connector connector = super.loadConnector(configs);
+        if (connector instanceof SourceConnector) {
+            new SourceConnectorConfig(configs).validate();
+        } else if (connector instanceof SinkConnector) {
+            new SinkConnectorConfig(configs).validate();
+        }
         configs.setTargetState(TargetState.STARTED);
+        // update cache
+
         connectorKeyValueStore.put(connectorName, configs);
         recomputeTaskConfigs(connectorName, connector, currentTimestamp, configs);
         return connectorName;
@@ -129,7 +143,7 @@ public class MemoryConfigManagementServiceImpl extends AbstractConfigManagementS
             throw new ConnectException("Connector [" + connectorName + "] does not exist");
         }
         ConnectKeyValue config = connectorKeyValueStore.get(connectorName);
-        config.put(RuntimeConfigDefine.UPDATE_TIMESTAMP, System.currentTimeMillis());
+        config.put(ConnectorConfig.UPDATE_TIMESTAMP, System.currentTimeMillis());
         config.setTargetState(TargetState.PAUSED);
         connectorKeyValueStore.put(connectorName, config);
         triggerListener();
@@ -146,12 +160,15 @@ public class MemoryConfigManagementServiceImpl extends AbstractConfigManagementS
             throw new ConnectException("Connector [" + connectorName + "] does not exist");
         }
         ConnectKeyValue config = connectorKeyValueStore.get(connectorName);
-        config.put(RuntimeConfigDefine.UPDATE_TIMESTAMP, System.currentTimeMillis());
+        config.put(ConnectorConfig.UPDATE_TIMESTAMP, System.currentTimeMillis());
         config.setTargetState(TargetState.STARTED);
+
         connectorKeyValueStore.put(connectorName, config);
         triggerListener();
     }
 
+
+
     @Override
     public Map<String, List<ConnectKeyValue>> getTaskConfigs() {
         return taskKeyValueStore.getKVMap();
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/memory/MemoryStateManagementServiceImpl.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/memory/MemoryStateManagementServiceImpl.java
index 93efbcb..254096d 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/memory/MemoryStateManagementServiceImpl.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/memory/MemoryStateManagementServiceImpl.java
@@ -17,7 +17,7 @@
 package org.apache.rocketmq.connect.runtime.service.memory;
 
 import org.apache.rocketmq.connect.runtime.common.LoggerName;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.status.ConnectorStatus;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.status.TaskStatus;
 import org.apache.rocketmq.connect.runtime.service.StagingMode;
@@ -49,7 +49,7 @@ public class MemoryStateManagementServiceImpl implements StateManagementService
      * @param config
      */
     @Override
-    public void initialize(ConnectConfig config) {
+    public void initialize(WorkerConfig config) {
         this.tasks = new Table<>();
         this.connectors = new ConcurrentHashMap<>();
     }
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/strategy/AllocateConnAndTaskStrategyByConsistentHash.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/strategy/AllocateConnAndTaskStrategyByConsistentHash.java
index 956d048..bb0398e 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/strategy/AllocateConnAndTaskStrategyByConsistentHash.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/service/strategy/AllocateConnAndTaskStrategyByConsistentHash.java
@@ -28,7 +28,7 @@ import org.apache.rocketmq.common.consistenthash.Node;
 import org.apache.rocketmq.connect.runtime.common.ConnAndTaskConfigs;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
 import org.apache.rocketmq.connect.runtime.common.LoggerName;
-import org.apache.rocketmq.connect.runtime.config.RuntimeConfigDefine;
+import org.apache.rocketmq.connect.runtime.config.ConnectorConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -39,8 +39,8 @@ public class AllocateConnAndTaskStrategyByConsistentHash implements AllocateConn
     private HashFunction hashFunc;
 
     public AllocateConnAndTaskStrategyByConsistentHash() {
-        virtualNodes = Integer.parseInt(System.getProperty(RuntimeConfigDefine.VIRTUAL_NODE, "0"));
-        String funcName = System.getProperty(RuntimeConfigDefine.HASH_FUNC);
+        virtualNodes = Integer.parseInt(System.getProperty(ConnectorConfig.VIRTUAL_NODE, "0"));
+        String funcName = System.getProperty(ConnectorConfig.HASH_FUNC);
         if (StringUtils.isNoneEmpty(funcName)) {
             try {
                 hashFunc = (HashFunction) Class.forName(funcName).newInstance();
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/stats/ConnectStatsManager.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/stats/ConnectStatsManager.java
index c02b0d8..4e555c5 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/stats/ConnectStatsManager.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/stats/ConnectStatsManager.java
@@ -25,7 +25,7 @@ import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.common.stats.StatsItem;
 import org.apache.rocketmq.common.stats.StatsItemSet;
 import org.apache.rocketmq.common.utils.ThreadUtils;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.logging.InternalLoggerFactory;
 
@@ -89,9 +89,9 @@ public class ConnectStatsManager {
 
     private final HashMap<String, StatsItemSet> statsTable = new HashMap<String, StatsItemSet>();
     private final String worker;
-    private ConnectConfig connectConfig;
+    private WorkerConfig connectConfig;
 
-    public ConnectStatsManager(ConnectConfig connectConfig) {
+    public ConnectStatsManager(WorkerConfig connectConfig) {
         this.connectConfig = connectConfig;
         this.worker = connectConfig.getWorkerId();
         init();
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/utils/ConnectUtil.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/utils/ConnectUtil.java
index f0684d5..42100ba 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/utils/ConnectUtil.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/utils/ConnectUtil.java
@@ -38,8 +38,9 @@ import org.apache.rocketmq.common.protocol.route.BrokerData;
 import org.apache.rocketmq.common.protocol.route.TopicRouteData;
 import org.apache.rocketmq.common.subscription.SubscriptionGroupConfig;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
-import org.apache.rocketmq.connect.runtime.config.RuntimeConfigDefine;
+import org.apache.rocketmq.connect.runtime.config.SinkConnectorConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
+import org.apache.rocketmq.connect.runtime.config.ConnectorConfig;
 import org.apache.rocketmq.connect.runtime.service.strategy.AllocateConnAndTaskStrategy;
 import org.apache.rocketmq.remoting.RPCHook;
 import org.apache.rocketmq.remoting.common.RemotingUtil;
@@ -94,7 +95,7 @@ public class ConnectUtil {
         return new StringBuffer(prefix).append("-").append(UUID.randomUUID().toString()).toString();
     }
 
-    public static AllocateConnAndTaskStrategy initAllocateConnAndTaskStrategy(ConnectConfig connectConfig) {
+    public static AllocateConnAndTaskStrategy initAllocateConnAndTaskStrategy(WorkerConfig connectConfig) {
         try {
             return (AllocateConnAndTaskStrategy) Thread.currentThread().getContextClassLoader().loadClass(connectConfig.getAllocTaskStrategy()).newInstance();
         } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
@@ -102,7 +103,7 @@ public class ConnectUtil {
         }
     }
 
-    public static DefaultMQProducer initDefaultMQProducer(ConnectConfig connectConfig) {
+    public static DefaultMQProducer initDefaultMQProducer(WorkerConfig connectConfig) {
         RPCHook rpcHook = null;
         if (connectConfig.getAclEnable()) {
             rpcHook = new AclClientRPCHook(new SessionCredentials(connectConfig.getAccessKey(), connectConfig.getSecretKey()));
@@ -112,12 +113,12 @@ public class ConnectUtil {
         producer.setInstanceName(createUniqInstance(connectConfig.getNamesrvAddr()));
         producer.setProducerGroup(connectConfig.getRmqProducerGroup());
         producer.setSendMsgTimeout(connectConfig.getOperationTimeout());
-        producer.setMaxMessageSize(RuntimeConfigDefine.MAX_MESSAGE_SIZE);
+        producer.setMaxMessageSize(ConnectorConfig.MAX_MESSAGE_SIZE);
         producer.setLanguage(LanguageCode.JAVA);
         return producer;
     }
 
-    public static DefaultMQPullConsumer initDefaultMQPullConsumer(ConnectConfig connectConfig) {
+    public static DefaultMQPullConsumer initDefaultMQPullConsumer(WorkerConfig connectConfig) {
         RPCHook rpcHook = null;
         if (connectConfig.getAclEnable()) {
             rpcHook = new AclClientRPCHook(new SessionCredentials(connectConfig.getAccessKey(), connectConfig.getSecretKey()));
@@ -128,12 +129,12 @@ public class ConnectUtil {
         consumer.setConsumerGroup(connectConfig.getRmqConsumerGroup());
         consumer.setMaxReconsumeTimes(connectConfig.getRmqMaxRedeliveryTimes());
         consumer.setBrokerSuspendMaxTimeMillis(connectConfig.getBrokerSuspendMaxTimeMillis());
-        consumer.setConsumerPullTimeoutMillis((long) connectConfig.getRmqMessageConsumeTimeout());
+        consumer.setConsumerPullTimeoutMillis(connectConfig.getRmqMessageConsumeTimeout());
         consumer.setLanguage(LanguageCode.JAVA);
         return consumer;
     }
 
-    public static DefaultMQPushConsumer initDefaultMQPushConsumer(ConnectConfig connectConfig) {
+    public static DefaultMQPushConsumer initDefaultMQPushConsumer(WorkerConfig connectConfig) {
         RPCHook rpcHook = null;
         if (connectConfig.getAclEnable()) {
             rpcHook = new AclClientRPCHook(new SessionCredentials(connectConfig.getAccessKey(), connectConfig.getSecretKey()));
@@ -143,14 +144,14 @@ public class ConnectUtil {
         consumer.setInstanceName(createUniqInstance(connectConfig.getNamesrvAddr()));
         consumer.setConsumerGroup(createGroupName(connectConfig.getRmqConsumerGroup()));
         consumer.setMaxReconsumeTimes(connectConfig.getRmqMaxRedeliveryTimes());
-        consumer.setConsumeTimeout((long) connectConfig.getRmqMessageConsumeTimeout());
+        consumer.setConsumeTimeout(connectConfig.getRmqMessageConsumeTimeout());
         consumer.setConsumeThreadMin(connectConfig.getRmqMinConsumeThreadNums());
         consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
         consumer.setLanguage(LanguageCode.JAVA);
         return consumer;
     }
 
-    public static DefaultMQAdminExt startMQAdminTool(ConnectConfig connectConfig) throws MQClientException {
+    public static DefaultMQAdminExt startMQAdminTool(WorkerConfig connectConfig) throws MQClientException {
         RPCHook rpcHook = null;
         if (connectConfig.getAclEnable()) {
             rpcHook = new AclClientRPCHook(new SessionCredentials(connectConfig.getAccessKey(), connectConfig.getSecretKey()));
@@ -163,7 +164,7 @@ public class ConnectUtil {
         return defaultMQAdminExt;
     }
 
-    public static void createTopic(ConnectConfig connectConfig, TopicConfig topicConfig) {
+    public static void createTopic(WorkerConfig connectConfig, TopicConfig topicConfig) {
         DefaultMQAdminExt defaultMQAdminExt = null;
         try {
             defaultMQAdminExt = startMQAdminTool(connectConfig);
@@ -185,7 +186,7 @@ public class ConnectUtil {
         }
     }
 
-    public static boolean isTopicExist(ConnectConfig connectConfig, String topic) {
+    public static boolean isTopicExist(WorkerConfig connectConfig, String topic) {
         DefaultMQAdminExt defaultMQAdminExt = null;
         boolean foundTopicRouteInfo = false;
         try {
@@ -206,7 +207,7 @@ public class ConnectUtil {
         return foundTopicRouteInfo;
     }
 
-    public static Set<String> fetchAllConsumerGroupList(ConnectConfig connectConfig) {
+    public static Set<String> fetchAllConsumerGroupList(WorkerConfig connectConfig) {
         Set<String> consumerGroupSet = Sets.newHashSet();
         DefaultMQAdminExt defaultMQAdminExt = null;
         try {
@@ -226,7 +227,7 @@ public class ConnectUtil {
         return consumerGroupSet;
     }
 
-    public static String createSubGroup(ConnectConfig connectConfig, String subGroup) {
+    public static String createSubGroup(WorkerConfig connectConfig, String subGroup) {
         DefaultMQAdminExt defaultMQAdminExt = null;
         try {
             defaultMQAdminExt = startMQAdminTool(connectConfig);
@@ -311,9 +312,9 @@ public class ConnectUtil {
      * @return
      * @throws MQClientException
      */
-    public static DefaultLitePullConsumer initDefaultLitePullConsumer(ConnectConfig connectConfig, ConnectorTaskId id, ConnectKeyValue keyValue, boolean autoCommit) throws MQClientException {
+    public static DefaultLitePullConsumer initDefaultLitePullConsumer(WorkerConfig connectConfig, ConnectorTaskId id, ConnectKeyValue keyValue, boolean autoCommit) throws MQClientException {
         DefaultLitePullConsumer consumer = null;
-        String groupId = keyValue.getString(RuntimeConfigDefine.TASK_GROUP_ID);
+        String groupId = keyValue.getString(SinkConnectorConfig.TASK_GROUP_ID);
         if (StringUtils.isBlank(groupId)) {
             groupId = SYS_TASK_CG_PREFIX + id.connector();
         }
@@ -336,7 +337,7 @@ public class ConnectUtil {
         return new AclClientRPCHook(new SessionCredentials(accessKey, secretKey));
     }
 
-    public static DefaultMQPullConsumer initDefaultMQPullConsumer(ConnectConfig connectConfig, ConnectorTaskId id, ConnectKeyValue keyValue) {
+    public static DefaultMQPullConsumer initDefaultMQPullConsumer(WorkerConfig connectConfig, ConnectorTaskId id, ConnectKeyValue keyValue) {
         RPCHook rpcHook = null;
         if (connectConfig.getAclEnable()) {
             rpcHook = new AclClientRPCHook(new SessionCredentials(connectConfig.getAccessKey(), connectConfig.getSecretKey()));
@@ -355,7 +356,7 @@ public class ConnectUtil {
         return consumer;
     }
 
-    public static DefaultMQPullConsumer initDefaultMQPullConsumer(ConnectConfig connectConfig, String connectorName, ConnectKeyValue keyValue) {
+    public static DefaultMQPullConsumer initDefaultMQPullConsumer(WorkerConfig connectConfig, String connectorName, ConnectKeyValue keyValue) {
         RPCHook rpcHook = null;
         if (connectConfig.getAclEnable()) {
             rpcHook = new AclClientRPCHook(new SessionCredentials(connectConfig.getAccessKey(), connectConfig.getSecretKey()));
diff --git a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/utils/datasync/BrokerBasedLog.java b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/utils/datasync/BrokerBasedLog.java
index bc5ed0c..fee1459 100644
--- a/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/utils/datasync/BrokerBasedLog.java
+++ b/rocketmq-connect-runtime/src/main/java/org/apache/rocketmq/connect/runtime/utils/datasync/BrokerBasedLog.java
@@ -33,13 +33,13 @@ import org.apache.rocketmq.client.producer.SendCallback;
 import org.apache.rocketmq.common.message.Message;
 import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.connect.runtime.common.LoggerName;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.connect.runtime.utils.Callback;
 import org.apache.rocketmq.connect.runtime.utils.ConnectUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.apache.rocketmq.connect.runtime.config.RuntimeConfigDefine.MAX_MESSAGE_SIZE;
+import static org.apache.rocketmq.connect.runtime.config.ConnectorConfig.MAX_MESSAGE_SIZE;
 
 /**
  * A Broker base data synchronizer, synchronize data between workers.
@@ -81,12 +81,12 @@ public class BrokerBasedLog<K, V> implements DataSynchronizer<K, V> {
      */
     private Converter valueConverter;
 
-    public BrokerBasedLog(ConnectConfig connectConfig,
-        String topicName,
-        String workId,
-        DataSynchronizerCallback<K, V> dataSynchronizerCallback,
-        Converter keyConverter,
-        Converter valueConverter) {
+    public BrokerBasedLog(WorkerConfig connectConfig,
+                          String topicName,
+                          String workId,
+                          DataSynchronizerCallback<K, V> dataSynchronizerCallback,
+                          Converter keyConverter,
+                          Converter valueConverter) {
 
         this.topicName = topicName;
         this.dataSynchronizerCallback = dataSynchronizerCallback;
@@ -104,7 +104,7 @@ public class BrokerBasedLog<K, V> implements DataSynchronizer<K, V> {
      *
      * @param connectConfig
      */
-    private void prepare(ConnectConfig connectConfig) {
+    private void prepare(WorkerConfig connectConfig) {
         if (connectConfig.isAutoCreateGroupEnable()) {
             ConnectUtil.createSubGroup(connectConfig, consumer.getConsumerGroup());
         }
diff --git a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/config/ConnectConfigTest.java b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/config/ConnectConfigTest.java
index 8486179..6da21bd 100644
--- a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/config/ConnectConfigTest.java
+++ b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/config/ConnectConfigTest.java
@@ -25,7 +25,7 @@ public class ConnectConfigTest {
 
     @Test
     public void testConnectConfigAttribute() {
-        ConnectConfig connectConfig = new ConnectConfig();
+        WorkerConfig connectConfig = new WorkerConfig();
         connectConfig.setHttpPort(8081);
         assertThat(connectConfig.getHttpPort()).isEqualTo(8081);
 
@@ -104,17 +104,14 @@ public class ConnectConfigTest {
         connectConfig.setAutoCreateGroupEnable(true);
         assertThat(true == connectConfig.isAutoCreateGroupEnable());
 
-        connectConfig.setClusterName("default_cluster");
-        assertThat("default_cluster".equals(connectConfig.getClusterName()));
-
         connectConfig.setAdminExtGroup("admin_group");
         assertThat("admin_group".equals(connectConfig.getAdminExtGroup()));
 
         connectConfig.setConnectHome("/usr/connect");
         assertThat("/usr/connect".equals(connectConfig.getConnectHome()));
 
-        connectConfig.setOffsetCommitIntervalMs(100);
-        assertThat(100 == connectConfig.getOffsetCommitIntervalMs());
+        connectConfig.setOffsetCommitIntervalMsConfig(100);
+        assertThat(100 == connectConfig.getOffsetCommitIntervalMsConfig());
 
         connectConfig.setMaxStartTimeoutMills(100);
         assertThat(100 == connectConfig.getMaxStartTimeoutMills());
diff --git a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/config/SinkConnectorConfigTest.java b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/config/SinkConnectorConfigTest.java
index 4517be9..1ed009d 100644
--- a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/config/SinkConnectorConfigTest.java
+++ b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/config/SinkConnectorConfigTest.java
@@ -29,12 +29,12 @@ public class SinkConnectorConfigTest {
     @Test
     public void parseTopicListTest() {
         // connect-topicname is null
-        final Set<String> result1 = SinkConnectorConfig.parseTopicList(connectKeyValue);
+        final Set<String> result1 = new SinkConnectorConfig(connectKeyValue).parseTopicList();
         assert result1 == null;
 
         // connect-topicname is not null
-        connectKeyValue.put(RuntimeConfigDefine.CONNECT_TOPICNAME, "test");
-        final Set<String> result2 = SinkConnectorConfig.parseTopicList(connectKeyValue);
+        connectKeyValue.put(SinkConnectorConfig.CONNECT_TOPICNAMES, "test");
+        final Set<String> result2 = new SinkConnectorConfig(connectKeyValue).parseTopicList();
         assert !result2.isEmpty();
     }
 
diff --git a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/SourceTaskOffsetCommitterTest.java b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/SourceTaskOffsetCommitterTest.java
index 805a1d0..76ea9e1 100644
--- a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/SourceTaskOffsetCommitterTest.java
+++ b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/SourceTaskOffsetCommitterTest.java
@@ -23,7 +23,7 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.connect.runtime.utils.ConnectorTaskId;
 import org.junit.After;
 import org.junit.Before;
@@ -37,7 +37,7 @@ public class SourceTaskOffsetCommitterTest {
 
     private SourceTaskOffsetCommitter sourceTaskOffsetCommitter;
 
-    private ConnectConfig connectConfig = new ConnectConfig();
+    private WorkerConfig connectConfig = new WorkerConfig();
 
     private ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);
 
@@ -51,7 +51,7 @@ public class SourceTaskOffsetCommitterTest {
 
     @Before
     public void before() {
-        connectConfig.setOffsetCommitIntervalMs(100);
+        connectConfig.setOffsetCommitIntervalMsConfig(100);
         sourceTaskOffsetCommitter = new SourceTaskOffsetCommitter(connectConfig);
         sourceTaskOffsetCommitter = new SourceTaskOffsetCommitter(connectConfig, scheduledExecutorService, committers);
         ScheduledFuture<?> commitFuture = scheduledExecutorService.scheduleWithFixedDelay(() -> {
diff --git a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/TransformChainTest.java b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/TransformChainTest.java
index 8c6f2a2..f258a01 100644
--- a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/TransformChainTest.java
+++ b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/TransformChainTest.java
@@ -20,7 +20,7 @@ package org.apache.rocketmq.connect.runtime.connectorwrapper;
 import io.openmessaging.KeyValue;
 import io.openmessaging.connector.api.data.ConnectRecord;
 import io.openmessaging.internal.DefaultKeyValue;
-import org.apache.rocketmq.connect.runtime.config.RuntimeConfigDefine;
+import org.apache.rocketmq.connect.runtime.config.ConnectorConfig;
 import org.apache.rocketmq.connect.runtime.controller.isolation.Plugin;
 import org.junit.After;
 import org.junit.Before;
@@ -44,7 +44,7 @@ public class TransformChainTest {
 
     @Before
     public void before() {
-        keyValue.put(RuntimeConfigDefine.TRANSFORMS, "testTransform");
+        keyValue.put(ConnectorConfig.TRANSFORMS, "testTransform");
         keyValue.put("transforms-testTransform-class", "org.apache.rocketmq.connect.runtime.connectorwrapper.TestTransform");
         connectRecord.setExtensions(keyValue);
         transformChain = new TransformChain(keyValue, plugin);
diff --git a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerSinkTaskTest.java b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerSinkTaskTest.java
index df4d51e..d50c2af 100644
--- a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerSinkTaskTest.java
+++ b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerSinkTaskTest.java
@@ -26,16 +26,20 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
-import org.apache.rocketmq.client.consumer.DefaultMQPullConsumer;
+
+import org.apache.rocketmq.client.consumer.DefaultLitePullConsumer;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
-import org.apache.rocketmq.connect.runtime.config.RuntimeConfigDefine;
+import org.apache.rocketmq.connect.runtime.config.SinkConnectorConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
+import org.apache.rocketmq.connect.runtime.config.ConnectorConfig;
+import org.apache.rocketmq.connect.runtime.connectorwrapper.status.WrapperStatusListener;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.testimpl.TestConverter;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.testimpl.TestSinkTask;
 import org.apache.rocketmq.connect.runtime.controller.isolation.Plugin;
 import org.apache.rocketmq.connect.runtime.errors.RetryWithToleranceOperator;
 import org.apache.rocketmq.connect.runtime.errors.ToleranceType;
 import org.apache.rocketmq.connect.runtime.errors.WorkerErrorRecordReporter;
+import org.apache.rocketmq.connect.runtime.service.StateManagementServiceImpl;
 import org.apache.rocketmq.connect.runtime.stats.ConnectStatsManager;
 import org.apache.rocketmq.connect.runtime.stats.ConnectStatsService;
 import org.apache.rocketmq.connect.runtime.utils.ConnectorTaskId;
@@ -53,7 +57,7 @@ public class WorkerSinkTaskTest {
 
     private WorkerSinkTask workerSinkTask;
 
-    private ConnectConfig connectConfig = new ConnectConfig();
+    private WorkerConfig connectConfig = new WorkerConfig();
 
     private ConnectorTaskId connectorTaskId = new ConnectorTaskId("testConnector", 1);
 
@@ -63,7 +67,7 @@ public class WorkerSinkTaskTest {
 
     private RecordConverter recordConverter = new TestConverter();
 
-    private DefaultMQPullConsumer defaultMQPullConsumer = new DefaultMQPullConsumer();
+    private DefaultLitePullConsumer defaultMQPullConsumer = new DefaultLitePullConsumer();
 
     private AtomicReference<WorkerState> workerState = new AtomicReference<>(WorkerState.STARTED);
 
@@ -86,14 +90,14 @@ public class WorkerSinkTaskTest {
 
     @Before
     public void before() {
-        connectKeyValue.put(RuntimeConfigDefine.CONNECT_TOPICNAME, "TEST_TOPIC");
-        keyValue.put(RuntimeConfigDefine.TRANSFORMS, "testTransform");
+        connectKeyValue.put(SinkConnectorConfig.CONNECT_TOPICNAMES, "TEST_TOPIC");
+        keyValue.put(ConnectorConfig.TRANSFORMS, "testTransform");
         keyValue.put("transforms-testTransform-class", "org.apache.rocketmq.connect.runtime.connectorwrapper.TestTransform");
         transformChain = new TransformChain<>(keyValue, plugin);
         workerErrorRecordReporter = new WorkerErrorRecordReporter(retryWithToleranceOperator, recordConverter);
         workerSinkTask = new WorkerSinkTask(connectConfig, connectorTaskId, sinkTask, WorkerSinkTaskTest.class.getClassLoader(), connectKeyValue,
             recordConverter, recordConverter, defaultMQPullConsumer, workerState, connectStatsManager, connectStatsService,
-            transformChain, retryWithToleranceOperator, workerErrorRecordReporter);
+            transformChain, retryWithToleranceOperator, workerErrorRecordReporter, new WrapperStatusListener(new StateManagementServiceImpl(),"workId"));
     }
 
     @After
diff --git a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerSourceTaskTest.java b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerSourceTaskTest.java
index d24f754..63c2831 100644
--- a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerSourceTaskTest.java
+++ b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerSourceTaskTest.java
@@ -30,8 +30,9 @@ import java.util.concurrent.atomic.AtomicReference;
 import org.apache.rocketmq.client.exception.MQClientException;
 import org.apache.rocketmq.client.producer.DefaultMQProducer;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
-import org.apache.rocketmq.connect.runtime.config.RuntimeConfigDefine;
+import org.apache.rocketmq.connect.runtime.config.SourceConnectorConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
+import org.apache.rocketmq.connect.runtime.config.ConnectorConfig;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.testimpl.TestConverter;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.testimpl.TestPositionManageServiceImpl;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.testimpl.TestSourceTask;
@@ -56,7 +57,7 @@ public class WorkerSourceTaskTest {
 
     private WorkerSourceTask workerSourceTask;
 
-    private ConnectConfig connectConfig;
+    private WorkerConfig connectConfig;
 
     private ConnectorTaskId connectorTaskId = new ConnectorTaskId("testConnector" ,1);
 
@@ -90,16 +91,16 @@ public class WorkerSourceTaskTest {
 
     @Before
     public void before() throws MQClientException, InterruptedException {
-        connectConfig = new ConnectConfig();
+        connectConfig = new WorkerConfig();
         connectConfig.setNamesrvAddr("127.0.0.1:9876");
         connectStatsManager = new ConnectStatsManager(connectConfig);
-        connectKeyValue.put(RuntimeConfigDefine.CONNECT_TOPICNAME, "TEST_TOPIC");
-        keyValue.put(RuntimeConfigDefine.TRANSFORMS, "testTransform");
+        connectKeyValue.put(SourceConnectorConfig.CONNECT_TOPICNAME, "TEST_TOPIC");
+        keyValue.put(ConnectorConfig.TRANSFORMS, "testTransform");
         keyValue.put("transforms-testTransform-class", "org.apache.rocketmq.connect.runtime.connectorwrapper.TestTransform");
         transformChain = new TransformChain<>(keyValue, plugin);
         workerSourceTask = new WorkerSourceTask(connectConfig, connectorTaskId, sourceTask, this.getClass().getClassLoader(),
             connectKeyValue, positionManagementService, recordConverter, recordConverter, defaultMQProducer, workerState,
-            connectStatsManager, connectStatsService, transformChain, retryWithToleranceOperator);
+            connectStatsManager, connectStatsService, transformChain, retryWithToleranceOperator,null);
         NameServerMocker.startByDefaultConf(9876, 10911);
         ServerResponseMocker.startServer(10911, "Hello World".getBytes(StandardCharsets.UTF_8));
     }
diff --git a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerTest.java b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerTest.java
index 8573f13..61775c9 100644
--- a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerTest.java
+++ b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/WorkerTest.java
@@ -27,15 +27,14 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 import org.apache.rocketmq.client.producer.DefaultMQProducer;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.testimpl.TestSinkTask;
 import org.apache.rocketmq.connect.runtime.controller.distributed.DistributedConnectController;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
-import org.apache.rocketmq.connect.runtime.config.RuntimeConfigDefine;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
+import org.apache.rocketmq.connect.runtime.config.ConnectorConfig;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.testimpl.TestConnector;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.testimpl.TestConverter;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.testimpl.TestPositionManageServiceImpl;
@@ -78,7 +77,7 @@ public class WorkerTest {
     @Mock
     private DefaultMQProducer producer;
 
-    private ConnectConfig connectConfig;
+    private WorkerConfig connectConfig;
 
     private Worker worker;
 
@@ -110,7 +109,7 @@ public class WorkerTest {
         when(plugin.currentThreadLoader()).thenReturn(this.getClass().getClassLoader());
         when(plugin.newConnector(any())).thenReturn(new TestConnector());
         when(delegatingClassLoader.pluginClassLoader(any())).thenReturn(pluginClassLoader);
-        connectConfig = new ConnectConfig();
+        connectConfig = new WorkerConfig();
         connectConfig.setHttpPort(8081);
         connectConfig.setStorePathRootDir(System.getProperty("user.home") + File.separator + "testConnectorStore");
         connectConfig.setNamesrvAddr("localhost:9876");
@@ -135,7 +134,7 @@ public class WorkerTest {
             // create retry operator
             RetryWithToleranceOperator retryWithToleranceOperator = ReporterManagerUtil.createRetryWithToleranceOperator(connectKeyValue);
             retryWithToleranceOperator.reporters(ReporterManagerUtil.sourceTaskReporters("TEST-CONN-" + i, connectKeyValue));
-            final WorkerSourceTask task = new WorkerSourceTask(new ConnectConfig(),
+            final WorkerSourceTask task = new WorkerSourceTask(new WorkerConfig(),
                 new ConnectorTaskId("TEST-CONN-" + i, i),
                 new TestSourceTask(),
                 null,
@@ -147,7 +146,7 @@ public class WorkerTest {
                 new AtomicReference(WorkerState.STARTED),
                 connectStatsManager, connectStatsService,
                 transformChain,
-                retryWithToleranceOperator, null));
+                retryWithToleranceOperator, null);
            runnables.add(task);
         }
         worker.setWorkingTasks(runnables);
@@ -170,7 +169,7 @@ public class WorkerTest {
             ConnectKeyValue connectKeyValue = new ConnectKeyValue();
             connectKeyValue.getProperties().put("key1", "TEST-CONN-" + i + "1");
             connectKeyValue.getProperties().put("key2", "TEST-CONN-" + i + "2");
-            connectKeyValue.getProperties().put(RuntimeConfigDefine.CONNECTOR_CLASS, TestConnector.class.getName());
+            connectKeyValue.getProperties().put(ConnectorConfig.CONNECTOR_CLASS, TestConnector.class.getName());
             connectorConfigs.put("TEST-CONN-" + i, connectKeyValue);
         }
 
@@ -192,17 +191,17 @@ public class WorkerTest {
             connectKeyValue.getProperties().put("key2", "TEST-CONN-" + i + "2");
             if (i == 1) {
                 // start direct task
-                connectKeyValue.getProperties().put(RuntimeConfigDefine.TASK_TYPE, Worker.TaskType.DIRECT.name());
-                connectKeyValue.getProperties().put(RuntimeConfigDefine.SOURCE_TASK_CLASS, TestSourceTask.class.getName());
-                connectKeyValue.getProperties().put(RuntimeConfigDefine.SINK_TASK_CLASS, TestSinkTask.class.getName());
+                connectKeyValue.getProperties().put(ConnectorConfig.TASK_TYPE, Worker.TaskType.DIRECT.name());
+                connectKeyValue.getProperties().put(ConnectorConfig.SOURCE_TASK_CLASS, TestSourceTask.class.getName());
+                connectKeyValue.getProperties().put(ConnectorConfig.SINK_TASK_CLASS, TestSinkTask.class.getName());
             } else {
-                connectKeyValue.getProperties().put(RuntimeConfigDefine.TASK_TYPE, Worker.TaskType.SOURCE.name());
+                connectKeyValue.getProperties().put(ConnectorConfig.TASK_TYPE, Worker.TaskType.SOURCE.name());
             }
-            connectKeyValue.getProperties().put(RuntimeConfigDefine.TASK_CLASS, TestSourceTask.class.getName());
-            connectKeyValue.getProperties().put(RuntimeConfigDefine.SOURCE_RECORD_CONVERTER, TestConverter.class.getName());
-            connectKeyValue.getProperties().put(RuntimeConfigDefine.NAMESRV_ADDR, "127.0.0.1:9876");
-            connectKeyValue.getProperties().put(RuntimeConfigDefine.RMQ_PRODUCER_GROUP, UUID.randomUUID().toString());
-            connectKeyValue.getProperties().put(RuntimeConfigDefine.OPERATION_TIMEOUT, "3000");
+            connectKeyValue.getProperties().put(ConnectorConfig.TASK_CLASS, TestSourceTask.class.getName());
+            connectKeyValue.getProperties().put(ConnectorConfig.VALUE_CONVERTER, TestConverter.class.getName());
+//            connectKeyValue.getProperties().put(RuntimeConfigDefine.NAMESRV_ADDR, "127.0.0.1:9876");
+//            connectKeyValue.getProperties().put(RuntimeConfigDefine.RMQ_PRODUCER_GROUP, UUID.randomUUID().toString());
+//            connectKeyValue.getProperties().put(RuntimeConfigDefine.OPERATION_TIMEOUT, "3000");
             connectKeyValues.add(connectKeyValue);
             taskConfigs.put("TEST-CONN-" + i, connectKeyValues);
         }
diff --git a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/testimpl/TestPositionManageServiceImpl.java b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/testimpl/TestPositionManageServiceImpl.java
index ecc9e25..b1c9717 100644
--- a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/testimpl/TestPositionManageServiceImpl.java
+++ b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/connectorwrapper/testimpl/TestPositionManageServiceImpl.java
@@ -20,7 +20,7 @@ package org.apache.rocketmq.connect.runtime.connectorwrapper.testimpl;
 import io.openmessaging.connector.api.data.RecordOffset;
 import java.util.List;
 import java.util.Map;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.connect.runtime.service.PositionManagementService;
 import org.apache.rocketmq.connect.runtime.service.StagingMode;
 import org.apache.rocketmq.connect.runtime.store.ExtendRecordPartition;
@@ -76,7 +76,7 @@ public class TestPositionManageServiceImpl implements PositionManagementService
 
     }
 
-    @Override public void initialize(ConnectConfig connectConfig) {
+    @Override public void initialize(WorkerConfig connectConfig) {
 
     }
 
diff --git a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/controller/distributed/DistributedConnectControllerTest.java b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/controller/distributed/DistributedConnectControllerTest.java
index 2a203e4..0ca330a 100644
--- a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/controller/distributed/DistributedConnectControllerTest.java
+++ b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/controller/distributed/DistributedConnectControllerTest.java
@@ -18,8 +18,8 @@
 package org.apache.rocketmq.connect.runtime.controller.distributed;
 
 import java.nio.charset.StandardCharsets;
-import java.util.concurrent.TimeUnit;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.NameServerMocker;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.ServerResponseMocker;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.testimpl.TestPositionManageServiceImpl;
@@ -52,7 +52,7 @@ public class DistributedConnectControllerTest {
 
     private PositionManagementService positionManagementService = new TestPositionManageServiceImpl();
 
-    private ConnectConfig connectConfig = new ConnectConfig();
+    private WorkerConfig connectConfig = new WorkerConfig();
 
     private ServerResponseMocker nameServerMocker;
 
diff --git a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/controller/distributed/TestConfigManagementService.java b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/controller/distributed/TestConfigManagementService.java
index 7a62144..b9c77ce 100644
--- a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/controller/distributed/TestConfigManagementService.java
+++ b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/controller/distributed/TestConfigManagementService.java
@@ -21,7 +21,7 @@ import io.openmessaging.connector.api.component.connector.Connector;
 import java.util.List;
 import java.util.Map;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.connect.runtime.controller.isolation.Plugin;
 import org.apache.rocketmq.connect.runtime.service.ConfigManagementService;
 import org.apache.rocketmq.connect.runtime.service.StagingMode;
@@ -68,7 +68,7 @@ public class TestConfigManagementService implements ConfigManagementService {
 
     }
 
-    @Override public void initialize(ConnectConfig connectConfig, Plugin plugin) {
+    @Override public void initialize(WorkerConfig connectConfig, Plugin plugin) {
 
     }
 
diff --git a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/rest/RestHandlerTest.java b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/rest/RestHandlerTest.java
index aaee4b2..85bd3ac 100644
--- a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/rest/RestHandlerTest.java
+++ b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/rest/RestHandlerTest.java
@@ -42,8 +42,8 @@ import org.apache.http.util.EntityUtils;
 import org.apache.rocketmq.client.producer.DefaultMQProducer;
 import org.apache.rocketmq.connect.runtime.controller.distributed.DistributedConnectController;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
-import org.apache.rocketmq.connect.runtime.config.RuntimeConfigDefine;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
+import org.apache.rocketmq.connect.runtime.config.ConnectorConfig;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.TransformChain;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.Worker;
 import org.apache.rocketmq.connect.runtime.connectorwrapper.WorkerConnector;
@@ -91,7 +91,7 @@ public class RestHandlerTest {
     private RestHandler restHandler;
 
     @Mock
-    private ConnectConfig connectConfig;
+    private WorkerConfig connectConfig;
 
     @Mock
     private SourceTask sourceTask;
@@ -154,12 +154,12 @@ public class RestHandlerTest {
 
         String connectName = "testConnector";
         ConnectKeyValue connectKeyValue = new ConnectKeyValue();
-        connectKeyValue.put(RuntimeConfigDefine.CONNECTOR_CLASS, "org.apache.rocketmq.connect.runtime.service.TestConnector");
-        connectKeyValue.put(RuntimeConfigDefine.SOURCE_RECORD_CONVERTER, "source-record-converter");
+        connectKeyValue.put(ConnectorConfig.CONNECTOR_CLASS, "org.apache.rocketmq.connect.runtime.service.TestConnector");
+        connectKeyValue.put(ConnectorConfig.VALUE_CONVERTER, "source-record-converter");
 
         ConnectKeyValue connectKeyValue1 = new ConnectKeyValue();
-        connectKeyValue1.put(RuntimeConfigDefine.CONNECTOR_CLASS, "org.apache.rocketmq.connect.runtime.service.TestConnector");
-        connectKeyValue1.put(RuntimeConfigDefine.SOURCE_RECORD_CONVERTER, "source-record-converter1");
+        connectKeyValue1.put(ConnectorConfig.CONNECTOR_CLASS, "org.apache.rocketmq.connect.runtime.service.TestConnector");
+        connectKeyValue1.put(ConnectorConfig.VALUE_CONVERTER, "source-record-converter1");
 
         List<ConnectKeyValue> connectKeyValues = new ArrayList<ConnectKeyValue>(8) {
             {
@@ -213,13 +213,13 @@ public class RestHandlerTest {
         RetryWithToleranceOperator retryWithToleranceOperator = ReporterManagerUtil.createRetryWithToleranceOperator(connectKeyValue);
         retryWithToleranceOperator.reporters(ReporterManagerUtil.sourceTaskReporters("testConnectorName1", connectKeyValue));
 
-        WorkerSourceTask workerSourceTask1 = new WorkerSourceTask(new ConnectConfig(),new ConnectorTaskId("testConnectorName1", 1), sourceTask,null, connectKeyValue, positionManagementServiceImpl, converter, converter, producer, workerState, connectStatsManager, connectStatsService, transformChain,retryWithToleranceOperator, null);
+        WorkerSourceTask workerSourceTask1 = new WorkerSourceTask(new WorkerConfig(),new ConnectorTaskId("testConnectorName1", 1), sourceTask,null, connectKeyValue, positionManagementServiceImpl, converter, converter, producer, workerState, connectStatsManager, connectStatsService, transformChain,retryWithToleranceOperator, null);
 
         // create retry operator
         RetryWithToleranceOperator retryWithToleranceOperator02 = ReporterManagerUtil.createRetryWithToleranceOperator(connectKeyValue);
         retryWithToleranceOperator02.reporters(ReporterManagerUtil.sourceTaskReporters("testConnectorName2", connectKeyValue));
 
-        WorkerSourceTask workerSourceTask2 = new WorkerSourceTask(new ConnectConfig(), new ConnectorTaskId("testConnectorName2", 1), sourceTask,null, connectKeyValue1, positionManagementServiceImpl, converter, converter, producer, workerState, connectStatsManager, connectStatsService, transformChain,retryWithToleranceOperator02, null);
+        WorkerSourceTask workerSourceTask2 = new WorkerSourceTask(new WorkerConfig(), new ConnectorTaskId("testConnectorName2", 1), sourceTask,null, connectKeyValue1, positionManagementServiceImpl, converter, converter, producer, workerState, connectStatsManager, connectStatsService, transformChain,retryWithToleranceOperator02, null);
         workerTasks = new HashSet<Runnable>() {
             {
                 add(workerSourceTask1);
diff --git a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/service/ConfigManagementServiceImplTest.java b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/service/ConfigManagementServiceImplTest.java
index c3f700f..97c59c1 100644
--- a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/service/ConfigManagementServiceImplTest.java
+++ b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/service/ConfigManagementServiceImplTest.java
@@ -30,8 +30,8 @@ import org.apache.rocketmq.client.producer.SendCallback;
 import org.apache.rocketmq.common.message.Message;
 import org.apache.rocketmq.connect.runtime.common.ConnAndTaskConfigs;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
-import org.apache.rocketmq.connect.runtime.config.RuntimeConfigDefine;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
+import org.apache.rocketmq.connect.runtime.config.ConnectorConfig;
 import org.apache.rocketmq.connect.runtime.store.KeyValueStore;
 import org.apache.rocketmq.connect.runtime.controller.isolation.Plugin;
 import org.apache.rocketmq.connect.runtime.utils.TestUtils;
@@ -59,7 +59,7 @@ public class ConfigManagementServiceImplTest {
     private KeyValueStore<String, List<ConnectKeyValue>> taskKeyValueStore;
     private Set<ConfigManagementService.ConnectorConfigUpdateListener> connectorConfigUpdateListener;
     private DataSynchronizer<String, ConnAndTaskConfigs> dataSynchronizer;
-    private ConnectConfig connectConfig;
+    private WorkerConfig connectConfig;
 
     @Mock
     private DefaultMQProducer producer;
@@ -81,7 +81,7 @@ public class ConfigManagementServiceImplTest {
         String consumerGroup = UUID.randomUUID().toString();
         String producerGroup = UUID.randomUUID().toString();
 
-        connectConfig = new ConnectConfig();
+        connectConfig = new WorkerConfig();
         connectConfig.setHttpPort(8081);
         connectConfig.setStorePathRootDir(System.getProperty("user.home") + File.separator + "testConnectorStore");
         connectConfig.setRmqConsumerGroup("testConsumerGroup");
@@ -95,8 +95,8 @@ public class ConfigManagementServiceImplTest {
         connectConfig.setRmqMessageConsumeTimeout(3 * 1000);
 
         connectKeyValue = new ConnectKeyValue();
-        connectKeyValue.put(RuntimeConfigDefine.CONNECTOR_CLASS, "org.apache.rocketmq.connect.runtime.connectorwrapper.testimpl.TestConnector");
-        connectKeyValue.put(RuntimeConfigDefine.SOURCE_RECORD_CONVERTER, "source-record-converter");
+        connectKeyValue.put(ConnectorConfig.CONNECTOR_CLASS, "org.apache.rocketmq.connect.runtime.connectorwrapper.testimpl.TestConnector");
+        connectKeyValue.put(ConnectorConfig.VALUE_CONVERTER, "source-record-converter");
 
         doAnswer(new Answer() {
             @Override
diff --git a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/service/PositionManagementServiceImplTest.java b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/service/PositionManagementServiceImplTest.java
index 990ec8c..1edd63f 100644
--- a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/service/PositionManagementServiceImplTest.java
+++ b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/service/PositionManagementServiceImplTest.java
@@ -35,7 +35,7 @@ import org.apache.rocketmq.client.producer.DefaultMQProducer;
 import org.apache.rocketmq.client.producer.SendCallback;
 import org.apache.rocketmq.common.message.Message;
 import org.apache.rocketmq.connect.runtime.common.ConnAndTaskConfigs;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.connect.runtime.store.ExtendRecordPartition;
 import org.apache.rocketmq.connect.runtime.store.KeyValueStore;
 import org.apache.rocketmq.connect.runtime.utils.TestUtils;
@@ -61,7 +61,7 @@ import static org.mockito.Mockito.doAnswer;
 @RunWith(MockitoJUnitRunner.class)
 public class PositionManagementServiceImplTest {
 
-    private ConnectConfig connectConfig;
+    private WorkerConfig connectConfig;
 
     @Mock
     private DefaultMQProducer producer;
@@ -87,7 +87,7 @@ public class PositionManagementServiceImplTest {
     private final String namespace = "namespace";
     @Before
     public void init() throws Exception {
-        connectConfig = new ConnectConfig();
+        connectConfig = new WorkerConfig();
         connectConfig.setHttpPort(8081);
         connectConfig.setNamesrvAddr("localhost:9876");
         connectConfig.setStorePathRootDir(System.getProperty("user.home") + File.separator + "testConnectorStore");
diff --git a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/utils/TransferUtilsTest.java b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/utils/TransferUtilsTest.java
index cd3ec7b..3c1f3af 100644
--- a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/utils/TransferUtilsTest.java
+++ b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/utils/TransferUtilsTest.java
@@ -24,7 +24,7 @@ import java.util.Map;
 import java.util.Objects;
 import org.apache.rocketmq.connect.runtime.common.ConnAndTaskConfigs;
 import org.apache.rocketmq.connect.runtime.common.ConnectKeyValue;
-import org.apache.rocketmq.connect.runtime.config.RuntimeConfigDefine;
+import org.apache.rocketmq.connect.runtime.config.ConnectorConfig;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
@@ -74,8 +74,8 @@ public class TransferUtilsTest {
     public void testToJsonStringToConnAndTaskConfigs() {
         String connectName = "testConnector";
         ConnectKeyValue connectKeyValue = new ConnectKeyValue();
-        connectKeyValue.put(RuntimeConfigDefine.CONNECTOR_CLASS, "io.openmessaging.connect.runtime.service.TestConnector");
-        connectKeyValue.put(RuntimeConfigDefine.SOURCE_RECORD_CONVERTER, "source-record-converter");
+        connectKeyValue.put(ConnectorConfig.CONNECTOR_CLASS, "io.openmessaging.connect.runtime.service.TestConnector");
+        connectKeyValue.put(ConnectorConfig.VALUE_CONVERTER, "source-record-converter");
         List<ConnectKeyValue> connectKeyValues = new ArrayList<ConnectKeyValue>(8) {
             {
                 add(connectKeyValue);
@@ -111,8 +111,8 @@ public class TransferUtilsTest {
         ConnectKeyValue connectKeyValue1 = connectorConfigs1.get(connectName);
 
         assertNotNull(connectKeyValue1);
-        assertEquals("io.openmessaging.connect.runtime.service.TestConnector", connectKeyValue1.getString(RuntimeConfigDefine.CONNECTOR_CLASS));
-        assertEquals("source-record-converter", connectKeyValue1.getString(RuntimeConfigDefine.SOURCE_RECORD_CONVERTER));
+        assertEquals("io.openmessaging.connect.runtime.service.TestConnector", connectKeyValue1.getString(ConnectorConfig.CONNECTOR_CLASS));
+        assertEquals("source-record-converter", connectKeyValue1.getString(ConnectorConfig.VALUE_CONVERTER));
 
         Map<String, List<ConnectKeyValue>> taskConfigs1 = connAndTaskConfigs1.getTaskConfigs();
         List<ConnectKeyValue> connectKeyValues1 = taskConfigs1.get(connectName);
@@ -121,8 +121,8 @@ public class TransferUtilsTest {
 
         ConnectKeyValue connectKeyValue2 = connectKeyValues1.get(0);
         assertNotNull(connectKeyValue2);
-        assertEquals("io.openmessaging.connect.runtime.service.TestConnector", connectKeyValue2.getString(RuntimeConfigDefine.CONNECTOR_CLASS));
-        assertEquals("source-record-converter", connectKeyValue2.getString(RuntimeConfigDefine.SOURCE_RECORD_CONVERTER));
+        assertEquals("io.openmessaging.connect.runtime.service.TestConnector", connectKeyValue2.getString(ConnectorConfig.CONNECTOR_CLASS));
+        assertEquals("source-record-converter", connectKeyValue2.getString(ConnectorConfig.VALUE_CONVERTER));
     }
 
 }
\ No newline at end of file
diff --git a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/utils/datasync/BrokerBasedLogTest.java b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/utils/datasync/BrokerBasedLogTest.java
index bb09fee..d71d0ef 100644
--- a/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/utils/datasync/BrokerBasedLogTest.java
+++ b/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime/utils/datasync/BrokerBasedLogTest.java
@@ -25,7 +25,7 @@ import org.apache.rocketmq.client.exception.MQClientException;
 import org.apache.rocketmq.client.producer.DefaultMQProducer;
 import org.apache.rocketmq.client.producer.SendCallback;
 import org.apache.rocketmq.common.message.Message;
-import org.apache.rocketmq.connect.runtime.config.ConnectConfig;
+import org.apache.rocketmq.connect.runtime.config.WorkerConfig;
 import org.apache.rocketmq.remoting.exception.RemotingException;
 import org.junit.Before;
 import org.junit.Test;
@@ -62,14 +62,14 @@ public class BrokerBasedLogTest {
     @Mock
     private Converter converter;
 
-    private ConnectConfig connectConfig;
+    private WorkerConfig connectConfig;
 
     @Before
     public void init() throws IllegalAccessException, NoSuchFieldException {
         topicName = "testTopicName";
         consumerGroup = "testConsumerGroup1";
         producerGroup = "testProducerGroup1";
-        connectConfig = new ConnectConfig();
+        connectConfig = new WorkerConfig();
         connectConfig.setRmqConsumerGroup(consumerGroup);
         connectConfig.setRmqProducerGroup(producerGroup);
         connectConfig.setNamesrvAddr("127.0.0.1:9876");
diff --git a/rocketmq-connect-sample/src/main/java/org/apache/rocketmq/connect/file/FilterTransform.java b/rocketmq-connect-sample/src/main/java/org/apache/rocketmq/connect/file/FilterTransform.java
index ffd0b29..7c34705 100644
--- a/rocketmq-connect-sample/src/main/java/org/apache/rocketmq/connect/file/FilterTransform.java
+++ b/rocketmq-connect-sample/src/main/java/org/apache/rocketmq/connect/file/FilterTransform.java
@@ -23,7 +23,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class FilterTransform implements Transform<ConnectRecord> {
-
     private static final Logger log = LoggerFactory.getLogger(LoggerName.FILE_CONNECTOR);
 
     private KeyValue keyValue;