You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@eventmesh.apache.org by mi...@apache.org on 2024/05/31 09:03:51 UTC

(eventmesh) branch master updated: Merge EventMesh function branch to master (#4941)

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

mikexue pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/eventmesh.git


The following commit(s) were added to refs/heads/master by this push:
     new f7a9517bf Merge EventMesh function branch to master (#4941)
f7a9517bf is described below

commit f7a9517bf47c0e2319973e31f57361428dd571bf
Author: mike_xwm <mi...@126.com>
AuthorDate: Fri May 31 17:03:45 2024 +0800

    Merge EventMesh function branch to master (#4941)
    
    * EventMesh function admin (#4851)
    
    * own
    
    * dependency
    
    * finish registry
    
    * EventMesh function admin (#4853)
    
    * own
    
    * dependency
    
    * finish registry
    
    * init
    
    * Eventmesh function admin (#4854)
    
    * own
    
    * dependency
    
    * finish registry
    
    * init
    
    * 0419
    
    * 0419
    
    * more discovery and move gRPC
    
    * fix dependency
    
    * EventMesh function connector runtime (#4858)
    
    * [ISSUE #4812] Set up Admin Endpoints v2 (#4813)
    
    * Remove redundant overloaded methods
    
    * Simplify write() result param
    
    * Add writeJson(); Add PUT; Add JavaDoc
    
    * Rename EventHttpHandler to EventMeshHttpHandler
    
    * Correct server thread name
    
    * Clean up messy & non-hierarchical overloading
    
    * No need to set headers manually any more
    
    * Set up v1&v2 endpoints
    
    * Set up v1&v2 response dto
    
    * Introduce fastjson2
    
    * Fix fastjson2 "level too large : 2048" error caused by IPAddress
    
    * Correct @ConfigField naming
    
    * Return properties format json key
    
    * Add format option to query string
    
    * Introduce Result
    
    * Reduce duplicate builder code
    
    * Fix all checkstyle warnings in eventmesh-runtime
    
    * Add known dependency
    
    * [ISSUE #4814] Migrate from fastjson 1.2.83 to fastjson2 (#4819)
    
    * [Enhancement] Migrate from fastjson 1.2.83 to fastjson2 #4814
    
    * fix_dependencies_problem
    
    * fix_check
    
    * [ISSUE #4551] modify the logic of time-consumption statistics (#4822)
    
    * init connector runtime v2
    
    * [ISSUE #4804] Fix SubStreamHandler exception loop by closeOnError (#4807)
    
    * Handle exception loop by closeOnError
    
    * Lombok optimization
    
    * some format optimization
    
    * Avoid closing multiple times
    
    * Remove redundant set null
    
    * Revert "Avoid closing multiple times"
    
    This reverts commit 774397fcae4905dc0ec8230eab18bf655f202e8f.
    
    * Use synchronized latch to keep senderOnComplete called once
    
    * Use boolean to prevent latch called by somebody else
    
    * Remove the unique callee/caller close() of onCompleted()
    
    * [ISSUE #4838] Deprecate unused `eventMesh.connector.plugin.type` etc. properties (#4839)
    
    * Remove all references of `eventMesh.connector.plugin.type`
    
    * Deprecate `eventMesh.connector.plugin.type` and sort properties
    
    * Remove misconfigured & not-used `registerIntervalInMills`, `fetchRegistryAddrIntervalInMills`
    
    * Remove 'defibus' related un-used usages
    
    * Supplement https://github.com/apache/eventmesh/pull/4809 for `null != object`
    
    * [ISSUE #4832] Downgrade stale bot to v8 to resolve state cache reserving error (#4833)
    
    * Revert stale bot to v8 to resolve state cache reserving error
    
    * Reduce operations-per-run to default value to ease pressure
    
    * Unify yaml to yml
    
    * [ISSUE #4820] Bug fix EventHandler not return json (#4821)
    
    * bug fix
    
    * bug fix
    
    * bug fix
    
    * update runtime v2
    
    * update connector runtime
    
    * update connector runtime
    
    * update connector runtime
    
    * update connector runtime
    
    * update connector runtime
    
    ---------
    
    Co-authored-by: Pil0tXia <xi...@apache.org>
    Co-authored-by: Zaki <91...@users.noreply.github.com>
    Co-authored-by: Karson <ka...@hotmail.com>
    
    * [ISSUE #4931]Add Registry Module for Discovery AdminServer
    
    * [ISSUES #4933]Add Admin Module
    
    * [ISSUE #4935] Add and Move the Pojo Used By Both Runtime and Admin to Common
    
    * [ISSUE #4937]fix gradle dependecy and add runtime v2
    
    * [ISSUES #4939]add canal connector
    
    * fix missing apache header
    
    * fix missing apache header
    
    * fix missing apache header
    
    * update gradle dependencies
    
    * fix admin server ci check error
    
    * fix admin server ci check error
    
    * fix ci checkStyle error
    
    * fix ci check error
    
    ---------
    
    Co-authored-by: sodaRyCN <35...@users.noreply.github.com>
    Co-authored-by: Pil0tXia <xi...@apache.org>
    Co-authored-by: Zaki <91...@users.noreply.github.com>
    Co-authored-by: Karson <ka...@hotmail.com>
---
 .github/workflows/docker.yml                       |   2 +-
 .idea/icon.png                                     | Bin 14821 -> 0 bytes
 build.gradle                                       |  14 +-
 eventmesh-admin-server/.gitignore                  |  42 +
 eventmesh-admin-server/build.gradle                |  48 +
 .../gradle.properties                              |  36 +-
 .../org/apache/eventmesh/admin/server/Admin.java   |  34 +-
 .../apache/eventmesh/admin/server/AdminServer.java | 125 +++
 .../admin/server/AdminServerProperties.java        |  21 +-
 .../admin/server/AdminServerRuntimeException.java  |  15 +-
 .../eventmesh/admin/server/ComponentLifeCycle.java |  13 +-
 .../eventmesh/admin/server/ExampleAdminServer.java |  17 +-
 .../server/constatns/AdminServerConstants.java     |  20 +-
 .../admin/server/web/AdminGrpcServer.java          | 103 +++
 .../eventmesh/admin/server/web/BaseServer.java     |  50 ++
 .../eventmesh/admin/server/web/GrpcServer.java     |  73 ++
 .../eventmesh/admin/server/web/HttpServer.java     |  15 +-
 .../apache/eventmesh/admin/server/web/Request.java |  29 +-
 .../eventmesh/admin/server/web/Response.java       |  39 +-
 .../admin/server/web/ServerController.java         |  13 +-
 .../admin/server/web/db/DBThreadPool.java          |  60 ++
 .../server/web/db/entity/EventMeshDataSource.java  |  35 +-
 .../server/web/db/entity/EventMeshJobDetail.java   |  26 +-
 .../server/web/db/entity/EventMeshJobInfo.java     |  48 +-
 .../web/db/entity/EventMeshMysqlPosition.java      |  32 +-
 .../entity/EventMeshPositionReporterHistory.java   |  32 +-
 .../web/db/entity/EventMeshRuntimeHeartbeat.java   |  33 +-
 .../web/db/entity/EventMeshRuntimeHistory.java     |  30 +-
 .../web/db/mapper/EventMeshDataSourceMapper.java   |  23 +-
 .../web/db/mapper/EventMeshJobInfoMapper.java      |  23 +-
 .../db/mapper/EventMeshMysqlPositionMapper.java    |  22 +-
 .../EventMeshPositionReporterHistoryMapper.java    |  23 +-
 .../db/mapper/EventMeshRuntimeHeartbeatMapper.java |  23 +-
 .../db/mapper/EventMeshRuntimeHistoryMapper.java   |  23 +-
 .../web/db/service/EventMeshDataSourceService.java |  17 +-
 .../web/db/service/EventMeshJobInfoService.java    |  17 +-
 .../db/service/EventMeshMysqlPositionService.java  |  17 +-
 .../EventMeshPositionReporterHistoryService.java   |  16 +-
 .../service/EventMeshRuntimeHeartbeatService.java  |  14 +-
 .../db/service/EventMeshRuntimeHistoryService.java |  14 +-
 .../impl/EventMeshDataSourceServiceImpl.java       |  25 +-
 .../service/impl/EventMeshJobInfoServiceImpl.java  |  28 +-
 .../impl/EventMeshMysqlPositionServiceImpl.java    |  27 +-
 ...ventMeshPositionReporterHistoryServiceImpl.java |  24 +-
 .../impl/EventMeshRuntimeHeartbeatServiceImpl.java |  27 +-
 .../impl/EventMeshRuntimeHistoryServiceImpl.java   |  25 +-
 .../server/web/handler/BaseRequestHandler.java     |  17 +-
 .../server/web/handler/RequestHandlerFactory.java  |  65 ++
 .../web/handler/impl/FetchJobRequestHandler.java   |  71 ++
 .../web/handler/impl/FetchPositionHandler.java     |  56 ++
 .../web/handler/impl/ReportHeartBeatHandler.java   |  70 ++
 .../web/handler/impl/ReportPositionHandler.java    | 102 +++
 .../EventMeshRuntimeHeartbeatBizService.java       |  81 ++
 .../service/job/EventMeshJobInfoBizService.java    | 133 +++
 .../position/EventMeshPositionBizService.java      |  81 ++
 .../service/position/IFetchPositionHandler.java    |  16 +-
 .../service/position/IReportPositionHandler.java   |  15 +-
 .../web/service/position/PositionHandler.java      |  11 +-
 .../service/position/PositionHandlerFactory.java   |  56 ++
 .../position/impl/MysqlPositionHandler.java        | 161 ++++
 .../src/main/resources/META-INF/spring.factories   |  35 +-
 .../src/main/resources/application.yaml            |  48 +-
 .../src/main/resources/eventmesh-admin.properties  |  35 +-
 .../src/main/resources/eventmesh.sql               | 131 +++
 .../resources/mapper/EventMeshDataSourceMapper.xml |  39 +
 .../resources/mapper/EventMeshJobInfoMapper.xml    |  43 +
 .../mapper/EventMeshMysqlPositionMapper.xml        |  39 +
 .../EventMeshPositionReporterHistoryMapper.xml     |  35 +
 .../mapper/EventMeshRuntimeHeartbeatMapper.xml     |  38 +
 .../mapper/EventMeshRuntimeHistoryMapper.xml       |  34 +
 .../org/apache/eventmesh/common/Constants.java     |   2 +
 .../common/config/CommonConfiguration.java         |  15 +
 .../eventmesh/common/config/ConfigService.java     |   3 +
 .../apache/eventmesh/common/config/FileLoad.java   |   1 +
 .../eventmesh/common/config/connector}/Config.java |   2 +-
 .../common/config/connector}/Constants.java        |   2 +-
 .../common/config/connector}/PubSubConfig.java     |   2 +-
 .../common/config/connector}/SinkConfig.java       |   2 +-
 .../common/config/connector}/SourceConfig.java     |   4 +-
 .../connector/dingtalk}/DingDingSinkConfig.java    |   4 +-
 .../connector/dingtalk}/SinkConnectorConfig.java   |   2 +-
 .../config/connector/file}/FileSinkConfig.java     |   4 +-
 .../config/connector/file}/FileSourceConfig.java   |   4 +-
 .../connector/file}/SinkConnectorConfig.java       |   2 +-
 .../connector/file}/SourceConnectorConfig.java     |   2 +-
 .../config/connector/http}/HttpSourceConfig.java   |   4 +-
 .../connector/http}/SourceConnectorConfig.java     |   2 +-
 .../connector/knative}/KnativeSinkConfig.java      |   4 +-
 .../connector/knative}/KnativeSourceConfig.java    |   4 +-
 .../connector/knative}/SinkConnectorConfig.java    |   2 +-
 .../connector/knative}/SourceConnectorConfig.java  |   2 +-
 .../config/connector/lark}/LarkSinkConfig.java     |   4 +-
 .../connector/lark}/SinkConnectorConfig.java       |  26 +-
 .../config/connector/mq/kafka/KafkaSinkConfig.java |   8 +-
 .../connector/mq/kafka/KafkaSourceConfig.java      |   8 +-
 .../connector/mq/kafka}/SinkConnectorConfig.java   |   2 +-
 .../connector/mq/kafka}/SourceConnectorConfig.java |   2 +-
 .../connector/mq/pulsar/PulsarSinkConfig.java      |   8 +-
 .../connector/mq/pulsar/PulsarSourceConfig.java    |   8 +-
 .../connector/mq/pulsar}/SinkConnectorConfig.java  |   2 +-
 .../mq/pulsar}/SourceConnectorConfig.java          |   2 +-
 .../connector/mq/rabbitmq}/RabbitMQSinkConfig.java |   4 +-
 .../mq/rabbitmq}/RabbitMQSourceConfig.java         |   4 +-
 .../mq/rabbitmq}/SinkConnectorConfig.java          |   6 +-
 .../mq/rabbitmq}/SourceConnectorConfig.java        |   6 +-
 .../connector/mq/rocketmq}/RocketMQSinkConfig.java |   4 +-
 .../mq/rocketmq}/RocketMQSourceConfig.java         |   4 +-
 .../mq/rocketmq}/SinkConnectorConfig.java          |   2 +-
 .../mq/rocketmq}/SourceConnectorConfig.java        |   2 +-
 .../connector/offset}/OffsetStorageConfig.java     |   8 +-
 .../openfunction}/OpenFunctionSinkConfig.java      |   4 +-
 .../openfunction}/OpenFunctionSourceConfig.java    |   4 +-
 .../openfunction}/SinkConnectorConfig.java         |   2 +-
 .../openfunction}/SourceConnectorConfig.java       |   2 +-
 .../connector/pravega}/PravegaSinkConfig.java      |   4 +-
 .../connector/pravega}/PravegaSourceConfig.java    |   4 +-
 .../connector/pravega}/SinkConnectorConfig.java    |   2 +-
 .../connector/pravega}/SourceConnectorConfig.java  |   2 +-
 .../prometheus}/PrometheusSourceConfig.java        |   4 +-
 .../prometheus}/SourceConnectorConfig.java         |   2 +-
 .../connector/rdb/canal/CanalSinkConfig.java       |  17 +-
 .../connector/rdb/canal/CanalSourceConfig.java     |  80 ++
 .../connector/rdb/canal}/SinkConnectorConfig.java  |  19 +-
 .../rdb/canal}/SourceConnectorConfig.java          |  19 +-
 .../config/connector/rdb/jdbc}/JdbcConfig.java     |   2 +-
 .../config/connector/rdb/jdbc}/JdbcSinkConfig.java |   4 +-
 .../connector/rdb/jdbc}/JdbcSourceConfig.java      |   4 +-
 .../config/connector/rdb/jdbc}/MysqlConfig.java    |   2 +-
 .../connector/rdb/jdbc}/SinkConnectorConfig.java   |   4 +-
 .../connector/rdb/jdbc}/SourceConnectorConfig.java |   4 +-
 .../connector/rdb/mongodb/MongodbSinkConfig.java   |   8 +-
 .../connector/rdb/mongodb/MongodbSourceConfig.java |   8 +-
 .../rdb/mongodb}/SinkConnectorConfig.java          |   2 +-
 .../rdb/mongodb}/SourceConnectorConfig.java        |   2 +-
 .../config/connector/redis/RedisSinkConfig.java    |   8 +-
 .../config/connector/redis/RedisSourceConfig.java  |   9 +-
 .../connector/redis}/SinkConnectorConfig.java      |   2 +-
 .../connector/redis}/SourceConnectorConfig.java    |   2 +-
 .../config/connector/s3}/S3SourceConfig.java       |   6 +-
 .../connector/s3}/SourceConnectorConfig.java       |   2 +-
 .../connector/slack}/SinkConnectorConfig.java      |   2 +-
 .../config/connector/slack}/SlackSinkConfig.java   |   4 +-
 .../connector/spring}/SinkConnectorConfig.java     |   2 +-
 .../connector/spring}/SourceConnectorConfig.java   |   2 +-
 .../config/connector/spring/SpringSinkConfig.java  |   6 +-
 .../connector/spring}/SpringSourceConfig.java      |   5 +-
 .../connector/wechat}/SinkConnectorConfig.java     |   2 +-
 .../config/connector/wechat}/WeChatSinkConfig.java |   4 +-
 .../connector/wecom}/SinkConnectorConfig.java      |   2 +-
 .../config/connector/wecom}/WeComSinkConfig.java   |   4 +-
 .../eventmesh/common/enums/ComponentType.java      |  18 +-
 .../grpc/adminserver/AdminServiceGrpc.java         | 373 ++++++++
 .../grpc/adminserver/EventMeshAdminService.java    |  99 +++
 .../common/protocol/grpc/adminserver/Metadata.java | 962 +++++++++++++++++++++
 .../grpc/adminserver/MetadataOrBuilder.java        |  78 ++
 .../common/protocol/grpc/adminserver/Payload.java  | 893 +++++++++++++++++++
 .../grpc/adminserver/PayloadOrBuilder.java         |  62 ++
 .../grpc/proto/event_mesh_admin_service.proto      |  27 +-
 .../org/apache/eventmesh/common/remote/Job.java    |   8 +-
 .../apache/eventmesh/common/remote/JobState.java   |  17 +-
 .../apache/eventmesh/common/remote/JobType.java    |   7 +-
 .../org/apache/eventmesh/common/remote/Task.java   |  30 +-
 .../common/remote/exception/ErrorCode.java         |  22 +-
 .../remote/exception/PayloadFormatException.java   |  13 +-
 .../remote/exception/RemoteRuntimeException.java   |  15 +-
 .../common/remote/job/DataSourceClassify.java      |   8 +-
 .../common/remote/job/DataSourceDriverType.java    |   7 +-
 .../common/remote/job/DataSourceType.java          |  54 ++
 .../common/remote/job/JobTransportType.java        |  68 ++
 .../common/remote/job/SyncConsistency.java         |  69 ++
 .../eventmesh/common/remote/job/SyncMode.java      |  54 +-
 .../common/remote/offset/RecordOffset.java         |  11 +-
 .../common/remote/offset/RecordPartition.java      |  11 +-
 .../common/remote/offset/RecordPosition.java       | 128 +++
 .../common/remote/offset/S3/S3RecordOffset.java    |  20 +-
 .../common/remote/offset/S3/S3RecordPartition.java |  43 +-
 .../remote/offset/canal/CanalRecordOffset.java     |  20 +-
 .../remote/offset/canal/CanalRecordPartition.java  |  37 +-
 .../remote/offset/file/FileRecordOffset.java       |  20 +-
 .../remote/offset/file/FileRecordPartition.java    |  38 +-
 .../remote/offset/http/HttpRecordOffset.java       |  22 +-
 .../remote/offset/http/HttpRecordPartition.java    |  23 +-
 .../remote/offset/jdbc/JdbcRecordOffset.java       |  20 +-
 .../remote/offset/jdbc/JdbcRecordPartition.java    |  38 +-
 .../remote/offset/kafka/KafkaRecordOffset.java     |  20 +-
 .../remote/offset/kafka/KafkaRecordPartition.java  |  40 +-
 .../offset/prometheus/PrometheusRecordOffset.java  |  20 +-
 .../prometheus/PrometheusRecordPartition.java      |  23 +-
 .../remote/offset/pulsar/PulsarRecordOffset.java   |  25 +-
 .../offset/pulsar/PulsarRecordPartition.java       |  42 +-
 .../offset/rocketmq/RocketMQRecordOffset.java      |  25 +-
 .../offset/rocketmq/RocketMQRecordPartition.java   |  48 +-
 .../remote/offset/spring/SpringRecordOffset.java   |  20 +-
 .../offset/spring/SpringRecordPartition.java       |  23 +-
 .../eventmesh/common/remote/payload/IPayload.java  |   8 +-
 .../common/remote/payload/PayloadFactory.java      |  71 ++
 .../common/remote/payload/PayloadUtil.java         |  46 +
 .../common/remote/request/BaseRemoteRequest.java   |  48 +-
 .../common/remote/request/FetchJobRequest.java     |   8 +-
 .../remote/request/FetchPositionRequest.java       |  17 +-
 .../remote/request/ReportHeartBeatRequest.java     |  11 +-
 .../remote/request/ReportPositionRequest.java      |  21 +-
 .../common/remote/response/BaseRemoteResponse.java |  60 +-
 .../common/remote/response/EmptyAckResponse.java   |  12 +-
 .../common/remote/response/FailResponse.java       |  34 +-
 .../common/remote/response/FetchJobResponse.java   |  67 ++
 .../remote/response/FetchPositionResponse.java     |  53 ++
 .../org/apache/eventmesh/common/utils/IPUtils.java |   6 +-
 .../apache/eventmesh/common/utils/JsonUtils.java   |  19 +-
 .../apache/eventmesh/common/utils/PagedList.java}  |  54 +-
 ...apache.eventmesh.common.remote.payload.IPayload |  41 +-
 .../loadbalance/RandomLoadBalanceSelectorTest.java |   2 +-
 .../apache/eventmesh/common/utils/IPUtilsTest.java |   7 -
 .../eventmesh-connector-canal}/build.gradle        |  22 +-
 .../eventmesh-connector-canal/gradle.properties    |  37 +-
 .../connector/canal/ByteArrayConverter.java        |  69 ++
 .../connector/canal/CanalConnectRecord.java        | 275 ++++++
 .../connector/canal/DatabaseConnection.java        |  85 ++
 .../connector/canal/SqlTimestampConverter.java     | 155 ++++
 .../apache/eventmesh/connector/canal/SqlUtils.java | 296 +++++++
 .../connector/canal/config/CanalServerConfig.java} |   6 +-
 .../connector/canal/dialect/AbstractDbDialect.java | 110 +++
 .../connector/canal/dialect/DbDialect.java         |  64 ++
 .../connector/canal/dialect/MysqlDialect.java      |  81 ++
 .../interceptor/SqlBuilderLoadInterceptor.java     | 139 +++
 .../connector/canal/model/EventColumn.java         | 163 ++++
 .../canal/model/EventColumnIndexComparable.java}   |  12 +-
 .../eventmesh/connector/canal/model/EventType.java | 156 ++++
 .../connector/canal/server/CanalConnectServer.java |  45 +
 .../connector/canal/sink/DbLoadContext.java}       |  43 +-
 .../eventmesh/connector/canal/sink/DbLoadData.java | 135 +++
 .../connector/canal/sink/DbLoadMerger.java         | 280 ++++++
 .../canal/sink/connector/CanalSinkConnector.java   | 616 +++++++++++++
 .../connector/canal/source/EntryParser.java        | 278 ++++++
 .../source/connector/CanalSourceConnector.java     | 313 +++++++
 .../canal/template/AbstractSqlTemplate.java        | 117 +++
 .../connector/canal/template/MysqlSqlTemplate.java |  80 ++
 .../connector/canal/template/SqlTemplate.java}     |  25 +-
 ...ventmesh.openconnect.api.ConnectorCreateService |  35 +-
 .../src/main/resources/server-config.yml           |  35 +-
 .../src/main/resources/sink-config.yml             |  46 +-
 .../src/main/resources/source-config.yml           |  56 +-
 .../src/test/resources/sink-config.yml             |  46 +-
 .../src/test/resources/source-config.yml           |  56 +-
 .../chatgpt/config/ChatGPTServerConfig.java        |   2 +-
 .../chatgpt/source/config/ChatGPTSourceConfig.java |   2 +-
 .../source/connector/ChatGPTSourceConnector.java   |   2 +-
 .../config/DingDingConnectServerConfig.java        |   2 +-
 .../sink/connector/DingDingSinkConnector.java      |   4 +-
 .../sink/connector/DingDingSinkConnectorTest.java  |   8 +-
 .../eventmesh-connector-file/build.gradle          |   1 +
 .../connector/file/config/FileServerConfig.java    |   2 +-
 .../file/sink/connector/FileSinkConnector.java     |   4 +-
 .../file/source/connector/FileSourceConnector.java |  15 +-
 .../connector/file/FileSourceConnectorTest.java    |   4 +-
 .../connector/http/config/HttpServerConfig.java    |   2 +-
 .../connector/http/sink/HttpSinkConnector.java     |   2 +-
 .../connector/http/sink/config/HttpSinkConfig.java |   2 +-
 .../http/sink/data/HttpConnectRecord.java          |   7 +-
 .../http/sink/handle/CommonHttpSinkHandler.java    |   3 +-
 .../http/source/connector/HttpSourceConnector.java |   4 +-
 .../source/connector/HttpSinkConnectorTest.java    |  12 +-
 .../source/connector/HttpSourceConnectorTest.java  |   4 +-
 .../connector/jdbc/config/JdbcServerConfig.java    |   3 +-
 .../connector/jdbc/connection/JdbcConnection.java  |   2 +-
 .../jdbc/connection/mysql/MysqlJdbcConnection.java |   2 +-
 .../dialect/AbstractGeneralDatabaseDialect.java    |   2 +-
 .../jdbc/dialect/DatabaseDialectFactory.java       |   2 +-
 .../jdbc/dialect/mysql/MysqlDatabaseDialect.java   |   2 +-
 .../dialect/mysql/MysqlDatabaseDialectFactory.java |   2 +-
 .../connector/jdbc/sink/JdbcSinkConnector.java     |   6 +-
 .../jdbc/sink/handle/DefaultSinkRecordHandler.java |   2 +-
 .../connector/jdbc/source/AbstractEngine.java      |   4 +-
 .../jdbc/source/AbstractJdbcTaskManager.java       |   2 +-
 .../connector/jdbc/source/JdbcSourceConnector.java |   6 +-
 .../jdbc/source/SourceJdbcTaskManager.java         |  12 +-
 .../dialect/antlr4/mysql/MysqlAntlr4DdlParser.java |   4 +-
 .../listener/CreateDatabaseParserListener.java     |   2 +-
 .../mysql/listener/CreateTableParserListener.java  |   2 +-
 .../mysql/listener/DropDatabaseParserListener.java |   2 +-
 .../jdbc/source/dialect/cdc/AbstractCdcEngine.java |   6 +-
 .../jdbc/source/dialect/cdc/CdcEngineFactory.java  |   2 +-
 .../source/dialect/cdc/mysql/MysqlCdcEngine.java   |   8 +-
 .../dialect/cdc/mysql/MysqlCdcEngineFactory.java   |   2 +-
 .../source/dialect/mysql/MysqlJdbcContext.java     |   4 +-
 .../dialect/snapshot/AbstractSnapshotEngine.java   |   2 +-
 .../dialect/snapshot/SnapshotEngineFactory.java    |   2 +-
 .../snapshot/mysql/MysqlSnapshotEngine.java        |   4 +-
 .../snapshot/mysql/MysqlSnapshotEngineFactory.java |   2 +-
 .../eventmesh-connector-kafka/build.gradle         |   1 +
 .../connector/kafka/config/KafkaServerConfig.java  |   2 +-
 .../kafka/sink/connector/KafkaSinkConnector.java   |   4 +-
 .../kafka/source/config/KafkaSourceConfig.java     |  28 -
 .../source/connector/KafkaSourceConnector.java     |  26 +-
 .../knative/config/KnativeServerConfig.java        |   2 +-
 .../sink/connector/KnativeSinkConnector.java       |   4 +-
 .../source/connector/KnativeSourceConnector.java   |   4 +-
 .../SinkConnectorConfig.java => ConfigUtils.java}  |  51 +-
 .../lark/config/LarkConnectServerConfig.java       |   2 +-
 .../connector/lark/sink/ImServiceHandler.java      |   2 +-
 .../lark/sink/connector/LarkSinkConnector.java     |   9 +-
 .../connector/lark/sink/ImServiceHandlerTest.java  |  16 +-
 .../connector/lark/sink/LarkSinkConnectorTest.java |   8 +-
 .../mongodb/config/MongodbServerConfig.java        |   4 +-
 .../sink/client/MongodbReplicaSetSinkClient.java   |   2 +-
 .../sink/client/MongodbStandaloneSinkClient.java   |   2 +-
 .../mongodb/sink/config/MongodbSinkConfig.java     |  28 -
 .../sink/connector/MongodbSinkConnector.java       |   4 +-
 .../client/MongodbReplicaSetSourceClient.java      |   2 +-
 .../client/MongodbStandaloneSourceClient.java      |   2 +-
 .../mongodb/source/config/MongodbSourceConfig.java |  28 -
 .../source/connector/MongodbSourceConnector.java   |   4 +-
 .../config/OpenFunctionServerConfig.java           |   2 +-
 .../sink/connector/OpenFunctionSinkConnector.java  |   4 +-
 .../connector/OpenFunctionSourceConnector.java     |   4 +-
 .../connector/OpenFunctionSinkConnectorTest.java   |   8 +-
 .../connector/OpenFunctionSourceConnectorTest.java |   8 +-
 .../pravega/config/PravegaServerConfig.java        |   2 +-
 .../sink/connector/PravegaSinkConnector.java       |   4 +-
 .../source/connector/PravegaSourceConnector.java   |   4 +-
 .../eventmesh-connector-prometheus/build.gradle    |   1 +
 .../prometheus/config/PrometheusServerConfig.java  |   2 +-
 .../connector/PrometheusSourceConnector.java       |  14 +-
 .../eventmesh-connector-pulsar/build.gradle        |   1 +
 .../pulsar/config/PulsarServerConfig.java          |   2 +-
 .../pulsar/sink/config/PulsarSinkConfig.java       |  29 -
 .../pulsar/sink/connector/PulsarSinkConnector.java |   4 +-
 .../pulsar/source/config/PulsarSourceConfig.java   |  28 -
 .../source/connector/PulsarSourceConnector.java    |  15 +-
 .../rabbitmq/config/RabbitMQServerConfig.java      |   6 +-
 .../sink/connector/RabbitMQSinkConnector.java      |   8 +-
 .../source/connector/RabbitMQSourceConnector.java  |  10 +-
 .../eventmesh-connector-redis/build.gradle         |   1 +
 .../connector/redis/config/RedisServerConfig.java  |   2 +-
 .../redis/sink/config/RedisSinkConfig.java         |  29 -
 .../redis/sink/connector/RedisSinkConnector.java   |   4 +-
 .../redis/source/config/RedisSourceConfig.java     |  29 -
 .../source/connector/RedisSourceConnector.java     |   4 +-
 .../sink/connector/RedisSinkConnectorTest.java     |   8 +-
 .../source/connector/RedisSourceConnectorTest.java |   8 +-
 .../rocketmq/config/RocketMQServerConfig.java      |   2 +-
 .../sink/connector/RocketMQSinkConnector.java      |  12 +-
 .../source/connector/RocketMQSourceConnector.java  |  60 +-
 .../sink/connector/RocketMQSinkConnectorTest.java  |   8 +-
 .../connector/RocketMQSourceConnectorTest.java     |   2 +-
 .../eventmesh-connector-s3/build.gradle            |   1 +
 .../connector/s3/config/S3ServerConfig.java        |   2 +-
 .../s3/source/connector/S3SourceConnector.java     |  30 +-
 .../connector/s3/source/S3SourceConnectorTest.java |   4 +-
 .../slack/config/SlackConnectServerConfig.java     |   2 +-
 .../slack/sink/connector/SlackSinkConnector.java   |   4 +-
 .../sink/connector/SlackSinkConnectorTest.java     |   8 +-
 .../spring/config/SpringConnectServerConfig.java   |   2 +-
 .../spring/sink/config/SpringSinkConfig.java       |  31 -
 .../spring/sink/connector/SpringSinkConnector.java |   4 +-
 .../source/connector/SpringSourceConnector.java    |  18 +-
 .../sink/connector/SpringSinkConnectorTest.java    |   8 +-
 .../connector/SpringSourceConnectorTest.java       |   2 +-
 .../wechat/config/WeChatConnectServerConfig.java   |   2 +-
 .../wechat/sink/connector/WeChatSinkConnector.java |   4 +-
 .../sink/connector/WeChatSinkConnectorTest.java    |  12 +-
 .../wecom/config/WeComConnectServerConfig.java     |   2 +-
 .../wecom/sink/connector/WeComSinkConnector.java   |   4 +-
 .../wecom/connector/MockRecordOffset.java}         |  14 +-
 .../wecom/connector/MockRecordPartition.java}      |  17 +-
 .../wecom/connector/WeComSinkConnectorTest.java    |  19 +-
 .../apache/eventmesh/openconnect/Application.java  |   6 +-
 .../apache/eventmesh/openconnect/SinkWorker.java   |   2 +-
 .../apache/eventmesh/openconnect/SourceWorker.java |   8 +-
 .../openconnect/api/connector/Connector.java       |   2 +-
 .../openconnect/api/connector/SinkConnector.java   |   2 +-
 .../api/connector/SinkConnectorContext.java        |   2 +-
 .../openconnect/api/connector/SourceConnector.java |   2 +-
 .../api/connector/SourceConnectorContext.java      |   2 +-
 .../api/factory/ConnectorPluginFactory.java        |  25 +-
 .../eventmesh/openconnect/util/ConfigUtil.java     |  14 +-
 .../build.gradle                                   |  15 +-
 .../gradle.properties                              |  36 +-
 .../offsetmgmt/admin/AdminOffsetService.java       | 270 ++++++
 ....offsetmgmt.api.storage.OffsetManagementService |  36 +-
 .../build.gradle                                   |   1 +
 .../offsetmgmt/api/data/ConnectRecord.java         |  14 +-
 .../api/data/RecordOffsetManagement.java           |  19 +-
 .../DefaultOffsetManagementServiceImpl.java        |  15 +-
 .../api/storage/OffsetManagementService.java       |  21 +-
 .../api/storage/OffsetStorageReader.java           |   4 +-
 .../api/storage/OffsetStorageReaderImpl.java       |  19 +-
 .../api/storage/OffsetStorageWriter.java           |   4 +-
 .../api/storage/OffsetStorageWriterImpl.java       |  18 +-
 .../offsetmgmt/nacos/NacosConfigService.java       |  55 +-
 eventmesh-registry/.gitignore                      |  42 +
 .../Config.java => eventmesh-registry/build.gradle |   7 +-
 .../eventmesh-registry-api}/build.gradle           |   6 +-
 .../org/apache/eventmesh/registry/NotifyEvent.java |  33 +-
 .../apache/eventmesh/registry/QueryInstances.java  |  13 +-
 .../eventmesh/registry/RegisterServerInfo.java     |  72 ++
 .../apache/eventmesh/registry/RegistryFactory.java |  47 +
 .../eventmesh/registry/RegistryListener.java       |  13 +-
 .../apache/eventmesh/registry/RegistryService.java |  31 +-
 .../registry/exception/RegistryException.java      |  16 +-
 .../eventmesh-registry-nacos}/build.gradle         |   6 +-
 .../registry/nacos/NacosDiscoveryService.java      | 312 +++++++
 .../registry/nacos/NacosRegistryConfiguration.java |  62 ++
 .../org.apache.eventmesh.registry.RegistryService  |  36 +-
 eventmesh-runtime-v2/build.gradle                  |  50 ++
 .../java/org/apache/eventmesh/runtime/Runtime.java |  59 +-
 .../apache/eventmesh/runtime/RuntimeFactory.java   |  57 +-
 .../eventmesh/runtime/RuntimeInstanceConfig.java   | 109 +--
 .../eventmesh/runtime/boot/RuntimeInstance.java    | 146 ++++
 .../runtime/boot/RuntimeInstanceStarter.java       |  55 ++
 .../runtime/connector/ConnectorRuntime.java        | 426 +++++++++
 .../runtime/connector/ConnectorRuntimeConfig.java  |  80 +-
 .../runtime/connector/ConnectorRuntimeFactory.java |  71 +-
 .../runtime/function/FunctionRuntime.java          |  68 +-
 .../runtime/function/FunctionRuntimeConfig.java    |  42 +-
 .../runtime/function/FunctionRuntimeFactory.java   |  72 +-
 .../runtime/manager/ConnectorManager.java          |  42 +-
 .../eventmesh/runtime/manager/FunctionManager.java |  42 +-
 .../eventmesh/runtime/manager/MeshManager.java     |  42 +-
 .../apache/eventmesh/runtime/mesh/MeshRuntime.java |  74 +-
 .../eventmesh/runtime/mesh/MeshRuntimeConfig.java  |  42 +-
 .../eventmesh/runtime/mesh/MeshRuntimeFactory.java |  72 +-
 .../apache/eventmesh/runtime/meta/MetaStorage.java | 148 ++++
 .../apache/eventmesh/runtime/util/BannerUtil.java  |  69 ++
 .../eventmesh/runtime/util/RuntimeUtils.java       |   4 +-
 .../src/main/resources/connector.yaml              |  34 +-
 .../src/main/resources/runtime.yaml                |  38 +-
 .../runtime/admin/handler/AdminHandlerManager.java |   2 -
 .../runtime/admin/handler/v1/MetricsHandler.java   | 113 ---
 .../eventmesh/spi/EventMeshExtensionType.java      |   1 +
 settings.gradle                                    |   9 +-
 431 files changed, 12532 insertions(+), 2957 deletions(-)

diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
index dfb36970d..c2d327cdc 100644
--- a/.github/workflows/docker.yml
+++ b/.github/workflows/docker.yml
@@ -47,4 +47,4 @@ jobs:
           tags: ${{ steps.meta.outputs.tags }}
           labels: ${{ steps.meta.outputs.labels }}
           file: ./docker/Dockerfile_jdk8
-          context: ./
+          context: ./
\ No newline at end of file
diff --git a/.idea/icon.png b/.idea/icon.png
deleted file mode 100644
index 59aa06dac..000000000
Binary files a/.idea/icon.png and /dev/null differ
diff --git a/build.gradle b/build.gradle
index 3fc27890d..5aafc4c93 100644
--- a/build.gradle
+++ b/build.gradle
@@ -95,7 +95,8 @@ allprojects {
 
     checkstyleMain.exclude('**/org/apache/eventmesh/client/grpc/protos**')
             .exclude('**/org/apache/eventmesh/common/protocol/grpc/cloudevents**')
-            .exclude('**/org/apache/eventmesh/common/protocol/grpc/protos/**')
+            .exclude('**/org/apache/eventmesh/common/protocol/grpc/proto**')
+            .exclude('**/org/apache/eventmesh/common/protocol/grpc/adminserver/**')
             .exclude('**/org/apache/eventmesh/connector/openfunction/client/EventMeshGrpcService**')
             .exclude('**/org/apache/eventmesh/connector/openfunction/client/CallbackServiceGrpc**')
             .exclude('**/org/apache/eventmesh/connector/jdbc/antlr**')
@@ -405,7 +406,7 @@ tasks.register('checkDeniedLicense') {
                 "BSD-4-Clause", "BSD-4-Clause-UC", "NPL-1.0", "NPL-1.1", "JSON"
         ]
         // Update exemptions according to https://github.com/apache/eventmesh/issues/4842
-        def allowedArtifacts = ["amqp-client", "stax-api", "javassist", "ST4", "xsdlib"]
+        def allowedArtifacts = ["amqp-client", "stax-api", "javassist", "ST4", "xsdlib", "jsqlparser"]
 
         def licenseFile = file('tools/dist-license/LICENSE')
         def lines = licenseFile.readLines()
@@ -751,6 +752,13 @@ subprojects {
 
             dependency "software.amazon.awssdk:s3:2.25.55"
             dependency "com.github.rholder:guava-retrying:2.0.0"
+
+            dependency "org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.1"
+            dependency "com.alibaba:druid-spring-boot-starter:1.2.22"
+            dependency "org.springframework.boot:spring-boot-starter-jetty:2.7.10"
+
+            dependency "com.baomidou:mybatis-plus:3.5.6"
+            dependency "com.mysql:mysql-connector-j:8.0.33"
         }
     }
-}
+}
\ No newline at end of file
diff --git a/eventmesh-admin-server/.gitignore b/eventmesh-admin-server/.gitignore
new file mode 100644
index 000000000..b63da4551
--- /dev/null
+++ b/eventmesh-admin-server/.gitignore
@@ -0,0 +1,42 @@
+.gradle
+build/
+!gradle/wrapper/gradle-wrapper.jar
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### IntelliJ IDEA ###
+.idea/modules.xml
+.idea/jarRepositories.xml
+.idea/compiler.xml
+.idea/libraries/
+*.iws
+*.iml
+*.ipr
+out/
+!**/src/main/**/out/
+!**/src/test/**/out/
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+bin/
+!**/src/main/**/bin/
+!**/src/test/**/bin/
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store
\ No newline at end of file
diff --git a/eventmesh-admin-server/build.gradle b/eventmesh-admin-server/build.gradle
new file mode 100644
index 000000000..2a7d6e0e5
--- /dev/null
+++ b/eventmesh-admin-server/build.gradle
@@ -0,0 +1,48 @@
+/*
+ * 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.
+ */
+
+dependencies {
+	implementation project(":eventmesh-spi")
+	implementation project(":eventmesh-common")
+	implementation project(":eventmesh-registry:eventmesh-registry-api")
+	implementation project(":eventmesh-registry:eventmesh-registry-nacos")
+	implementation project(':eventmesh-openconnect:eventmesh-openconnect-offsetmgmt-plugin:eventmesh-openconnect-offsetmgmt-api')
+	implementation "com.alibaba.nacos:nacos-client"
+	implementation ("org.springframework.boot:spring-boot-starter-web") {
+		exclude group: "org.springframework.boot", module: "spring-boot-starter-tomcat"
+	}
+	implementation 'org.springframework.boot:spring-boot-starter-jetty'
+	implementation "io.grpc:grpc-core"
+	implementation "io.grpc:grpc-protobuf"
+	implementation "io.grpc:grpc-stub"
+	implementation "io.grpc:grpc-netty-shaded"
+
+	// https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter
+	implementation group: 'com.baomidou', name: 'mybatis-plus-boot-starter', version: '3.5.5'
+	implementation "org.reflections:reflections:0.10.2"
+
+	// https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter
+	implementation "com.alibaba:druid-spring-boot-starter"
+	compileOnly 'com.mysql:mysql-connector-j'
+	compileOnly 'org.projectlombok:lombok'
+	annotationProcessor 'org.projectlombok:lombok'
+}
+
+configurations.implementation  {
+	exclude group: "org.springframework.boot", module: "spring-boot-starter-logging"
+}
+
diff --git a/.github/workflows/docker.yml b/eventmesh-admin-server/gradle.properties
similarity index 50%
copy from .github/workflows/docker.yml
copy to eventmesh-admin-server/gradle.properties
index dfb36970d..a9fd83fea 100644
--- a/.github/workflows/docker.yml
+++ b/eventmesh-admin-server/gradle.properties
@@ -13,38 +13,4 @@
 # 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.
-#
-
-name: Docker
-on:
-  release:
-    types: [released]
-
-jobs:
-  docker:
-    runs-on: ubuntu-latest
-    steps:
-      - name: Checkout repository
-        uses: actions/checkout@v4
-
-      - name: Login to DockerHub
-        uses: docker/login-action@v3
-        with:
-          username: ${{ secrets.DOCKERHUB_USER }}
-          password: ${{ secrets.DOCKERHUB_TOKEN }}
-
-      - name: Docker meta
-        id: meta
-        uses: docker/metadata-action@v5
-        with:
-          images: |
-            apache/eventmesh
-
-      - name: Build and push
-        uses: docker/build-push-action@v5
-        with:
-          push: true
-          tags: ${{ steps.meta.outputs.tags }}
-          labels: ${{ steps.meta.outputs.labels }}
-          file: ./docker/Dockerfile_jdk8
-          context: ./
+#
\ No newline at end of file
diff --git a/eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/sink/config/SinkConnectorConfig.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/Admin.java
similarity index 59%
copy from eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/sink/config/SinkConnectorConfig.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/Admin.java
index e971b7b00..71c6d67be 100644
--- a/eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/Admin.java
@@ -15,29 +15,31 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.jdbc.sink.config;
+package org.apache.eventmesh.admin.server;
 
-import org.apache.eventmesh.connector.jdbc.config.JdbcConfig;
-
-import lombok.Data;
+import org.apache.eventmesh.common.remote.Task;
+import org.apache.eventmesh.common.remote.request.ReportHeartBeatRequest;
+import org.apache.eventmesh.common.utils.PagedList;
 
 /**
- * Configuration parameters for a sink connector.
+ * Admin
  */
-@Data
-public class SinkConnectorConfig {
+public interface Admin extends ComponentLifeCycle {
 
     /**
-     * The name of the sink connector.
-     */
-    private String connectorName;
+     * support for web or ops
+     **/
+    boolean createOrUpdateTask(Task task);
+
+    boolean deleteTask(Long id);
+
+    Task getTask(Long id);
+
+    // paged list
+    PagedList<Task> getTaskPaged(Task task);
 
     /**
-     * JDBC configuration for connecting to a database.
+     * support for task
      */
-    private JdbcConfig jdbcConfig;
-
-    public String getDatabaseType() {
-        return "mysql";
-    }
+    void reportHeartbeat(ReportHeartBeatRequest heartBeat);
 }
diff --git a/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/AdminServer.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/AdminServer.java
new file mode 100644
index 000000000..98247d19b
--- /dev/null
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/AdminServer.java
@@ -0,0 +1,125 @@
+/*
+ * 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.eventmesh.admin.server;
+
+import org.apache.eventmesh.common.Constants;
+import org.apache.eventmesh.common.config.CommonConfiguration;
+import org.apache.eventmesh.common.config.ConfigService;
+import org.apache.eventmesh.common.remote.Task;
+import org.apache.eventmesh.common.remote.exception.ErrorCode;
+import org.apache.eventmesh.common.remote.request.ReportHeartBeatRequest;
+import org.apache.eventmesh.common.utils.IPUtils;
+import org.apache.eventmesh.common.utils.PagedList;
+import org.apache.eventmesh.registry.RegisterServerInfo;
+import org.apache.eventmesh.registry.RegistryFactory;
+import org.apache.eventmesh.registry.RegistryService;
+
+import org.apache.commons.lang3.StringUtils;
+
+import javax.annotation.PostConstruct;
+
+import org.springframework.boot.context.event.ApplicationReadyEvent;
+import org.springframework.context.ApplicationListener;
+import org.springframework.stereotype.Service;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Service
+@Slf4j
+public class AdminServer implements Admin, ApplicationListener<ApplicationReadyEvent> {
+
+    private final RegistryService registryService;
+
+    private final RegisterServerInfo adminServeInfo;
+
+    private final CommonConfiguration configuration;
+
+    public AdminServer(AdminServerProperties properties) {
+        configuration =
+            ConfigService.getInstance().buildConfigInstance(CommonConfiguration.class);
+        if (configuration == null) {
+            throw new AdminServerRuntimeException(ErrorCode.STARTUP_CONFIG_MISS, "common configuration file miss");
+        }
+        this.adminServeInfo = new RegisterServerInfo();
+
+        adminServeInfo.setHealth(true);
+        adminServeInfo.setAddress(IPUtils.getLocalAddress() + ":" + properties.getPort());
+        String name = Constants.ADMIN_SERVER_REGISTRY_NAME;
+        if (StringUtils.isNotBlank(properties.getServiceName())) {
+            name = properties.getServiceName();
+        }
+        adminServeInfo.setServiceName(name);
+        registryService = RegistryFactory.getInstance(configuration.getEventMeshRegistryPluginType());
+    }
+
+
+    @Override
+    public boolean createOrUpdateTask(Task task) {
+        return false;
+    }
+
+    @Override
+    public boolean deleteTask(Long id) {
+        return false;
+    }
+
+    @Override
+    public Task getTask(Long id) {
+        return null;
+    }
+
+    @Override
+    public PagedList<Task> getTaskPaged(Task task) {
+        return null;
+    }
+
+    @Override
+    public void reportHeartbeat(ReportHeartBeatRequest heartBeat) {
+
+    }
+
+    @Override
+    @PostConstruct
+    public void start() {
+        if (configuration.isEventMeshRegistryPluginEnabled()) {
+            registryService.init();
+        }
+    }
+
+    @Override
+    public void destroy() {
+        if (configuration.isEventMeshRegistryPluginEnabled()) {
+            registryService.unRegister(adminServeInfo);
+            try {
+                Thread.sleep(3000);
+            } catch (InterruptedException ignore) {
+                log.warn("interrupted when sleep");
+                Thread.currentThread().interrupt();
+            }
+            registryService.shutdown();
+        }
+    }
+
+    @Override
+    public void onApplicationEvent(ApplicationReadyEvent event) {
+        if (configuration.isEventMeshRegistryPluginEnabled()) {
+            log.info("application is started and registry plugin is enabled, it's will register admin self");
+            registryService.register(adminServeInfo);
+        }
+    }
+}
diff --git a/eventmesh-connectors/eventmesh-connector-http/src/main/java/org/apache/eventmesh/connector/http/source/config/SourceConnectorConfig.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/AdminServerProperties.java
similarity index 67%
copy from eventmesh-connectors/eventmesh-connector-http/src/main/java/org/apache/eventmesh/connector/http/source/config/SourceConnectorConfig.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/AdminServerProperties.java
index 873a0d192..2162731e2 100644
--- a/eventmesh-connectors/eventmesh-connector-http/src/main/java/org/apache/eventmesh/connector/http/source/config/SourceConnectorConfig.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/AdminServerProperties.java
@@ -15,18 +15,21 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.http.source.config;
+package org.apache.eventmesh.admin.server;
 
-import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
 
-@Data
-public class SourceConnectorConfig {
+import lombok.Getter;
+import lombok.Setter;
 
-    private String connectorName;
-
-    private String path;
+@ConfigurationProperties("event-mesh.admin-server")
+@Getter
+@Setter
+public class AdminServerProperties {
 
     private int port;
-
-    private int idleTimeout;
+    private boolean enableSSL;
+    private String configurationPath;
+    private String configurationFile;
+    private String serviceName;
 }
diff --git a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/SourceConnectorConfig.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/AdminServerRuntimeException.java
similarity index 73%
copy from eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/SourceConnectorConfig.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/AdminServerRuntimeException.java
index 6376a7fb4..5a68baba1 100644
--- a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/SourceConnectorConfig.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/AdminServerRuntimeException.java
@@ -15,14 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.file.source.config;
+package org.apache.eventmesh.admin.server;
 
-import lombok.Data;
+import lombok.Getter;
 
-@Data
-public class SourceConnectorConfig {
+public class AdminServerRuntimeException extends RuntimeException {
 
-    private String connectorName;
+    @Getter
+    private final int code;
 
-    private String filePath;
+    public AdminServerRuntimeException(int code, String message) {
+        super(message);
+        this.code = code;
+    }
 }
diff --git a/eventmesh-connectors/eventmesh-connector-spring/src/main/java/org/apache/eventmesh/connector/spring/source/connector/SourceConnectorConfig.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/ComponentLifeCycle.java
similarity index 81%
copy from eventmesh-connectors/eventmesh-connector-spring/src/main/java/org/apache/eventmesh/connector/spring/source/connector/SourceConnectorConfig.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/ComponentLifeCycle.java
index 242869087..392eebfbb 100644
--- a/eventmesh-connectors/eventmesh-connector-spring/src/main/java/org/apache/eventmesh/connector/spring/source/connector/SourceConnectorConfig.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/ComponentLifeCycle.java
@@ -15,13 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.spring.source.connector;
+package org.apache.eventmesh.admin.server;
 
-import lombok.Data;
-
-@Data
-public class SourceConnectorConfig {
+/**
+ * adminServer ComponentLifeCycle
+ */
+public interface ComponentLifeCycle {
 
-    private String connectorName;
+    void start() throws Exception;
 
+    void destroy();
 }
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SourceConnector.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/ExampleAdminServer.java
similarity index 56%
copy from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SourceConnector.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/ExampleAdminServer.java
index 100612662..c6a6e1650 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SourceConnector.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/ExampleAdminServer.java
@@ -15,16 +15,19 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.connector;
+package org.apache.eventmesh.admin.server;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
-import org.apache.eventmesh.openconnect.api.source.Source;
+import org.apache.eventmesh.admin.server.constatns.AdminServerConstants;
+import org.apache.eventmesh.common.config.ConfigService;
 
-public abstract class SourceConnector implements Source {
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
 
-    private final SourceConfig sourceConfig;
+@SpringBootApplication
+public class ExampleAdminServer {
 
-    protected SourceConnector(SourceConfig sourceConfig) {
-        this.sourceConfig = sourceConfig;
+    public static void main(String[] args) throws Exception {
+        ConfigService.getInstance().setConfigPath(AdminServerConstants.EVENTMESH_CONF_HOME).setRootConfig(AdminServerConstants.EVENTMESH_CONF_FILE);
+        SpringApplication.run(ExampleAdminServer.class);
     }
 }
diff --git a/eventmesh-connectors/eventmesh-connector-dingtalk/src/main/java/org/apache/eventmesh/connector/dingtalk/sink/config/SinkConnectorConfig.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/constatns/AdminServerConstants.java
similarity index 70%
copy from eventmesh-connectors/eventmesh-connector-dingtalk/src/main/java/org/apache/eventmesh/connector/dingtalk/sink/config/SinkConnectorConfig.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/constatns/AdminServerConstants.java
index 2211fd1ad..44afaca1c 100644
--- a/eventmesh-connectors/eventmesh-connector-dingtalk/src/main/java/org/apache/eventmesh/connector/dingtalk/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/constatns/AdminServerConstants.java
@@ -15,22 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.dingtalk.sink.config;
+package org.apache.eventmesh.admin.server.constatns;
 
-import lombok.Data;
+public class AdminServerConstants {
+    public static final String CONF_ENV = "configurationPath";
 
-@Data
-public class SinkConnectorConfig {
+    public static final String EVENTMESH_CONF_HOME = System.getProperty(CONF_ENV, System.getenv(CONF_ENV));
 
-    private String connectorName;
-
-    private String appKey;
-
-    private String appSecret;
-
-    private String openConversationId;
-
-    private String robotCode;
-
-    private String coolAppCode;
+    public static final String EVENTMESH_CONF_FILE = "eventmesh-admin.properties";
 }
diff --git a/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/AdminGrpcServer.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/AdminGrpcServer.java
new file mode 100644
index 000000000..3bac23708
--- /dev/null
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/AdminGrpcServer.java
@@ -0,0 +1,103 @@
+/*
+ * 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.eventmesh.admin.server.web;
+
+import org.apache.eventmesh.admin.server.AdminServerRuntimeException;
+import org.apache.eventmesh.admin.server.web.handler.BaseRequestHandler;
+import org.apache.eventmesh.admin.server.web.handler.RequestHandlerFactory;
+import org.apache.eventmesh.common.protocol.grpc.adminserver.AdminServiceGrpc;
+import org.apache.eventmesh.common.protocol.grpc.adminserver.Payload;
+import org.apache.eventmesh.common.remote.exception.ErrorCode;
+import org.apache.eventmesh.common.remote.payload.PayloadUtil;
+import org.apache.eventmesh.common.remote.request.BaseRemoteRequest;
+import org.apache.eventmesh.common.remote.response.BaseRemoteResponse;
+import org.apache.eventmesh.common.remote.response.EmptyAckResponse;
+import org.apache.eventmesh.common.remote.response.FailResponse;
+
+import org.apache.commons.lang3.StringUtils;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import io.grpc.stub.ServerCallStreamObserver;
+import io.grpc.stub.StreamObserver;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Service
+@Slf4j
+public class AdminGrpcServer extends AdminServiceGrpc.AdminServiceImplBase {
+
+    @Autowired
+    RequestHandlerFactory handlerFactory;
+
+    private Payload process(Payload value) {
+        if (value == null || StringUtils.isBlank(value.getMetadata().getType())) {
+            return PayloadUtil.from(FailResponse.build(ErrorCode.BAD_REQUEST, "bad request: type not exists"));
+        }
+        try {
+            BaseRequestHandler<BaseRemoteRequest, BaseRemoteResponse> handler = handlerFactory.getHandler(value.getMetadata().getType());
+            if (handler == null) {
+                return PayloadUtil.from(FailResponse.build(BaseRemoteResponse.UNKNOWN, "not match any request handler"));
+            }
+            BaseRemoteResponse response = handler.handlerRequest((BaseRemoteRequest) PayloadUtil.parse(value), value.getMetadata());
+            if (response == null || response instanceof EmptyAckResponse) {
+                return null;
+            }
+            return PayloadUtil.from(response);
+        } catch (Exception e) {
+            log.warn("process payload {} fail", value.getMetadata().getType(), e);
+            if (e instanceof AdminServerRuntimeException) {
+                return PayloadUtil.from(FailResponse.build(((AdminServerRuntimeException) e).getCode(), e.getMessage()));
+            }
+            return PayloadUtil.from(FailResponse.build(ErrorCode.INTERNAL_ERR, "admin server internal err"));
+        }
+    }
+
+    public StreamObserver<Payload> invokeBiStream(StreamObserver<Payload> responseObserver) {
+        return new StreamObserver<Payload>() {
+            @Override
+            public void onNext(Payload value) {
+                Payload payload = process(value);
+                if (payload == null) {
+                    return;
+                }
+                responseObserver.onNext(payload);
+            }
+
+            @Override
+            public void onError(Throwable t) {
+                if (responseObserver instanceof ServerCallStreamObserver) {
+                    if (!((ServerCallStreamObserver<Payload>) responseObserver).isCancelled()) {
+                        log.warn("admin gRPC server fail", t);
+                    }
+                }
+            }
+
+            @Override
+            public void onCompleted() {
+                responseObserver.onCompleted();
+            }
+        };
+    }
+
+    public void invoke(Payload request, StreamObserver<Payload> responseObserver) {
+        responseObserver.onNext(process(request));
+        responseObserver.onCompleted();
+    }
+}
diff --git a/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/BaseServer.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/BaseServer.java
new file mode 100644
index 000000000..24085dd89
--- /dev/null
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/BaseServer.java
@@ -0,0 +1,50 @@
+/*
+ * 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.eventmesh.admin.server.web;
+
+import org.apache.eventmesh.admin.server.ComponentLifeCycle;
+import org.apache.eventmesh.common.remote.payload.PayloadFactory;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public abstract class BaseServer implements ComponentLifeCycle {
+
+    static {
+        PayloadFactory.getInstance().init();
+    }
+
+    @PostConstruct
+    public void init() throws Exception {
+        log.info("[{}] server starting at port [{}]", this.getClass().getSimpleName(), getPort());
+        start();
+        log.info("[{}] server started at port [{}]", this.getClass().getSimpleName(), getPort());
+    }
+
+    @PreDestroy
+    public void shutdown() {
+        log.info("[{}] server will destroy", this.getClass().getSimpleName());
+        destroy();
+        log.info("[{}] server has be destroy", this.getClass().getSimpleName());
+    }
+
+    public abstract int getPort();
+}
diff --git a/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/GrpcServer.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/GrpcServer.java
new file mode 100644
index 000000000..5fbb34f48
--- /dev/null
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/GrpcServer.java
@@ -0,0 +1,73 @@
+/*
+ * 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.eventmesh.admin.server.web;
+
+import org.apache.eventmesh.admin.server.AdminServerProperties;
+
+import java.util.concurrent.TimeUnit;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+
+import io.grpc.Server;
+import io.grpc.netty.shaded.io.grpc.netty.NettyServerBuilder;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Controller
+@Slf4j
+public class GrpcServer extends BaseServer {
+
+    @Autowired
+    AdminGrpcServer adminGrpcServer;
+
+    @Autowired
+    AdminServerProperties properties;
+
+    private Server server;
+
+    @Override
+    public void start() throws Exception {
+        NettyServerBuilder serverBuilder = NettyServerBuilder.forPort(getPort()).addService(adminGrpcServer);
+        if (properties.isEnableSSL()) {
+            serverBuilder.sslContext(null);
+        }
+        server = serverBuilder.build();
+        server.start();
+    }
+
+    @Override
+    public void destroy() {
+        try {
+            if (server != null) {
+                server.shutdown();
+                if (!server.awaitTermination(30, TimeUnit.SECONDS)) {
+                    log.warn("[{}] server don't graceful stop in 30s, it will shutdown now", this.getClass().getSimpleName());
+                    server.shutdownNow();
+                }
+            }
+        } catch (InterruptedException e) {
+            log.warn("destroy [{}] server fail", this.getClass().getSimpleName(), e);
+        }
+    }
+
+    @Override
+    public int getPort() {
+        return properties.getPort();
+    }
+}
diff --git a/eventmesh-connectors/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/sink/config/KafkaSinkConfig.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/HttpServer.java
similarity index 76%
rename from eventmesh-connectors/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/sink/config/KafkaSinkConfig.java
rename to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/HttpServer.java
index 9bb79551d..3f91115bd 100644
--- a/eventmesh-connectors/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/sink/config/KafkaSinkConfig.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/HttpServer.java
@@ -15,15 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.kafka.sink.config;
+package org.apache.eventmesh.admin.server.web;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
-
-import lombok.Data;
-
-@Data
-public class KafkaSinkConfig extends SinkConfig {
-
-    public SinkConnectorConfig connectorConfig;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
+@RestController
+@RequestMapping("/eventmesh/admin")
+public class HttpServer {
 }
diff --git a/eventmesh-connectors/eventmesh-connector-dingtalk/src/main/java/org/apache/eventmesh/connector/dingtalk/sink/config/SinkConnectorConfig.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/Request.java
similarity index 69%
copy from eventmesh-connectors/eventmesh-connector-dingtalk/src/main/java/org/apache/eventmesh/connector/dingtalk/sink/config/SinkConnectorConfig.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/Request.java
index 2211fd1ad..9484e986f 100644
--- a/eventmesh-connectors/eventmesh-connector-dingtalk/src/main/java/org/apache/eventmesh/connector/dingtalk/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/Request.java
@@ -15,22 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.dingtalk.sink.config;
+package org.apache.eventmesh.admin.server.web;
 
-import lombok.Data;
+public class Request<T> {
+    private String uid;
+    private T data;
 
-@Data
-public class SinkConnectorConfig {
+    public String getUid() {
+        return uid;
+    }
 
-    private String connectorName;
+    public void setUid(String uid) {
+        this.uid = uid;
+    }
 
-    private String appKey;
+    public T getData() {
+        return data;
+    }
 
-    private String appSecret;
-
-    private String openConversationId;
-
-    private String robotCode;
-
-    private String coolAppCode;
+    public void setData(T data) {
+        this.data = data;
+    }
 }
diff --git a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/build.gradle b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/Response.java
similarity index 61%
copy from eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/build.gradle
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/Response.java
index 97c3b8c33..d58312146 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/build.gradle
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/Response.java
@@ -15,16 +15,37 @@
  * limitations under the License.
  */
 
-dependencies {
-    api project(":eventmesh-spi")
-    api "org.slf4j:slf4j-api"
+package org.apache.eventmesh.admin.server.web;
 
-    compileOnly 'org.projectlombok:lombok'
-    annotationProcessor 'org.projectlombok:lombok'
-    implementation project(":eventmesh-common")
+public class Response<T> {
 
-    testCompileOnly 'org.projectlombok:lombok'
-    testAnnotationProcessor 'org.projectlombok:lombok'
+    private boolean success;
 
-    testImplementation "org.mockito:mockito-core"
+    private String desc;
+
+    private T data;
+
+    public boolean isSuccess() {
+        return success;
+    }
+
+    public void setSuccess(boolean success) {
+        this.success = success;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
 }
diff --git a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/SourceConnectorConfig.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/ServerController.java
similarity index 75%
copy from eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/SourceConnectorConfig.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/ServerController.java
index 6376a7fb4..5623cbad3 100644
--- a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/SourceConnectorConfig.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/ServerController.java
@@ -15,14 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.file.source.config;
+package org.apache.eventmesh.admin.server.web;
 
-import lombok.Data;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
-@Data
-public class SourceConnectorConfig {
+@RestController
+@RequestMapping("/eventmesh/admin")
+public class ServerController {
 
-    private String connectorName;
-
-    private String filePath;
 }
diff --git a/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/DBThreadPool.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/DBThreadPool.java
new file mode 100644
index 000000000..f1de76496
--- /dev/null
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/DBThreadPool.java
@@ -0,0 +1,60 @@
+/*
+ * 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.eventmesh.admin.server.web.db;
+
+import org.apache.eventmesh.common.EventMeshThreadFactory;
+
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import javax.annotation.PreDestroy;
+
+import org.springframework.stereotype.Component;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Component
+@Slf4j
+public class DBThreadPool {
+
+    private final ThreadPoolExecutor executor =
+        new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors() * 2,
+            Runtime.getRuntime().availableProcessors() * 2, 0L, TimeUnit.SECONDS,
+            new LinkedBlockingQueue<>(1000), new EventMeshThreadFactory("admin-server-db"),
+            new ThreadPoolExecutor.DiscardOldestPolicy());
+
+    @PreDestroy
+    private void destroy() {
+        if (!executor.isShutdown()) {
+            try {
+                executor.shutdown();
+                if (!executor.awaitTermination(30, TimeUnit.SECONDS)) {
+                    log.info("wait heart beat handler thread pool shutdown timeout, it will shutdown immediately");
+                    executor.shutdownNow();
+                }
+            } catch (InterruptedException e) {
+                log.warn("wait heart beat handler thread pool shutdown fail");
+            }
+        }
+    }
+
+    public ThreadPoolExecutor getExecutors() {
+        return executor;
+    }
+}
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SourceConnectorContext.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/entity/EventMeshDataSource.java
similarity index 53%
copy from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SourceConnectorContext.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/entity/EventMeshDataSource.java
index 14fd92218..2f154faf0 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SourceConnectorContext.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/entity/EventMeshDataSource.java
@@ -15,21 +15,40 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.connector;
+package org.apache.eventmesh.admin.server.web.db.entity;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
-import org.apache.eventmesh.openconnect.offsetmgmt.api.storage.OffsetStorageReader;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 
 import lombok.Data;
 
 /**
- * Source Connector Context
+ * event_mesh_data_source
  */
+@TableName(value = "event_mesh_data_source")
 @Data
-public class SourceConnectorContext implements ConnectorContext {
+public class EventMeshDataSource implements Serializable {
+
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    private Integer dataType;
+
+    private String description;
+
+    private String configuration;
+
+    private Integer createUid;
+
+    private Integer updateUid;
 
-    public OffsetStorageReader offsetStorageReader;
+    private Date createTime;
 
-    public SourceConfig sourceConfig;
+    private Date updateTime;
 
-}
+    private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/config/OffsetStorageConfig.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/entity/EventMeshJobDetail.java
similarity index 57%
copy from eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/config/OffsetStorageConfig.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/entity/EventMeshJobDetail.java
index 30a56a3d2..b4a836e8b 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/config/OffsetStorageConfig.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/entity/EventMeshJobDetail.java
@@ -15,18 +15,34 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.offsetmgmt.api.config;
+package org.apache.eventmesh.admin.server.web.db.entity;
+
+import org.apache.eventmesh.common.remote.JobState;
+import org.apache.eventmesh.common.remote.job.JobTransportType;
+import org.apache.eventmesh.common.remote.offset.RecordPosition;
 
 import java.util.Map;
 
 import lombok.Data;
 
 @Data
-public class OffsetStorageConfig {
+public class EventMeshJobDetail {
+
+    private Integer id;
+
+    private String name;
+
+    private JobTransportType transportType;
+
+    private Map<String, Object> sourceConnectorConfig;
+
+    private String sourceConnectorDesc;
+
+    private Map<String, Object> sinkConnectorConfig;
 
-    private String offsetStorageType;
+    private String sinkConnectorDesc;
 
-    private String offsetStorageAddr;
+    private RecordPosition position;
 
-    private Map<String, String> extensions;
+    private JobState state;
 }
diff --git a/eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/source/config/MysqlConfig.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/entity/EventMeshJobInfo.java
similarity index 51%
copy from eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/source/config/MysqlConfig.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/entity/EventMeshJobInfo.java
index 032921350..73d2f4aba 100644
--- a/eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/source/config/MysqlConfig.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/entity/EventMeshJobInfo.java
@@ -15,40 +15,46 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.jdbc.source.config;
+package org.apache.eventmesh.admin.server.web.db.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 
 import lombok.Data;
 
+/**
+ * event_mesh_job_info
+ */
+@TableName(value = "event_mesh_job_info")
 @Data
-public class MysqlConfig {
-
-    private int serverId;
+public class EventMeshJobInfo implements Serializable {
 
-    private boolean keepAlive = true;
+    @TableId(type = IdType.AUTO)
+    private Integer jobID;
 
-    private long keepAliveInterval;
+    private String name;
 
-    private SnapshotLockingMode snapshotLockingMode = SnapshotLockingMode.MINIMAL;
+    private Integer transportType;
 
-    private boolean useGlobalLock = true;
+    private Integer sourceData;
 
-    public enum SnapshotLockingMode {
+    private Integer targetData;
 
-        EXTENDED("extended"),
+    private Integer state;
 
-        MINIMAL("minimal"),
+    private Integer jobType;
 
-        NONE("none");
+    private Integer createUid;
 
-        private final String value;
+    private Integer updateUid;
 
-        SnapshotLockingMode(String value) {
-            this.value = value;
-        }
+    private Date createTime;
 
-        public boolean usesLocking() {
-            return !value.equals(NONE.value);
-        }
-    }
+    private Date updateTime;
 
-}
+    private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/eventmesh-connectors/eventmesh-connector-prometheus/src/main/java/org/apache/eventmesh/connector/prometheus/source/config/SourceConnectorConfig.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/entity/EventMeshMysqlPosition.java
similarity index 55%
copy from eventmesh-connectors/eventmesh-connector-prometheus/src/main/java/org/apache/eventmesh/connector/prometheus/source/config/SourceConnectorConfig.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/entity/EventMeshMysqlPosition.java
index 7e8b7ba93..ffe3e446d 100644
--- a/eventmesh-connectors/eventmesh-connector-prometheus/src/main/java/org/apache/eventmesh/connector/prometheus/source/config/SourceConnectorConfig.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/entity/EventMeshMysqlPosition.java
@@ -15,26 +15,40 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.prometheus.source.config;
+package org.apache.eventmesh.admin.server.web.db.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 
 import lombok.Data;
 
+/**
+ * event_mesh_mysql_position
+ */
+@TableName(value = "event_mesh_mysql_position")
 @Data
-public class SourceConnectorConfig {
+public class EventMeshMysqlPosition implements Serializable {
 
-    private String connectorName;
+    @TableId(type = IdType.AUTO)
+    private Integer id;
 
-    private String connectorId;
+    private Integer jobID;
 
     private String address;
 
-    private String api;
+    private Long position;
+
+    private Long timestamp;
 
-    private Long initTime;
+    private String journalName;
 
-    private String query;
+    private Date createTime;
 
-    private Integer interval;
+    private Date updateTime;
 
-    private String step;
+    private static final long serialVersionUID = 1L;
 }
\ No newline at end of file
diff --git a/eventmesh-connectors/eventmesh-connector-prometheus/src/main/java/org/apache/eventmesh/connector/prometheus/source/config/SourceConnectorConfig.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/entity/EventMeshPositionReporterHistory.java
similarity index 57%
copy from eventmesh-connectors/eventmesh-connector-prometheus/src/main/java/org/apache/eventmesh/connector/prometheus/source/config/SourceConnectorConfig.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/entity/EventMeshPositionReporterHistory.java
index 7e8b7ba93..c8d7d9b6d 100644
--- a/eventmesh-connectors/eventmesh-connector-prometheus/src/main/java/org/apache/eventmesh/connector/prometheus/source/config/SourceConnectorConfig.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/entity/EventMeshPositionReporterHistory.java
@@ -15,26 +15,34 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.prometheus.source.config;
+package org.apache.eventmesh.admin.server.web.db.entity;
 
-import lombok.Data;
+import java.io.Serializable;
+import java.util.Date;
 
-@Data
-public class SourceConnectorConfig {
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 
-    private String connectorName;
+import lombok.Data;
 
-    private String connectorId;
+/**
+ * event_mesh_position_reporter_history
+ */
+@TableName(value = "event_mesh_position_reporter_history")
+@Data
+public class EventMeshPositionReporterHistory implements Serializable {
 
-    private String address;
+    @TableId(type = IdType.AUTO)
+    private Long id;
 
-    private String api;
+    private Integer job;
 
-    private Long initTime;
+    private String record;
 
-    private String query;
+    private String address;
 
-    private Integer interval;
+    private Date createTime;
 
-    private String step;
+    private static final long serialVersionUID = 1L;
 }
\ No newline at end of file
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SourceConnectorContext.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/entity/EventMeshRuntimeHeartbeat.java
similarity index 54%
copy from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SourceConnectorContext.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/entity/EventMeshRuntimeHeartbeat.java
index 14fd92218..7cc165cc5 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SourceConnectorContext.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/entity/EventMeshRuntimeHeartbeat.java
@@ -15,21 +15,38 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.connector;
+package org.apache.eventmesh.admin.server.web.db.entity;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
-import org.apache.eventmesh.openconnect.offsetmgmt.api.storage.OffsetStorageReader;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 
 import lombok.Data;
 
 /**
- * Source Connector Context
+ * event_mesh_runtime_heartbeat
  */
+@TableName(value = "event_mesh_runtime_heartbeat")
 @Data
-public class SourceConnectorContext implements ConnectorContext {
+public class EventMeshRuntimeHeartbeat implements Serializable {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    private String adminAddr;
+
+    private String runtimeAddr;
+
+    private Integer jobID;
+
+    private String reportTime;
 
-    public OffsetStorageReader offsetStorageReader;
+    private Date updateTime;
 
-    public SourceConfig sourceConfig;
+    private Date createTime;
 
-}
+    private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/eventmesh-connectors/eventmesh-connector-prometheus/src/main/java/org/apache/eventmesh/connector/prometheus/source/config/SourceConnectorConfig.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/entity/EventMeshRuntimeHistory.java
similarity index 59%
copy from eventmesh-connectors/eventmesh-connector-prometheus/src/main/java/org/apache/eventmesh/connector/prometheus/source/config/SourceConnectorConfig.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/entity/EventMeshRuntimeHistory.java
index 7e8b7ba93..1f8ef788d 100644
--- a/eventmesh-connectors/eventmesh-connector-prometheus/src/main/java/org/apache/eventmesh/connector/prometheus/source/config/SourceConnectorConfig.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/entity/EventMeshRuntimeHistory.java
@@ -15,26 +15,32 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.prometheus.source.config;
+package org.apache.eventmesh.admin.server.web.db.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 
 import lombok.Data;
 
+/**
+ * event_mesh_runtime_history
+ */
+@TableName(value = "event_mesh_runtime_history")
 @Data
-public class SourceConnectorConfig {
+public class EventMeshRuntimeHistory implements Serializable {
 
-    private String connectorName;
+    @TableId(type = IdType.AUTO)
+    private Long id;
 
-    private String connectorId;
+    private Integer job;
 
     private String address;
 
-    private String api;
-
-    private Long initTime;
-
-    private String query;
-
-    private Integer interval;
+    private Date createTime;
 
-    private String step;
+    private static final long serialVersionUID = 1L;
 }
\ No newline at end of file
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SourceConnectorContext.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/mapper/EventMeshDataSourceMapper.java
similarity index 63%
copy from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SourceConnectorContext.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/mapper/EventMeshDataSourceMapper.java
index 14fd92218..c59e28428 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SourceConnectorContext.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/mapper/EventMeshDataSourceMapper.java
@@ -15,21 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.connector;
+package org.apache.eventmesh.admin.server.web.db.mapper;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
-import org.apache.eventmesh.openconnect.offsetmgmt.api.storage.OffsetStorageReader;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshDataSource;
 
-import lombok.Data;
+import org.apache.ibatis.annotations.Mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 /**
- * Source Connector Context
+ * for table 'event_mesh_data_source' db operation
+ * 2024-05-09 15:52:49
+ * entity.db.web.server.admin.eventmesh.apache.org.EventMeshDataSource
  */
-@Data
-public class SourceConnectorContext implements ConnectorContext {
+@Mapper
+public interface EventMeshDataSourceMapper extends BaseMapper<EventMeshDataSource> {
+
+}
+
 
-    public OffsetStorageReader offsetStorageReader;
 
-    public SourceConfig sourceConfig;
 
-}
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SourceConnectorContext.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/mapper/EventMeshJobInfoMapper.java
similarity index 64%
copy from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SourceConnectorContext.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/mapper/EventMeshJobInfoMapper.java
index 14fd92218..eb57c0af2 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SourceConnectorContext.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/mapper/EventMeshJobInfoMapper.java
@@ -15,21 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.connector;
+package org.apache.eventmesh.admin.server.web.db.mapper;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
-import org.apache.eventmesh.openconnect.offsetmgmt.api.storage.OffsetStorageReader;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshJobInfo;
 
-import lombok.Data;
+import org.apache.ibatis.annotations.Mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 /**
- * Source Connector Context
+ * for table 'event_mesh_job_info' db operation
+ * 2024-05-09 15:51:45
+ * entity.db.web.server.admin.eventmesh.apache.org.EventMeshJobInfo
  */
-@Data
-public class SourceConnectorContext implements ConnectorContext {
+@Mapper
+public interface EventMeshJobInfoMapper extends BaseMapper<EventMeshJobInfo> {
+
+}
+
 
-    public OffsetStorageReader offsetStorageReader;
 
-    public SourceConfig sourceConfig;
 
-}
diff --git a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageWriter.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/mapper/EventMeshMysqlPositionMapper.java
similarity index 62%
copy from eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageWriter.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/mapper/EventMeshMysqlPositionMapper.java
index f8b6bdc45..f0a0467d7 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageWriter.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/mapper/EventMeshMysqlPositionMapper.java
@@ -15,20 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.offsetmgmt.api.storage;
+package org.apache.eventmesh.admin.server.web.db.mapper;
 
-import org.apache.eventmesh.openconnect.offsetmgmt.api.data.RecordOffset;
-import org.apache.eventmesh.openconnect.offsetmgmt.api.data.RecordPartition;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshMysqlPosition;
 
-import java.util.Map;
+import org.apache.ibatis.annotations.Mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 /**
- * OffsetStorageWriter
+ * for table `event_mesh_mysql_position` db operation
+ * 2024-05-14 17:15:03
+ * entity.db.web.server.admin.eventmesh.apache.org.EventMeshMysqlPosition
  */
-public interface OffsetStorageWriter {
+@Mapper
+public interface EventMeshMysqlPositionMapper extends BaseMapper<EventMeshMysqlPosition> {
+
+}
+
 
-    void writeOffset(RecordPartition recordPartition, RecordOffset recordOffset);
 
-    void writeOffset(Map<RecordPartition, RecordOffset> map);
 
-}
diff --git a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageReader.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/mapper/EventMeshPositionReporterHistoryMapper.java
similarity index 60%
copy from eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageReader.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/mapper/EventMeshPositionReporterHistoryMapper.java
index dc17e2984..adc6723b7 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageReader.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/mapper/EventMeshPositionReporterHistoryMapper.java
@@ -15,21 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.offsetmgmt.api.storage;
+package org.apache.eventmesh.admin.server.web.db.mapper;
 
-import org.apache.eventmesh.openconnect.offsetmgmt.api.data.RecordOffset;
-import org.apache.eventmesh.openconnect.offsetmgmt.api.data.RecordPartition;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshPositionReporterHistory;
 
-import java.util.Collection;
-import java.util.Map;
+import org.apache.ibatis.annotations.Mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 /**
- * OffsetStorageReader
+ * for table 'event_mesh_position_reporter_history' db operation
+ * 2024-05-14 17:15:03
+ * entity.db.web.server.admin.eventmesh.apache.org.EventMeshPositionReporterHistory
  */
-public interface OffsetStorageReader {
+@Mapper
+public interface EventMeshPositionReporterHistoryMapper extends BaseMapper<EventMeshPositionReporterHistory> {
+
+}
+
 
-    RecordOffset readOffset(RecordPartition recordPartition);
 
-    Map<RecordPartition, RecordOffset> readOffsets(Collection<RecordPartition> collection);
 
-}
diff --git a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageReader.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/mapper/EventMeshRuntimeHeartbeatMapper.java
similarity index 61%
copy from eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageReader.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/mapper/EventMeshRuntimeHeartbeatMapper.java
index dc17e2984..813769d2a 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageReader.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/mapper/EventMeshRuntimeHeartbeatMapper.java
@@ -15,21 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.offsetmgmt.api.storage;
+package org.apache.eventmesh.admin.server.web.db.mapper;
 
-import org.apache.eventmesh.openconnect.offsetmgmt.api.data.RecordOffset;
-import org.apache.eventmesh.openconnect.offsetmgmt.api.data.RecordPartition;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshRuntimeHeartbeat;
 
-import java.util.Collection;
-import java.util.Map;
+import org.apache.ibatis.annotations.Mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 /**
- * OffsetStorageReader
+ * for table 'event_mesh_runtime_heartbeat' db operation
+ * 2024-05-14 17:15:03
+ * entity.db.web.server.admin.eventmesh.apache.org.EventMeshRuntimeHeartbeat
  */
-public interface OffsetStorageReader {
+@Mapper
+public interface EventMeshRuntimeHeartbeatMapper extends BaseMapper<EventMeshRuntimeHeartbeat> {
+
+}
+
 
-    RecordOffset readOffset(RecordPartition recordPartition);
 
-    Map<RecordPartition, RecordOffset> readOffsets(Collection<RecordPartition> collection);
 
-}
diff --git a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageReader.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/mapper/EventMeshRuntimeHistoryMapper.java
similarity index 62%
copy from eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageReader.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/mapper/EventMeshRuntimeHistoryMapper.java
index dc17e2984..5fc3a21f5 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageReader.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/mapper/EventMeshRuntimeHistoryMapper.java
@@ -15,21 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.offsetmgmt.api.storage;
+package org.apache.eventmesh.admin.server.web.db.mapper;
 
-import org.apache.eventmesh.openconnect.offsetmgmt.api.data.RecordOffset;
-import org.apache.eventmesh.openconnect.offsetmgmt.api.data.RecordPartition;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshRuntimeHistory;
 
-import java.util.Collection;
-import java.util.Map;
+import org.apache.ibatis.annotations.Mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 /**
- * OffsetStorageReader
+ * for table 'event_mesh_runtime_history' db operation
+ * 2024-05-14 17:15:03
+ * entity.db.web.server.admin.eventmesh.apache.org.EventMeshRuntimeHistory
  */
-public interface OffsetStorageReader {
+@Mapper
+public interface EventMeshRuntimeHistoryMapper extends BaseMapper<EventMeshRuntimeHistory> {
+
+}
+
 
-    RecordOffset readOffset(RecordPartition recordPartition);
 
-    Map<RecordPartition, RecordOffset> readOffsets(Collection<RecordPartition> collection);
 
-}
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/EventMeshDataSourceService.java
similarity index 69%
copy from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/EventMeshDataSourceService.java
index a7aef4fff..29e2b8122 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/EventMeshDataSourceService.java
@@ -15,18 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.connector;
+package org.apache.eventmesh.admin.server.web.db.service;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshDataSource;
 
-import lombok.Data;
+import com.baomidou.mybatisplus.extension.service.IService;
 
 /**
- * Sink Connector Context
- */
-@Data
-public class SinkConnectorContext implements ConnectorContext {
-
-    public SinkConfig sinkConfig;
+* 
+* for table 'event_mesh_data_source' db operation
+* 2024-05-09 15:52:49
+*/
+public interface EventMeshDataSourceService extends IService<EventMeshDataSource> {
 
 }
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/EventMeshJobInfoService.java
similarity index 70%
copy from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/EventMeshJobInfoService.java
index a7aef4fff..c5ad39985 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/EventMeshJobInfoService.java
@@ -15,18 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.connector;
+package org.apache.eventmesh.admin.server.web.db.service;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshJobInfo;
 
-import lombok.Data;
+import com.baomidou.mybatisplus.extension.service.IService;
 
 /**
- * Sink Connector Context
- */
-@Data
-public class SinkConnectorContext implements ConnectorContext {
-
-    public SinkConfig sinkConfig;
-
+* for table `event_mesh_job_info' db operation
+* 2024-05-09 15:51:45
+*/
+public interface EventMeshJobInfoService extends IService<EventMeshJobInfo> {
 }
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/EventMeshMysqlPositionService.java
similarity index 68%
copy from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/EventMeshMysqlPositionService.java
index a7aef4fff..2bf34ab92 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/EventMeshMysqlPositionService.java
@@ -15,18 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.connector;
+package org.apache.eventmesh.admin.server.web.db.service;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshMysqlPosition;
 
-import lombok.Data;
+import com.baomidou.mybatisplus.extension.service.IService;
 
 /**
- * Sink Connector Context
- */
-@Data
-public class SinkConnectorContext implements ConnectorContext {
-
-    public SinkConfig sinkConfig;
-
+* for table 'event_mesh_mysql_position' db operation
+* 2024-05-14 17:15:03
+*/
+public interface EventMeshMysqlPositionService extends IService<EventMeshMysqlPosition> {
 }
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/EventMeshPositionReporterHistoryService.java
similarity index 66%
copy from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/EventMeshPositionReporterHistoryService.java
index a7aef4fff..976eec94e 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/EventMeshPositionReporterHistoryService.java
@@ -15,18 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.connector;
+package org.apache.eventmesh.admin.server.web.db.service;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshPositionReporterHistory;
 
-import lombok.Data;
+import com.baomidou.mybatisplus.extension.service.IService;
 
 /**
- * Sink Connector Context
- */
-@Data
-public class SinkConnectorContext implements ConnectorContext {
-
-    public SinkConfig sinkConfig;
+* for table 'event_mesh_position_reporter_history' db operation
+* 2024-05-14 17:15:03
+*/
+public interface EventMeshPositionReporterHistoryService extends IService<EventMeshPositionReporterHistory> {
 
 }
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/EventMeshRuntimeHeartbeatService.java
similarity index 68%
copy from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/EventMeshRuntimeHeartbeatService.java
index a7aef4fff..f0e5d1c61 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/EventMeshRuntimeHeartbeatService.java
@@ -15,18 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.connector;
+package org.apache.eventmesh.admin.server.web.db.service;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshRuntimeHeartbeat;
 
-import lombok.Data;
+import com.baomidou.mybatisplus.extension.service.IService;
 
 /**
- * Sink Connector Context
+ * for table 'event_mesh_runtime_heartbeat' db operation
+ * 2024-05-14 17:15:03
  */
-@Data
-public class SinkConnectorContext implements ConnectorContext {
-
-    public SinkConfig sinkConfig;
+public interface EventMeshRuntimeHeartbeatService extends IService<EventMeshRuntimeHeartbeat> {
 
 }
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/EventMeshRuntimeHistoryService.java
similarity index 68%
copy from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/EventMeshRuntimeHistoryService.java
index a7aef4fff..1f6db0e12 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/EventMeshRuntimeHistoryService.java
@@ -15,18 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.connector;
+package org.apache.eventmesh.admin.server.web.db.service;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshRuntimeHistory;
 
-import lombok.Data;
+import com.baomidou.mybatisplus.extension.service.IService;
 
 /**
- * Sink Connector Context
+ * for table 'event_mesh_runtime_history' db operation
+ * 2024-05-14 17:15:03
  */
-@Data
-public class SinkConnectorContext implements ConnectorContext {
-
-    public SinkConfig sinkConfig;
+public interface EventMeshRuntimeHistoryService extends IService<EventMeshRuntimeHistory> {
 
 }
diff --git a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageReader.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/impl/EventMeshDataSourceServiceImpl.java
similarity index 55%
copy from eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageReader.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/impl/EventMeshDataSourceServiceImpl.java
index dc17e2984..f703425c9 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageReader.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/impl/EventMeshDataSourceServiceImpl.java
@@ -15,21 +15,26 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.offsetmgmt.api.storage;
+package org.apache.eventmesh.admin.server.web.db.service.impl;
 
-import org.apache.eventmesh.openconnect.offsetmgmt.api.data.RecordOffset;
-import org.apache.eventmesh.openconnect.offsetmgmt.api.data.RecordPartition;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshDataSource;
+import org.apache.eventmesh.admin.server.web.db.mapper.EventMeshDataSourceMapper;
+import org.apache.eventmesh.admin.server.web.db.service.EventMeshDataSourceService;
 
-import java.util.Collection;
-import java.util.Map;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
 /**
- * OffsetStorageReader
+ * for table 'event_mesh_data_source' db operation
+ * 2024-05-09 15:52:49
  */
-public interface OffsetStorageReader {
+@Service
+public class EventMeshDataSourceServiceImpl extends ServiceImpl<EventMeshDataSourceMapper, EventMeshDataSource>
+    implements EventMeshDataSourceService {
+
+}
+
 
-    RecordOffset readOffset(RecordPartition recordPartition);
 
-    Map<RecordPartition, RecordOffset> readOffsets(Collection<RecordPartition> collection);
 
-}
diff --git a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageReader.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/impl/EventMeshJobInfoServiceImpl.java
similarity index 54%
copy from eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageReader.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/impl/EventMeshJobInfoServiceImpl.java
index dc17e2984..dd7312cea 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageReader.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/impl/EventMeshJobInfoServiceImpl.java
@@ -15,21 +15,29 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.offsetmgmt.api.storage;
+package org.apache.eventmesh.admin.server.web.db.service.impl;
 
-import org.apache.eventmesh.openconnect.offsetmgmt.api.data.RecordOffset;
-import org.apache.eventmesh.openconnect.offsetmgmt.api.data.RecordPartition;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshJobInfo;
+import org.apache.eventmesh.admin.server.web.db.mapper.EventMeshJobInfoMapper;
+import org.apache.eventmesh.admin.server.web.db.service.EventMeshJobInfoService;
 
-import java.util.Collection;
-import java.util.Map;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import lombok.extern.slf4j.Slf4j;
 
 /**
- * OffsetStorageReader
+ * for table 'event_mesh_job_info' db operation
+ * 2024-05-09 15:51:45
  */
-public interface OffsetStorageReader {
+@Service
+@Slf4j
+public class EventMeshJobInfoServiceImpl extends ServiceImpl<EventMeshJobInfoMapper, EventMeshJobInfo>
+    implements EventMeshJobInfoService {
+
+}
+
 
-    RecordOffset readOffset(RecordPartition recordPartition);
 
-    Map<RecordPartition, RecordOffset> readOffsets(Collection<RecordPartition> collection);
 
-}
diff --git a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageWriter.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/impl/EventMeshMysqlPositionServiceImpl.java
similarity index 53%
copy from eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageWriter.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/impl/EventMeshMysqlPositionServiceImpl.java
index f8b6bdc45..353443b78 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageWriter.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/impl/EventMeshMysqlPositionServiceImpl.java
@@ -15,20 +15,29 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.offsetmgmt.api.storage;
+package org.apache.eventmesh.admin.server.web.db.service.impl;
 
-import org.apache.eventmesh.openconnect.offsetmgmt.api.data.RecordOffset;
-import org.apache.eventmesh.openconnect.offsetmgmt.api.data.RecordPartition;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshMysqlPosition;
+import org.apache.eventmesh.admin.server.web.db.mapper.EventMeshMysqlPositionMapper;
+import org.apache.eventmesh.admin.server.web.db.service.EventMeshMysqlPositionService;
 
-import java.util.Map;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import lombok.extern.slf4j.Slf4j;
 
 /**
- * OffsetStorageWriter
+ * for table 'event_mesh_mysql_position' db operation
+ * 2024-05-14 17:15:03
  */
-public interface OffsetStorageWriter {
+@Service
+@Slf4j
+public class EventMeshMysqlPositionServiceImpl extends ServiceImpl<EventMeshMysqlPositionMapper, EventMeshMysqlPosition>
+    implements EventMeshMysqlPositionService {
+
+}
+
 
-    void writeOffset(RecordPartition recordPartition, RecordOffset recordOffset);
 
-    void writeOffset(Map<RecordPartition, RecordOffset> map);
 
-}
diff --git a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageWriter.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/impl/EventMeshPositionReporterHistoryServiceImpl.java
similarity index 51%
copy from eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageWriter.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/impl/EventMeshPositionReporterHistoryServiceImpl.java
index f8b6bdc45..d546e412b 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageWriter.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/impl/EventMeshPositionReporterHistoryServiceImpl.java
@@ -15,20 +15,26 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.offsetmgmt.api.storage;
+package org.apache.eventmesh.admin.server.web.db.service.impl;
 
-import org.apache.eventmesh.openconnect.offsetmgmt.api.data.RecordOffset;
-import org.apache.eventmesh.openconnect.offsetmgmt.api.data.RecordPartition;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshPositionReporterHistory;
+import org.apache.eventmesh.admin.server.web.db.mapper.EventMeshPositionReporterHistoryMapper;
+import org.apache.eventmesh.admin.server.web.db.service.EventMeshPositionReporterHistoryService;
 
-import java.util.Map;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
 /**
- * OffsetStorageWriter
+ * for table 'event_mesh_position_reporter_history' db operation
+ * 2024-05-14 17:15:03
  */
-public interface OffsetStorageWriter {
+@Service
+public class EventMeshPositionReporterHistoryServiceImpl extends ServiceImpl<EventMeshPositionReporterHistoryMapper, EventMeshPositionReporterHistory>
+    implements EventMeshPositionReporterHistoryService {
+
+}
+
 
-    void writeOffset(RecordPartition recordPartition, RecordOffset recordOffset);
 
-    void writeOffset(Map<RecordPartition, RecordOffset> map);
 
-}
diff --git a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageWriter.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/impl/EventMeshRuntimeHeartbeatServiceImpl.java
similarity index 52%
copy from eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageWriter.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/impl/EventMeshRuntimeHeartbeatServiceImpl.java
index f8b6bdc45..452569e3a 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageWriter.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/impl/EventMeshRuntimeHeartbeatServiceImpl.java
@@ -15,20 +15,29 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.offsetmgmt.api.storage;
+package org.apache.eventmesh.admin.server.web.db.service.impl;
 
-import org.apache.eventmesh.openconnect.offsetmgmt.api.data.RecordOffset;
-import org.apache.eventmesh.openconnect.offsetmgmt.api.data.RecordPartition;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshRuntimeHeartbeat;
+import org.apache.eventmesh.admin.server.web.db.mapper.EventMeshRuntimeHeartbeatMapper;
+import org.apache.eventmesh.admin.server.web.db.service.EventMeshRuntimeHeartbeatService;
 
-import java.util.Map;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import lombok.extern.slf4j.Slf4j;
 
 /**
- * OffsetStorageWriter
+ * for table 'event_mesh_runtime_heartbeat' db operation
+ * 2024-05-14 17:15:03
  */
-public interface OffsetStorageWriter {
+@Service
+@Slf4j
+public class EventMeshRuntimeHeartbeatServiceImpl extends ServiceImpl<EventMeshRuntimeHeartbeatMapper, EventMeshRuntimeHeartbeat>
+    implements EventMeshRuntimeHeartbeatService {
+
+}
+
 
-    void writeOffset(RecordPartition recordPartition, RecordOffset recordOffset);
 
-    void writeOffset(Map<RecordPartition, RecordOffset> map);
 
-}
diff --git a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageReader.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/impl/EventMeshRuntimeHistoryServiceImpl.java
similarity index 54%
copy from eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageReader.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/impl/EventMeshRuntimeHistoryServiceImpl.java
index dc17e2984..d39e868ce 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/storage/OffsetStorageReader.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/db/service/impl/EventMeshRuntimeHistoryServiceImpl.java
@@ -15,21 +15,26 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.offsetmgmt.api.storage;
+package org.apache.eventmesh.admin.server.web.db.service.impl;
 
-import org.apache.eventmesh.openconnect.offsetmgmt.api.data.RecordOffset;
-import org.apache.eventmesh.openconnect.offsetmgmt.api.data.RecordPartition;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshRuntimeHistory;
+import org.apache.eventmesh.admin.server.web.db.mapper.EventMeshRuntimeHistoryMapper;
+import org.apache.eventmesh.admin.server.web.db.service.EventMeshRuntimeHistoryService;
 
-import java.util.Collection;
-import java.util.Map;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
 /**
- * OffsetStorageReader
+ * for table 'event_mesh_runtime_history' db operation
+ * 2024-05-14 17:15:03
  */
-public interface OffsetStorageReader {
+@Service
+public class EventMeshRuntimeHistoryServiceImpl extends ServiceImpl<EventMeshRuntimeHistoryMapper, EventMeshRuntimeHistory>
+    implements EventMeshRuntimeHistoryService {
+
+}
+
 
-    RecordOffset readOffset(RecordPartition recordPartition);
 
-    Map<RecordPartition, RecordOffset> readOffsets(Collection<RecordPartition> collection);
 
-}
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SourceConnector.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/handler/BaseRequestHandler.java
similarity index 59%
copy from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SourceConnector.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/handler/BaseRequestHandler.java
index 100612662..7f08f388c 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SourceConnector.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/handler/BaseRequestHandler.java
@@ -15,16 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.connector;
+package org.apache.eventmesh.admin.server.web.handler;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
-import org.apache.eventmesh.openconnect.api.source.Source;
+import org.apache.eventmesh.common.protocol.grpc.adminserver.Metadata;
+import org.apache.eventmesh.common.remote.request.BaseRemoteRequest;
+import org.apache.eventmesh.common.remote.response.BaseRemoteResponse;
 
-public abstract class SourceConnector implements Source {
+public abstract class BaseRequestHandler<T extends BaseRemoteRequest, S extends BaseRemoteResponse> {
 
-    private final SourceConfig sourceConfig;
-
-    protected SourceConnector(SourceConfig sourceConfig) {
-        this.sourceConfig = sourceConfig;
+    public BaseRemoteResponse handlerRequest(T request, Metadata metadata) {
+        return handler(request, metadata);
     }
+
+    protected abstract S handler(T request, Metadata metadata);
 }
diff --git a/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/handler/RequestHandlerFactory.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/handler/RequestHandlerFactory.java
new file mode 100644
index 000000000..9375fb537
--- /dev/null
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/handler/RequestHandlerFactory.java
@@ -0,0 +1,65 @@
+/*
+ * 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.eventmesh.admin.server.web.handler;
+
+import org.apache.eventmesh.common.remote.request.BaseRemoteRequest;
+import org.apache.eventmesh.common.remote.response.BaseRemoteResponse;
+
+import java.lang.reflect.ParameterizedType;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.event.ContextRefreshedEvent;
+import org.springframework.stereotype.Component;
+
+@Component
+public class RequestHandlerFactory implements ApplicationListener<ContextRefreshedEvent> {
+
+    private final Map<String, BaseRequestHandler<BaseRemoteRequest, BaseRemoteResponse>> handlers =
+        new ConcurrentHashMap<>();
+
+    public BaseRequestHandler<BaseRemoteRequest, BaseRemoteResponse> getHandler(String type) {
+        return handlers.get(type);
+    }
+
+    @Override
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    public void onApplicationEvent(ContextRefreshedEvent event) {
+        Map<String, BaseRequestHandler> beans =
+            event.getApplicationContext().getBeansOfType(BaseRequestHandler.class);
+
+        for (BaseRequestHandler<BaseRemoteRequest, BaseRemoteResponse> requestHandler : beans.values()) {
+            Class<?> clazz = requestHandler.getClass();
+            boolean skip = false;
+            while (!clazz.getSuperclass().equals(BaseRequestHandler.class)) {
+                if (clazz.getSuperclass().equals(Object.class)) {
+                    skip = true;
+                    break;
+                }
+                clazz = clazz.getSuperclass();
+            }
+            if (skip) {
+                continue;
+            }
+
+            Class c = (Class) ((ParameterizedType) clazz.getGenericSuperclass()).getActualTypeArguments()[0];
+            handlers.putIfAbsent(c.getSimpleName(), requestHandler);
+        }
+    }
+}
diff --git a/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/handler/impl/FetchJobRequestHandler.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/handler/impl/FetchJobRequestHandler.java
new file mode 100644
index 000000000..56f9f047b
--- /dev/null
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/handler/impl/FetchJobRequestHandler.java
@@ -0,0 +1,71 @@
+/*
+ * 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.eventmesh.admin.server.web.handler.impl;
+
+import org.apache.eventmesh.admin.server.AdminServerRuntimeException;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshJobDetail;
+import org.apache.eventmesh.admin.server.web.handler.BaseRequestHandler;
+import org.apache.eventmesh.admin.server.web.service.job.EventMeshJobInfoBizService;
+import org.apache.eventmesh.common.protocol.grpc.adminserver.Metadata;
+import org.apache.eventmesh.common.remote.exception.ErrorCode;
+import org.apache.eventmesh.common.remote.request.FetchJobRequest;
+import org.apache.eventmesh.common.remote.response.FetchJobResponse;
+
+import org.apache.commons.lang3.StringUtils;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Component
+@Slf4j
+public class FetchJobRequestHandler extends BaseRequestHandler<FetchJobRequest, FetchJobResponse> {
+
+    @Autowired
+    EventMeshJobInfoBizService jobInfoBizService;
+
+    @Override
+    public FetchJobResponse handler(FetchJobRequest request, Metadata metadata) {
+        if (StringUtils.isBlank(request.getJobID())) {
+            throw new AdminServerRuntimeException(ErrorCode.BAD_REQUEST, "job id is empty");
+        }
+        int jobID;
+        try {
+            jobID = Integer.parseInt(request.getJobID());
+        } catch (NumberFormatException e) {
+            throw new AdminServerRuntimeException(ErrorCode.BAD_REQUEST, String.format("illegal job id %s",
+                request.getJobID()));
+        }
+        FetchJobResponse response = FetchJobResponse.successResponse();
+        EventMeshJobDetail detail = jobInfoBizService.getJobDetail(request, metadata);
+        if (detail == null) {
+            return response;
+        }
+        response.setId(detail.getId());
+        response.setName(detail.getName());
+        response.setSourceConnectorConfig(detail.getSourceConnectorConfig());
+        response.setSourceConnectorDesc(detail.getSourceConnectorDesc());
+        response.setTransportType(detail.getTransportType());
+        response.setSinkConnectorConfig(detail.getSinkConnectorConfig());
+        response.setSourceConnectorDesc(detail.getSinkConnectorDesc());
+        response.setState(detail.getState());
+        response.setPosition(detail.getPosition());
+        return response;
+    }
+}
diff --git a/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/handler/impl/FetchPositionHandler.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/handler/impl/FetchPositionHandler.java
new file mode 100644
index 000000000..2e6fa31f0
--- /dev/null
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/handler/impl/FetchPositionHandler.java
@@ -0,0 +1,56 @@
+/*
+ * 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.eventmesh.admin.server.web.handler.impl;
+
+import org.apache.eventmesh.admin.server.AdminServerRuntimeException;
+import org.apache.eventmesh.admin.server.web.db.DBThreadPool;
+import org.apache.eventmesh.admin.server.web.handler.BaseRequestHandler;
+import org.apache.eventmesh.admin.server.web.service.position.EventMeshPositionBizService;
+import org.apache.eventmesh.common.protocol.grpc.adminserver.Metadata;
+import org.apache.eventmesh.common.remote.exception.ErrorCode;
+import org.apache.eventmesh.common.remote.request.FetchPositionRequest;
+import org.apache.eventmesh.common.remote.response.FetchPositionResponse;
+
+import org.apache.commons.lang3.StringUtils;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Component
+@Slf4j
+public class FetchPositionHandler extends BaseRequestHandler<FetchPositionRequest, FetchPositionResponse> {
+
+    @Autowired
+    DBThreadPool executor;
+
+    @Autowired
+    EventMeshPositionBizService positionBizService;
+
+    @Override
+    protected FetchPositionResponse handler(FetchPositionRequest request, Metadata metadata) {
+        if (request.getDataSourceType() == null) {
+            throw new AdminServerRuntimeException(ErrorCode.BAD_REQUEST, "illegal data type, it's empty");
+        }
+        if (StringUtils.isBlank(request.getJobID())) {
+            throw new AdminServerRuntimeException(ErrorCode.BAD_REQUEST, "illegal job id, it's empty");
+        }
+        return FetchPositionResponse.successResponse(positionBizService.getPosition(request, metadata));
+    }
+}
diff --git a/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/handler/impl/ReportHeartBeatHandler.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/handler/impl/ReportHeartBeatHandler.java
new file mode 100644
index 000000000..32c9ca21b
--- /dev/null
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/handler/impl/ReportHeartBeatHandler.java
@@ -0,0 +1,70 @@
+/*
+ * 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.eventmesh.admin.server.web.handler.impl;
+
+import org.apache.eventmesh.admin.server.web.db.DBThreadPool;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshRuntimeHeartbeat;
+import org.apache.eventmesh.admin.server.web.handler.BaseRequestHandler;
+import org.apache.eventmesh.admin.server.web.service.heatbeat.EventMeshRuntimeHeartbeatBizService;
+import org.apache.eventmesh.common.protocol.grpc.adminserver.Metadata;
+import org.apache.eventmesh.common.remote.request.ReportHeartBeatRequest;
+import org.apache.eventmesh.common.remote.response.EmptyAckResponse;
+import org.apache.eventmesh.common.utils.IPUtils;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Component
+@Slf4j
+public class ReportHeartBeatHandler extends BaseRequestHandler<ReportHeartBeatRequest, EmptyAckResponse> {
+
+    @Autowired
+    EventMeshRuntimeHeartbeatBizService heartbeatBizService;
+
+    @Autowired
+    DBThreadPool executor;
+
+    @Override
+    protected EmptyAckResponse handler(ReportHeartBeatRequest request, Metadata metadata) {
+        executor.getExecutors().execute(() -> {
+            EventMeshRuntimeHeartbeat heartbeat = new EventMeshRuntimeHeartbeat();
+            int job;
+            try {
+                job = Integer.parseInt(request.getJobID());
+            } catch (NumberFormatException e) {
+                log.warn("runtime {} report heartbeat fail, illegal job id {}", request.getAddress(), request.getJobID());
+                return;
+            }
+            heartbeat.setJobID(job);
+            heartbeat.setReportTime(request.getReportedTimeStamp());
+            heartbeat.setAdminAddr(IPUtils.getLocalAddress());
+            heartbeat.setRuntimeAddr(request.getAddress());
+            try {
+                if (!heartbeatBizService.saveOrUpdateByRuntimeAddress(heartbeat)) {
+                    log.warn("save or update heartbeat request [{}] fail", request);
+                }
+            } catch (Exception e) {
+                log.warn("save or update heartbeat request [{}] fail", request, e);
+            }
+        });
+
+        return new EmptyAckResponse();
+    }
+}
diff --git a/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/handler/impl/ReportPositionHandler.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/handler/impl/ReportPositionHandler.java
new file mode 100644
index 000000000..adfe11013
--- /dev/null
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/handler/impl/ReportPositionHandler.java
@@ -0,0 +1,102 @@
+/*
+ * 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.eventmesh.admin.server.web.handler.impl;
+
+import org.apache.eventmesh.admin.server.AdminServerRuntimeException;
+import org.apache.eventmesh.admin.server.web.db.DBThreadPool;
+import org.apache.eventmesh.admin.server.web.handler.BaseRequestHandler;
+import org.apache.eventmesh.admin.server.web.service.job.EventMeshJobInfoBizService;
+import org.apache.eventmesh.admin.server.web.service.position.EventMeshPositionBizService;
+import org.apache.eventmesh.common.protocol.grpc.adminserver.Metadata;
+import org.apache.eventmesh.common.remote.exception.ErrorCode;
+import org.apache.eventmesh.common.remote.request.ReportPositionRequest;
+import org.apache.eventmesh.common.remote.response.EmptyAckResponse;
+
+import org.apache.commons.lang3.StringUtils;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Component
+@Slf4j
+public class ReportPositionHandler extends BaseRequestHandler<ReportPositionRequest, EmptyAckResponse> {
+
+    @Autowired
+    EventMeshJobInfoBizService jobInfoBizService;
+
+    @Autowired
+    DBThreadPool executor;
+
+    @Autowired
+    EventMeshPositionBizService positionBizService;
+
+
+    @Override
+    protected EmptyAckResponse handler(ReportPositionRequest request, Metadata metadata) {
+        if (request.getDataSourceType() == null) {
+            throw new AdminServerRuntimeException(ErrorCode.BAD_REQUEST, "illegal data type, it's empty");
+        }
+        if (StringUtils.isBlank(request.getJobID())) {
+            throw new AdminServerRuntimeException(ErrorCode.BAD_REQUEST, "illegal job id, it's empty");
+        }
+        if (request.getRecordPositionList() == null || request.getRecordPositionList().isEmpty()) {
+            throw new AdminServerRuntimeException(ErrorCode.BAD_REQUEST, "illegal record position list, it's empty");
+        }
+        int jobID;
+
+        try {
+            jobID = Integer.parseInt(request.getJobID());
+        } catch (NumberFormatException e) {
+            throw new AdminServerRuntimeException(ErrorCode.BAD_REQUEST, String.format("illegal job id [%s] format",
+                request.getJobID()));
+        }
+
+        positionBizService.isValidatePositionRequest(request.getDataSourceType());
+
+        executor.getExecutors().execute(() -> {
+            try {
+                boolean reported = positionBizService.reportPosition(request, metadata);
+                if (reported) {
+                    if (log.isDebugEnabled()) {
+                        log.debug("handle runtime [{}] report data type [{}] job [{}] position [{}] success",
+                            request.getAddress(), request.getDataSourceType(), request.getJobID(),
+                            request.getRecordPositionList());
+                    }
+                } else {
+                    log.warn("handle runtime [{}] report data type [{}] job [{}] position [{}] fail",
+                        request.getAddress(), request.getDataSourceType(), request.getJobID(),
+                        request.getRecordPositionList());
+                }
+            } catch (Exception e) {
+                log.warn("handle position request fail, request [{}]", request, e);
+            } finally {
+                try {
+                    if (!jobInfoBizService.updateJobState(jobID, request.getState())) {
+                        log.warn("update job [{}] state to [{}] fail", jobID, request.getState());
+                    }
+                } catch (Exception e) {
+                    log.warn("update job id [{}] type [{}] state [{}] fail", request.getJobID(),
+                        request.getDataSourceType(), request.getState(), e);
+                }
+            }
+        });
+        return new EmptyAckResponse();
+    }
+}
diff --git a/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/heatbeat/EventMeshRuntimeHeartbeatBizService.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/heatbeat/EventMeshRuntimeHeartbeatBizService.java
new file mode 100644
index 000000000..4fa80b270
--- /dev/null
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/heatbeat/EventMeshRuntimeHeartbeatBizService.java
@@ -0,0 +1,81 @@
+/*
+ * 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.eventmesh.admin.server.web.service.heatbeat;
+
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshRuntimeHeartbeat;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshRuntimeHistory;
+import org.apache.eventmesh.admin.server.web.db.service.EventMeshRuntimeHeartbeatService;
+import org.apache.eventmesh.admin.server.web.db.service.EventMeshRuntimeHistoryService;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * for table 'event_mesh_runtime_heartbeat' db operation 2024-05-14 17:15:03
+ */
+@Service
+@Slf4j
+public class EventMeshRuntimeHeartbeatBizService {
+
+    @Autowired
+    EventMeshRuntimeHistoryService historyService;
+
+    @Autowired
+    EventMeshRuntimeHeartbeatService heartbeatService;
+
+    public boolean saveOrUpdateByRuntimeAddress(EventMeshRuntimeHeartbeat entity) {
+        EventMeshRuntimeHeartbeat old = heartbeatService.getOne(Wrappers.<EventMeshRuntimeHeartbeat>query().eq(
+            "runtimeAddr",
+            entity.getRuntimeAddr()));
+        if (old == null) {
+            return heartbeatService.save(entity);
+        } else {
+            if (Long.parseLong(old.getReportTime()) >= Long.parseLong(entity.getReportTime())) {
+                log.info("update heartbeat record ignore, current report time late than db, job [{}], remote [{}]", entity.getJobID(),
+                    entity.getRuntimeAddr());
+                return true;
+            }
+            try {
+                return heartbeatService.update(entity, Wrappers.<EventMeshRuntimeHeartbeat>update().eq("updateTime",
+                    old.getUpdateTime()));
+            } finally {
+                if (old.getJobID() != null && !old.getJobID().equals(entity.getJobID())) {
+                    EventMeshRuntimeHistory history = new EventMeshRuntimeHistory();
+                    history.setAddress(old.getAdminAddr());
+                    history.setJob(old.getJobID());
+                    try {
+                        historyService.save(history);
+                    } catch (Exception e) {
+                        log.warn("save runtime job changed history fail", e);
+                    }
+
+                    log.info("runtime [{}] changed job, old job [{}], now [{}]", entity.getRuntimeAddr(), old.getJobID(),
+                        entity.getJobID());
+                }
+            }
+        }
+    }
+}
+
+
+
+
diff --git a/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/job/EventMeshJobInfoBizService.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/job/EventMeshJobInfoBizService.java
new file mode 100644
index 000000000..79771cbf2
--- /dev/null
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/job/EventMeshJobInfoBizService.java
@@ -0,0 +1,133 @@
+/*
+ * 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.eventmesh.admin.server.web.service.job;
+
+import org.apache.eventmesh.admin.server.AdminServerRuntimeException;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshDataSource;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshJobDetail;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshJobInfo;
+import org.apache.eventmesh.admin.server.web.db.service.EventMeshDataSourceService;
+import org.apache.eventmesh.admin.server.web.db.service.EventMeshJobInfoService;
+import org.apache.eventmesh.admin.server.web.service.position.EventMeshPositionBizService;
+import org.apache.eventmesh.common.protocol.grpc.adminserver.Metadata;
+import org.apache.eventmesh.common.remote.JobState;
+import org.apache.eventmesh.common.remote.exception.ErrorCode;
+import org.apache.eventmesh.common.remote.job.DataSourceType;
+import org.apache.eventmesh.common.remote.job.JobTransportType;
+import org.apache.eventmesh.common.remote.request.FetchJobRequest;
+import org.apache.eventmesh.common.utils.JsonUtils;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fasterxml.jackson.core.type.TypeReference;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * for table 'event_mesh_job_info' db operation
+ * 2024-05-09 15:51:45
+ */
+@Service
+@Slf4j
+public class EventMeshJobInfoBizService {
+
+    @Autowired
+    EventMeshJobInfoService jobInfoService;
+
+    @Autowired
+    EventMeshDataSourceService dataSourceService;
+
+    @Autowired
+    EventMeshPositionBizService positionBizService;
+
+    public boolean updateJobState(Integer jobID, JobState state) {
+        if (jobID == null || state == null) {
+            return false;
+        }
+        EventMeshJobInfo jobInfo = new EventMeshJobInfo();
+        jobInfo.setJobID(jobID);
+        jobInfo.setState(state.ordinal());
+        jobInfoService.update(jobInfo, Wrappers.<EventMeshJobInfo>update().notIn("state", JobState.DELETE.ordinal(),
+            JobState.COMPLETE.ordinal()));
+        return true;
+    }
+
+    public EventMeshJobDetail getJobDetail(FetchJobRequest request, Metadata metadata) {
+        if (request == null) {
+            return null;
+        }
+        EventMeshJobInfo job = jobInfoService.getById(request.getJobID());
+        if (job == null) {
+            return null;
+        }
+        EventMeshJobDetail detail = new EventMeshJobDetail();
+        detail.setId(job.getJobID());
+        detail.setName(job.getName());
+        EventMeshDataSource source = dataSourceService.getById(job.getSourceData());
+        EventMeshDataSource target = dataSourceService.getById(job.getTargetData());
+        if (source != null) {
+            if (!StringUtils.isBlank(source.getConfiguration())) {
+                try {
+                    detail.setSourceConnectorConfig(JsonUtils.parseTypeReferenceObject(source.getConfiguration(),
+                        new TypeReference<Map<String, Object>>() {
+                        }));
+                } catch (Exception e) {
+                    log.warn("parse source config id [{}] fail", job.getSourceData(), e);
+                    throw new AdminServerRuntimeException(ErrorCode.BAD_DB_DATA, "illegal source data source config");
+                }
+            }
+            detail.setSourceConnectorDesc(source.getDescription());
+            if (source.getDataType() != null) {
+                detail.setPosition(positionBizService.getPositionByJobID(job.getJobID(),
+                    DataSourceType.getDataSourceType(source.getDataType())));
+
+            }
+        }
+        if (target != null) {
+            if (!StringUtils.isBlank(target.getConfiguration())) {
+                try {
+                    detail.setSinkConnectorConfig(JsonUtils.parseTypeReferenceObject(target.getConfiguration(),
+                        new TypeReference<Map<String, Object>>() {
+                        }));
+                } catch (Exception e) {
+                    log.warn("parse sink config id [{}] fail", job.getSourceData(), e);
+                    throw new AdminServerRuntimeException(ErrorCode.BAD_DB_DATA, "illegal target data sink config");
+                }
+            }
+            detail.setSinkConnectorDesc(target.getDescription());
+        }
+
+        JobState state = JobState.fromIndex(job.getState());
+        if (state == null) {
+            throw new AdminServerRuntimeException(ErrorCode.BAD_DB_DATA, "illegal job state in db");
+        }
+        detail.setState(state);
+        detail.setTransportType(JobTransportType.getJobTransportType(job.getTransportType()));
+        return detail;
+    }
+}
+
+
+
+
diff --git a/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/position/EventMeshPositionBizService.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/position/EventMeshPositionBizService.java
new file mode 100644
index 000000000..7d6febdf4
--- /dev/null
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/position/EventMeshPositionBizService.java
@@ -0,0 +1,81 @@
+/*
+ * 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.eventmesh.admin.server.web.service.position;
+
+import org.apache.eventmesh.admin.server.AdminServerRuntimeException;
+import org.apache.eventmesh.common.protocol.grpc.adminserver.Metadata;
+import org.apache.eventmesh.common.remote.exception.ErrorCode;
+import org.apache.eventmesh.common.remote.job.DataSourceType;
+import org.apache.eventmesh.common.remote.offset.RecordPosition;
+import org.apache.eventmesh.common.remote.request.FetchPositionRequest;
+import org.apache.eventmesh.common.remote.request.ReportPositionRequest;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Service
+@Slf4j
+public class EventMeshPositionBizService {
+
+    @Autowired
+    PositionHandlerFactory factory;
+
+    // called isValidateReportRequest before call this
+    public RecordPosition getPosition(FetchPositionRequest request, Metadata metadata) {
+        if (request == null) {
+            return null;
+        }
+        isValidatePositionRequest(request.getDataSourceType());
+        IFetchPositionHandler handler = factory.getHandler(request.getDataSourceType());
+        return handler.handler(request, metadata);
+    }
+
+    public void isValidatePositionRequest(DataSourceType type) {
+        if (type == null) {
+            throw new AdminServerRuntimeException(ErrorCode.BAD_REQUEST, "data source type is null");
+        }
+        IReportPositionHandler handler = factory.getHandler(type);
+        if (handler == null) {
+            throw new AdminServerRuntimeException(ErrorCode.BAD_REQUEST,
+                String.format("illegal data base type [%s], it not match any report position handler", type));
+        }
+    }
+
+    // called isValidateReportRequest before call this
+    public boolean reportPosition(ReportPositionRequest request, Metadata metadata) {
+        if (request == null) {
+            return false;
+        }
+        isValidatePositionRequest(request.getDataSourceType());
+        IReportPositionHandler handler = factory.getHandler(request.getDataSourceType());
+        return handler.handler(request, metadata);
+    }
+
+    public RecordPosition getPositionByJobID(Integer jobID, DataSourceType type) {
+        if (jobID == null || type == null) {
+            return null;
+        }
+        isValidatePositionRequest(type);
+        PositionHandler handler = factory.getHandler(type);
+        FetchPositionRequest request = new FetchPositionRequest();
+        request.setJobID(String.valueOf(jobID));
+        return handler.handler(request, null);
+    }
+}
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/position/IFetchPositionHandler.java
similarity index 66%
copy from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/position/IFetchPositionHandler.java
index a7aef4fff..9a4c324dc 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/position/IFetchPositionHandler.java
@@ -15,18 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.connector;
+package org.apache.eventmesh.admin.server.web.service.position;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
-
-import lombok.Data;
+import org.apache.eventmesh.common.protocol.grpc.adminserver.Metadata;
+import org.apache.eventmesh.common.remote.offset.RecordPosition;
+import org.apache.eventmesh.common.remote.request.FetchPositionRequest;
 
 /**
- * Sink Connector Context
+ * IFetchPositionHandler
  */
-@Data
-public class SinkConnectorContext implements ConnectorContext {
-
-    public SinkConfig sinkConfig;
+public interface IFetchPositionHandler {
 
+    RecordPosition handler(FetchPositionRequest request, Metadata metadata);
 }
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/position/IReportPositionHandler.java
similarity index 70%
copy from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/position/IReportPositionHandler.java
index a7aef4fff..75f392e39 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnectorContext.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/position/IReportPositionHandler.java
@@ -15,18 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.connector;
+package org.apache.eventmesh.admin.server.web.service.position;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
-
-import lombok.Data;
+import org.apache.eventmesh.common.protocol.grpc.adminserver.Metadata;
+import org.apache.eventmesh.common.remote.request.ReportPositionRequest;
 
 /**
- * Sink Connector Context
+ * IReportPositionHandler
  */
-@Data
-public class SinkConnectorContext implements ConnectorContext {
-
-    public SinkConfig sinkConfig;
+public interface IReportPositionHandler {
 
+    boolean handler(ReportPositionRequest request, Metadata metadata);
 }
diff --git a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/SourceConnectorConfig.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/position/PositionHandler.java
similarity index 74%
copy from eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/SourceConnectorConfig.java
copy to eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/position/PositionHandler.java
index 6376a7fb4..921b0b2e5 100644
--- a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/SourceConnectorConfig.java
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/position/PositionHandler.java
@@ -15,14 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.file.source.config;
+package org.apache.eventmesh.admin.server.web.service.position;
 
-import lombok.Data;
+import org.apache.eventmesh.common.remote.job.DataSourceType;
 
-@Data
-public class SourceConnectorConfig {
+public abstract class PositionHandler implements IReportPositionHandler, IFetchPositionHandler {
 
-    private String connectorName;
-
-    private String filePath;
+    protected abstract DataSourceType getSourceType();
 }
diff --git a/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/position/PositionHandlerFactory.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/position/PositionHandlerFactory.java
new file mode 100644
index 000000000..751291351
--- /dev/null
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/position/PositionHandlerFactory.java
@@ -0,0 +1,56 @@
+/*
+ * 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.eventmesh.admin.server.web.service.position;
+
+import org.apache.eventmesh.common.remote.job.DataSourceType;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.event.ContextRefreshedEvent;
+import org.springframework.stereotype.Component;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Component
+@Slf4j
+public class PositionHandlerFactory implements ApplicationListener<ContextRefreshedEvent> {
+
+    private final Map<DataSourceType, PositionHandler> handlers =
+        new ConcurrentHashMap<>();
+
+    public PositionHandler getHandler(DataSourceType type) {
+        return handlers.get(type);
+    }
+
+    @Override
+    public void onApplicationEvent(ContextRefreshedEvent event) {
+        Map<String, PositionHandler> beans =
+            event.getApplicationContext().getBeansOfType(PositionHandler.class);
+
+        for (PositionHandler handler : beans.values()) {
+            DataSourceType type = handler.getSourceType();
+            if (handlers.containsKey(type)) {
+                log.warn("data source type [{}] handler already exists", type);
+                continue;
+            }
+            handlers.put(type, handler);
+        }
+    }
+}
diff --git a/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/position/impl/MysqlPositionHandler.java b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/position/impl/MysqlPositionHandler.java
new file mode 100644
index 000000000..623864fa6
--- /dev/null
+++ b/eventmesh-admin-server/src/main/java/org/apache/eventmesh/admin/server/web/service/position/impl/MysqlPositionHandler.java
@@ -0,0 +1,161 @@
+/*
+ * 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.eventmesh.admin.server.web.service.position.impl;
+
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshMysqlPosition;
+import org.apache.eventmesh.admin.server.web.db.entity.EventMeshPositionReporterHistory;
+import org.apache.eventmesh.admin.server.web.db.service.EventMeshMysqlPositionService;
+import org.apache.eventmesh.admin.server.web.db.service.EventMeshPositionReporterHistoryService;
+import org.apache.eventmesh.admin.server.web.service.position.PositionHandler;
+import org.apache.eventmesh.common.protocol.grpc.adminserver.Metadata;
+import org.apache.eventmesh.common.remote.job.DataSourceType;
+import org.apache.eventmesh.common.remote.offset.RecordPosition;
+import org.apache.eventmesh.common.remote.offset.canal.CanalRecordOffset;
+import org.apache.eventmesh.common.remote.offset.canal.CanalRecordPartition;
+import org.apache.eventmesh.common.remote.request.FetchPositionRequest;
+import org.apache.eventmesh.common.remote.request.ReportPositionRequest;
+import org.apache.eventmesh.common.utils.JsonUtils;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.stereotype.Component;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Component
+@Slf4j
+public class MysqlPositionHandler extends PositionHandler {
+
+    @Autowired
+    EventMeshMysqlPositionService positionService;
+
+    @Autowired
+    EventMeshPositionReporterHistoryService historyService;
+
+    @Override
+    protected DataSourceType getSourceType() {
+        return DataSourceType.MYSQL;
+    }
+
+    public boolean saveOrUpdateByJob(EventMeshMysqlPosition position) {
+        EventMeshMysqlPosition old = positionService.getOne(Wrappers.<EventMeshMysqlPosition>query().eq("jobId",
+            position.getJobID()));
+        if (old == null) {
+            return positionService.save(position);
+        } else {
+            if (old.getPosition() >= position.getPosition()) {
+                log.info("job [{}] report position [{}] by runtime [{}] less than db position [{}] by [{}]",
+                    position.getJobID(), position.getPosition(), position.getAddress(), old.getPosition(), old.getAddress());
+                return true;
+            }
+            try {
+                return positionService.update(position, Wrappers.<EventMeshMysqlPosition>update().eq("updateTime",
+                    old.getUpdateTime()));
+            } finally {
+                if (old.getAddress() != null && !old.getAddress().equals(position.getAddress())) {
+                    EventMeshPositionReporterHistory history = new EventMeshPositionReporterHistory();
+                    history.setRecord(JsonUtils.toJSONString(position));
+                    history.setJob(old.getJobID());
+                    history.setAddress(old.getAddress());
+                    log.info("job [{}] position reporter changed old [{}], now [{}]", position.getJobID(), old, position);
+                    try {
+                        historyService.save(history);
+                    } catch (Exception e) {
+                        log.warn("save job [{}] mysql position reporter changed history fail, now reporter [{}], old [{}]", position.getJobID(),
+                            position.getAddress(), old.getAddress(), e);
+                    }
+                }
+            }
+        }
+    }
+
+    @Override
+    public boolean handler(ReportPositionRequest request, Metadata metadata) {
+        for (int i = 0; i < 3; i++) {
+            try {
+                List<RecordPosition> recordPositionList = request.getRecordPositionList();
+                RecordPosition recordPosition = recordPositionList.get(0);
+                if (recordPosition == null || recordPosition.getRecordPartition() == null || recordPosition.getRecordOffset() == null) {
+                    log.warn("report mysql position, but record-partition/partition/offset is null");
+                    return false;
+                }
+                if (!(recordPosition.getRecordPartition() instanceof CanalRecordPartition)) {
+                    log.warn("report mysql position, but record partition class [{}] not match [{}]",
+                        recordPosition.getRecordPartition().getRecordPartitionClass(), CanalRecordPartition.class);
+                    return false;
+                }
+                if (!(recordPosition.getRecordOffset() instanceof CanalRecordOffset)) {
+                    log.warn("report mysql position, but record offset class [{}] not match [{}]",
+                        recordPosition.getRecordOffset().getRecordOffsetClass(), CanalRecordOffset.class);
+                    return false;
+                }
+                EventMeshMysqlPosition position = new EventMeshMysqlPosition();
+                position.setJobID(Integer.parseInt(request.getJobID()));
+                position.setAddress(request.getAddress());
+                CanalRecordOffset offset = (CanalRecordOffset) recordPosition.getRecordOffset();
+                if (offset != null) {
+                    position.setPosition(offset.getOffset());
+                }
+                CanalRecordPartition partition = (CanalRecordPartition) recordPosition.getRecordPartition();
+                if (partition != null) {
+                    position.setTimestamp(partition.getTimeStamp());
+                    position.setJournalName(partition.getJournalName());
+                }
+                if (!saveOrUpdateByJob(position)) {
+                    log.warn("update job position fail [{}]", request);
+                    return false;
+                }
+                return true;
+            } catch (DuplicateKeyException e) {
+                log.warn("concurrent report position job [{}], it will try again", request.getJobID());
+            } catch (Exception e) {
+                log.warn("save position job [{}] fail", request.getJobID(), e);
+                return false;
+            }
+            try {
+                Thread.sleep(200);
+            } catch (InterruptedException ignore) {
+                log.warn("save position thread interrupted, [{}]", request);
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public RecordPosition handler(FetchPositionRequest request, Metadata metadata) {
+        EventMeshMysqlPosition position = positionService.getOne(Wrappers.<EventMeshMysqlPosition>query().eq("jobID",
+            request.getJobID()));
+        RecordPosition recordPosition = null;
+        if (position != null) {
+            CanalRecordPartition partition = new CanalRecordPartition();
+            partition.setTimeStamp(position.getTimestamp());
+            partition.setJournalName(position.getJournalName());
+            CanalRecordOffset offset = new CanalRecordOffset();
+            offset.setOffset(position.getPosition());
+            recordPosition = new RecordPosition();
+            recordPosition.setRecordPartition(partition);
+            recordPosition.setRecordOffset(offset);
+        }
+        return recordPosition;
+    }
+}
diff --git a/.github/workflows/docker.yml b/eventmesh-admin-server/src/main/resources/META-INF/spring.factories
similarity index 50%
copy from .github/workflows/docker.yml
copy to eventmesh-admin-server/src/main/resources/META-INF/spring.factories
index dfb36970d..0d9e9bae6 100644
--- a/.github/workflows/docker.yml
+++ b/eventmesh-admin-server/src/main/resources/META-INF/spring.factories
@@ -15,36 +15,5 @@
 # limitations under the License.
 #
 
-name: Docker
-on:
-  release:
-    types: [released]
-
-jobs:
-  docker:
-    runs-on: ubuntu-latest
-    steps:
-      - name: Checkout repository
-        uses: actions/checkout@v4
-
-      - name: Login to DockerHub
-        uses: docker/login-action@v3
-        with:
-          username: ${{ secrets.DOCKERHUB_USER }}
-          password: ${{ secrets.DOCKERHUB_TOKEN }}
-
-      - name: Docker meta
-        id: meta
-        uses: docker/metadata-action@v5
-        with:
-          images: |
-            apache/eventmesh
-
-      - name: Build and push
-        uses: docker/build-push-action@v5
-        with:
-          push: true
-          tags: ${{ steps.meta.outputs.tags }}
-          labels: ${{ steps.meta.outputs.labels }}
-          file: ./docker/Dockerfile_jdk8
-          context: ./
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+  org.apache.eventmesh.admin.server.AdminServerProperties
\ No newline at end of file
diff --git a/.github/workflows/docker.yml b/eventmesh-admin-server/src/main/resources/application.yaml
similarity index 50%
copy from .github/workflows/docker.yml
copy to eventmesh-admin-server/src/main/resources/application.yaml
index dfb36970d..ce396a09f 100644
--- a/.github/workflows/docker.yml
+++ b/eventmesh-admin-server/src/main/resources/application.yaml
@@ -15,36 +15,18 @@
 # limitations under the License.
 #
 
-name: Docker
-on:
-  release:
-    types: [released]
-
-jobs:
-  docker:
-    runs-on: ubuntu-latest
-    steps:
-      - name: Checkout repository
-        uses: actions/checkout@v4
-
-      - name: Login to DockerHub
-        uses: docker/login-action@v3
-        with:
-          username: ${{ secrets.DOCKERHUB_USER }}
-          password: ${{ secrets.DOCKERHUB_TOKEN }}
-
-      - name: Docker meta
-        id: meta
-        uses: docker/metadata-action@v5
-        with:
-          images: |
-            apache/eventmesh
-
-      - name: Build and push
-        uses: docker/build-push-action@v5
-        with:
-          push: true
-          tags: ${{ steps.meta.outputs.tags }}
-          labels: ${{ steps.meta.outputs.labels }}
-          file: ./docker/Dockerfile_jdk8
-          context: ./
+spring:
+  datasource:
+    url: jdbc:mysql://localhost:3306/eventmesh?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true
+    username: root
+    password: mike920830
+    driver-class-name: com.mysql.cj.jdbc.Driver
+mybatis-plus:
+  mapper-locations: classpath:mapper/*.xml
+  configuration:
+    map-underscore-to-camel-case: false
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+event-mesh:
+  admin-server:
+    service-name: DEFAULT_GROUP@@em_adm_server
+    port: 8081
\ No newline at end of file
diff --git a/.github/workflows/docker.yml b/eventmesh-admin-server/src/main/resources/eventmesh-admin.properties
similarity index 50%
copy from .github/workflows/docker.yml
copy to eventmesh-admin-server/src/main/resources/eventmesh-admin.properties
index dfb36970d..07a6a212e 100644
--- a/.github/workflows/docker.yml
+++ b/eventmesh-admin-server/src/main/resources/eventmesh-admin.properties
@@ -15,36 +15,5 @@
 # limitations under the License.
 #
 
-name: Docker
-on:
-  release:
-    types: [released]
-
-jobs:
-  docker:
-    runs-on: ubuntu-latest
-    steps:
-      - name: Checkout repository
-        uses: actions/checkout@v4
-
-      - name: Login to DockerHub
-        uses: docker/login-action@v3
-        with:
-          username: ${{ secrets.DOCKERHUB_USER }}
-          password: ${{ secrets.DOCKERHUB_TOKEN }}
-
-      - name: Docker meta
-        id: meta
-        uses: docker/metadata-action@v5
-        with:
-          images: |
-            apache/eventmesh
-
-      - name: Build and push
-        uses: docker/build-push-action@v5
-        with:
-          push: true
-          tags: ${{ steps.meta.outputs.tags }}
-          labels: ${{ steps.meta.outputs.labels }}
-          file: ./docker/Dockerfile_jdk8
-          context: ./
+eventMesh.server.retry.plugin.type=nacos
+eventMesh.registry.plugin.server-addr=localhost:8848
diff --git a/eventmesh-admin-server/src/main/resources/eventmesh.sql b/eventmesh-admin-server/src/main/resources/eventmesh.sql
new file mode 100644
index 000000000..3b6fc9b77
--- /dev/null
+++ b/eventmesh-admin-server/src/main/resources/eventmesh.sql
@@ -0,0 +1,131 @@
+-- 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.
+
+-- --------------------------------------------------------
+-- 主机:                           127.0.0.1
+-- 服务器版本:                        8.0.36 - MySQL Community Server - GPL
+-- 服务器操作系统:                      Win64
+-- HeidiSQL 版本:                  11.3.0.6295
+-- --------------------------------------------------------
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET NAMES utf8 */;
+/*!50503 SET NAMES utf8mb4 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+
+
+-- 导出 eventmesh 的数据库结构
+CREATE DATABASE IF NOT EXISTS `eventmesh` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
+USE `eventmesh`;
+
+-- 导出  表 eventmesh.event_mesh_data_source 结构
+CREATE TABLE IF NOT EXISTS `event_mesh_data_source` (
+  `id` int unsigned NOT NULL AUTO_INCREMENT,
+  `dataType` int unsigned NOT NULL,
+  `description` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+  `configuration` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+  `createUid` int NOT NULL,
+  `updateUid` int NOT NULL,
+  `createTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  `updateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
+
+-- 数据导出被取消选择。
+
+-- 导出  表 eventmesh.event_mesh_job_info 结构
+CREATE TABLE IF NOT EXISTS `event_mesh_job_info` (
+  `jobID` int unsigned NOT NULL AUTO_INCREMENT,
+  `name` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
+  `transportType` int unsigned DEFAULT NULL COMMENT 'JobTransportType',
+  `sourceData` int unsigned DEFAULT NULL COMMENT 'data_source表',
+  `targetData` int unsigned DEFAULT NULL,
+  `state` tinyint unsigned NOT NULL COMMENT 'JobState',
+  `jobType` tinyint unsigned NOT NULL COMMENT 'connector,mesh,func,...',
+  `createUid` int unsigned NOT NULL,
+  `updateUid` int unsigned NOT NULL,
+  `createTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  `updateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+  PRIMARY KEY (`jobID`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
+
+-- 数据导出被取消选择。
+
+-- 导出  表 eventmesh.event_mesh_mysql_position 结构
+CREATE TABLE IF NOT EXISTS `event_mesh_mysql_position` (
+  `id` int unsigned NOT NULL AUTO_INCREMENT,
+  `jobID` int unsigned NOT NULL,
+  `address` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+  `position` bigint DEFAULT NULL,
+  `timestamp` bigint DEFAULT NULL,
+  `journalName` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
+  `createTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  `updateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `jobID` (`jobID`)
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
+
+-- 数据导出被取消选择。
+
+-- 导出  表 eventmesh.event_mesh_position_reporter_history 结构
+CREATE TABLE IF NOT EXISTS `event_mesh_position_reporter_history` (
+  `id` bigint NOT NULL AUTO_INCREMENT,
+  `job` int NOT NULL,
+  `record` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+  `address` varchar(50) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
+  `createTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  PRIMARY KEY (`id`),
+  KEY `job` (`job`),
+  KEY `address` (`address`)
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='记录position上报者变更时,老记录';
+
+-- 数据导出被取消选择。
+
+-- 导出  表 eventmesh.event_mesh_runtime_heartbeat 结构
+CREATE TABLE IF NOT EXISTS `event_mesh_runtime_heartbeat` (
+  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
+  `adminAddr` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+  `runtimeAddr` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+  `jobID` int unsigned DEFAULT NULL,
+  `reportTime` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT 'runtime本地上报时间',
+  `updateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+  `createTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `runtimeAddr` (`runtimeAddr`),
+  KEY `jobID` (`jobID`)
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
+
+-- 数据导出被取消选择。
+
+-- 导出  表 eventmesh.event_mesh_runtime_history 结构
+CREATE TABLE IF NOT EXISTS `event_mesh_runtime_history` (
+  `id` bigint NOT NULL AUTO_INCREMENT,
+  `job` int NOT NULL,
+  `address` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
+  `createTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  PRIMARY KEY (`id`),
+  KEY `address` (`address`)
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='记录runtime上运行任务的变更';
+
+-- 数据导出被取消选择。
+
+/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
+/*!40014 SET FOREIGN_KEY_CHECKS=IFNULL(@OLD_FOREIGN_KEY_CHECKS, 1) */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40111 SET SQL_NOTES=IFNULL(@OLD_SQL_NOTES, 1) */;
diff --git a/eventmesh-admin-server/src/main/resources/mapper/EventMeshDataSourceMapper.xml b/eventmesh-admin-server/src/main/resources/mapper/EventMeshDataSourceMapper.xml
new file mode 100644
index 000000000..dee497c84
--- /dev/null
+++ b/eventmesh-admin-server/src/main/resources/mapper/EventMeshDataSourceMapper.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.apache.eventmesh.admin.server.web.db.mapper.EventMeshDataSourceMapper">
+
+    <resultMap id="BaseResultMap" type="org.apache.eventmesh.admin.server.web.db.entity.EventMeshDataSource">
+            <id property="id" column="id" jdbcType="INTEGER"/>
+            <result property="dataType" column="dataType" jdbcType="INTEGER"/>
+            <result property="description" column="description" jdbcType="VARCHAR"/>
+            <result property="configuration" column="configuration" jdbcType="VARCHAR"/>
+            <result property="createUid" column="createUid" jdbcType="INTEGER"/>
+            <result property="updateUid" column="updateUid" jdbcType="INTEGER"/>
+            <result property="createTime" column="createTime" jdbcType="TIMESTAMP"/>
+            <result property="updateTime" column="updateTime" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,dataType,address,
+        description,configuration,createUid,
+        updateUid,createTime,updateTime
+    </sql>
+</mapper>
diff --git a/eventmesh-admin-server/src/main/resources/mapper/EventMeshJobInfoMapper.xml b/eventmesh-admin-server/src/main/resources/mapper/EventMeshJobInfoMapper.xml
new file mode 100644
index 000000000..e758a276a
--- /dev/null
+++ b/eventmesh-admin-server/src/main/resources/mapper/EventMeshJobInfoMapper.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.apache.eventmesh.admin.server.web.db.mapper.EventMeshJobInfoMapper">
+
+    <resultMap id="BaseResultMap" type="org.apache.eventmesh.admin.server.web.db.entity.EventMeshJobInfo">
+            <id property="jobID" column="jobID" jdbcType="INTEGER"/>
+            <result property="name" column="name" jdbcType="VARCHAR"/>
+            <result property="transportType" column="transportType" jdbcType="INTEGER"/>
+            <result property="sourceData" column="sourceData" jdbcType="INTEGER"/>
+            <result property="targetData" column="targetData" jdbcType="INTEGER"/>
+            <result property="state" column="state" jdbcType="TINYINT"/>
+            <result property="jobType" column="jobType" jdbcType="TINYINT"/>
+            <result property="createUid" column="createUid" jdbcType="INTEGER"/>
+            <result property="updateUid" column="updateUid" jdbcType="INTEGER"/>
+            <result property="createTime" column="createTime" jdbcType="TIMESTAMP"/>
+            <result property="updateTime" column="updateTime" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        jobID,name,transportType,
+        sourceData,targetData,state,
+        runtimeType,createUid,
+        updateUid,createTime,updateTime
+    </sql>
+</mapper>
diff --git a/eventmesh-admin-server/src/main/resources/mapper/EventMeshMysqlPositionMapper.xml b/eventmesh-admin-server/src/main/resources/mapper/EventMeshMysqlPositionMapper.xml
new file mode 100644
index 000000000..bc3a3292a
--- /dev/null
+++ b/eventmesh-admin-server/src/main/resources/mapper/EventMeshMysqlPositionMapper.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.apache.eventmesh.admin.server.web.db.mapper.EventMeshMysqlPositionMapper">
+
+    <resultMap id="BaseResultMap" type="org.apache.eventmesh.admin.server.web.db.entity.EventMeshMysqlPosition">
+            <id property="id" column="id" jdbcType="INTEGER"/>
+            <result property="jobID" column="jobID" jdbcType="INTEGER"/>
+            <result property="address" column="address" jdbcType="VARCHAR"/>
+            <result property="position" column="position" jdbcType="BIGINT"/>
+            <result property="timestamp" column="timestamp" jdbcType="BIGINT"/>
+            <result property="journalName" column="journalName" jdbcType="VARCHAR"/>
+            <result property="createTime" column="createTime" jdbcType="TIMESTAMP"/>
+            <result property="updateTime" column="updateTime" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,jobID,address,
+        position,timestamp,journalName,
+        createTime,updateTime
+    </sql>
+</mapper>
diff --git a/eventmesh-admin-server/src/main/resources/mapper/EventMeshPositionReporterHistoryMapper.xml b/eventmesh-admin-server/src/main/resources/mapper/EventMeshPositionReporterHistoryMapper.xml
new file mode 100644
index 000000000..2ee22e1ad
--- /dev/null
+++ b/eventmesh-admin-server/src/main/resources/mapper/EventMeshPositionReporterHistoryMapper.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.apache.eventmesh.admin.server.web.db.mapper.EventMeshPositionReporterHistoryMapper">
+
+    <resultMap id="BaseResultMap" type="org.apache.eventmesh.admin.server.web.db.entity.EventMeshPositionReporterHistory">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="job" column="job" jdbcType="INTEGER"/>
+            <result property="record" column="record" jdbcType="VARCHAR"/>
+            <result property="address" column="address" jdbcType="VARCHAR"/>
+            <result property="createTime" column="createTime" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,job,record,
+        address,createTime
+    </sql>
+</mapper>
diff --git a/eventmesh-admin-server/src/main/resources/mapper/EventMeshRuntimeHeartbeatMapper.xml b/eventmesh-admin-server/src/main/resources/mapper/EventMeshRuntimeHeartbeatMapper.xml
new file mode 100644
index 000000000..b811c5950
--- /dev/null
+++ b/eventmesh-admin-server/src/main/resources/mapper/EventMeshRuntimeHeartbeatMapper.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.apache.eventmesh.admin.server.web.db.mapper.EventMeshRuntimeHeartbeatMapper">
+
+    <resultMap id="BaseResultMap" type="org.apache.eventmesh.admin.server.web.db.entity.EventMeshRuntimeHeartbeat">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="adminAddr" column="adminAddr" jdbcType="VARCHAR"/>
+            <result property="runtimeAddr" column="runtimeAddr" jdbcType="VARCHAR"/>
+            <result property="jobID" column="jobID" jdbcType="INTEGER"/>
+            <result property="reportTime" column="reportTime" jdbcType="VARCHAR"/>
+            <result property="updateTime" column="updateTime" jdbcType="TIMESTAMP"/>
+            <result property="createTime" column="createTime" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,adminAddr,runtimeAddr,
+        jobID,reportTime,updateTime,
+        createTime
+    </sql>
+</mapper>
diff --git a/eventmesh-admin-server/src/main/resources/mapper/EventMeshRuntimeHistoryMapper.xml b/eventmesh-admin-server/src/main/resources/mapper/EventMeshRuntimeHistoryMapper.xml
new file mode 100644
index 000000000..d9e17bc85
--- /dev/null
+++ b/eventmesh-admin-server/src/main/resources/mapper/EventMeshRuntimeHistoryMapper.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.apache.eventmesh.admin.server.web.db.mapper.EventMeshRuntimeHistoryMapper">
+
+    <resultMap id="BaseResultMap" type="org.apache.eventmesh.admin.server.web.db.entity.EventMeshRuntimeHistory">
+            <result property="id" column="id" jdbcType="BIGINT"/>
+            <result property="job" column="job" jdbcType="INTEGER"/>
+            <result property="address" column="address" jdbcType="VARCHAR"/>
+            <result property="createTime" column="createTime" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,job,address,
+        createTime
+    </sql>
+</mapper>
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/Constants.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/Constants.java
index 867d50b43..97286f096 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/Constants.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/Constants.java
@@ -205,4 +205,6 @@ public class Constants {
     public static final String OS_WIN_PREFIX = "win";
 
     public static final String DEFAULT = "default";
+
+    public static final String ADMIN_SERVER_REGISTRY_NAME = "DEFAULT_GROUP@@em_adm_server";
 }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/CommonConfiguration.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/CommonConfiguration.java
index 2f38a372c..04c4ae60e 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/CommonConfiguration.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/CommonConfiguration.java
@@ -106,6 +106,21 @@ public class CommonConfiguration {
     @ConfigField(field = "server.retry.plugin.type")
     private String eventMeshRetryPluginType = Constants.DEFAULT;
 
+    @ConfigField(field = "registry.plugin.server-addr", notEmpty = true)
+    private String registryAddr = "";
+
+    @ConfigField(field = "registry.plugin.type", notEmpty = true)
+    private String eventMeshRegistryPluginType = "nacos";
+
+    @ConfigField(field = "registry.plugin.username")
+    private String eventMeshRegistryPluginUsername = "";
+
+    @ConfigField(field = "registry.plugin.password")
+    private String eventMeshRegistryPluginPassword = "";
+
+    @ConfigField(field = "registry.plugin.enabled")
+    private boolean eventMeshRegistryPluginEnabled = false;
+
     public void reload() {
         this.eventMeshWebhookOrigin = "eventmesh." + eventMeshIDC;
 
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/ConfigService.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/ConfigService.java
index 7c5b17d7e..939c9d8d6 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/ConfigService.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/ConfigService.java
@@ -60,6 +60,9 @@ public class ConfigService {
     }
 
     public ConfigService setConfigPath(String configPath) {
+        if (StringUtils.isNotBlank(configPath) && !configPath.endsWith(File.separator)) {
+            configPath = configPath + File.separator;
+        }
         this.configPath = configPath;
         return this;
     }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/FileLoad.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/FileLoad.java
index a0c81ea48..4f8c6687b 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/FileLoad.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/FileLoad.java
@@ -68,6 +68,7 @@ public interface FileLoad {
         private final Convert convert = new Convert();
 
         @SuppressWarnings("unchecked")
+        @Override
         public <T> T getConfig(ConfigInfo configInfo) throws IOException {
             final Properties properties = new Properties();
             if (StringUtils.isNotBlank(configInfo.getResourceUrl())) {
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/Config.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/Config.java
similarity index 93%
copy from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/Config.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/Config.java
index 330aa9393..d4bdee777 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/Config.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/Config.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.config;
+package org.apache.eventmesh.common.config.connector;
 
 public abstract class Config {
 }
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/Constants.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/Constants.java
similarity index 95%
rename from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/Constants.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/Constants.java
index 59794e562..74576e843 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/Constants.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/Constants.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.config;
+package org.apache.eventmesh.common.config.connector;
 
 public class Constants {
 
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/PubSubConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/PubSubConfig.java
similarity index 95%
rename from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/PubSubConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/PubSubConfig.java
index 6f5c9cd5f..be83d5112 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/PubSubConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/PubSubConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.config;
+package org.apache.eventmesh.common.config.connector;
 
 import lombok.Data;
 
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/SinkConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/SinkConfig.java
similarity index 94%
copy from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/SinkConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/SinkConfig.java
index 527d02e04..4ef68291d 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/SinkConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/SinkConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.config;
+package org.apache.eventmesh.common.config.connector;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/SourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/SourceConfig.java
similarity index 88%
rename from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/SourceConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/SourceConfig.java
index 2942be936..763063125 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/SourceConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/SourceConfig.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.config;
+package org.apache.eventmesh.common.config.connector;
 
-import org.apache.eventmesh.openconnect.offsetmgmt.api.config.OffsetStorageConfig;
+import org.apache.eventmesh.common.config.connector.offset.OffsetStorageConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-connectors/eventmesh-connector-dingtalk/src/main/java/org/apache/eventmesh/connector/dingtalk/sink/config/DingDingSinkConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/dingtalk/DingDingSinkConfig.java
similarity index 88%
rename from eventmesh-connectors/eventmesh-connector-dingtalk/src/main/java/org/apache/eventmesh/connector/dingtalk/sink/config/DingDingSinkConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/dingtalk/DingDingSinkConfig.java
index aa4245219..3482d5665 100644
--- a/eventmesh-connectors/eventmesh-connector-dingtalk/src/main/java/org/apache/eventmesh/connector/dingtalk/sink/config/DingDingSinkConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/dingtalk/DingDingSinkConfig.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.dingtalk.sink.config;
+package org.apache.eventmesh.common.config.connector.dingtalk;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.common.config.connector.SinkConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-connectors/eventmesh-connector-dingtalk/src/main/java/org/apache/eventmesh/connector/dingtalk/sink/config/SinkConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/dingtalk/SinkConnectorConfig.java
similarity index 94%
copy from eventmesh-connectors/eventmesh-connector-dingtalk/src/main/java/org/apache/eventmesh/connector/dingtalk/sink/config/SinkConnectorConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/dingtalk/SinkConnectorConfig.java
index 2211fd1ad..1dfcd7664 100644
--- a/eventmesh-connectors/eventmesh-connector-dingtalk/src/main/java/org/apache/eventmesh/connector/dingtalk/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/dingtalk/SinkConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.dingtalk.sink.config;
+package org.apache.eventmesh.common.config.connector.dingtalk;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/sink/config/FileSinkConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/file/FileSinkConfig.java
similarity index 89%
rename from eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/sink/config/FileSinkConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/file/FileSinkConfig.java
index abdae5277..7de6daa51 100644
--- a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/sink/config/FileSinkConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/file/FileSinkConfig.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.file.sink.config;
+package org.apache.eventmesh.common.config.connector.file;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.common.config.connector.SinkConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/FileSourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/file/FileSourceConfig.java
similarity index 88%
copy from eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/FileSourceConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/file/FileSourceConfig.java
index b96954440..06bc4c174 100644
--- a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/FileSourceConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/file/FileSourceConfig.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.file.source.config;
+package org.apache.eventmesh.common.config.connector.file;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
+import org.apache.eventmesh.common.config.connector.SourceConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/sink/config/SinkConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/file/SinkConnectorConfig.java
similarity index 94%
rename from eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/sink/config/SinkConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/file/SinkConnectorConfig.java
index a8cf958f7..ee42a1775 100644
--- a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/file/SinkConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.file.sink.config;
+package org.apache.eventmesh.common.config.connector.file;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/SourceConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/file/SourceConnectorConfig.java
similarity index 94%
copy from eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/SourceConnectorConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/file/SourceConnectorConfig.java
index 6376a7fb4..786d8fa74 100644
--- a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/SourceConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/file/SourceConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.file.source.config;
+package org.apache.eventmesh.common.config.connector.file;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-http/src/main/java/org/apache/eventmesh/connector/http/source/config/HttpSourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/http/HttpSourceConfig.java
similarity index 88%
copy from eventmesh-connectors/eventmesh-connector-http/src/main/java/org/apache/eventmesh/connector/http/source/config/HttpSourceConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/http/HttpSourceConfig.java
index bee870cb1..476dfb10d 100644
--- a/eventmesh-connectors/eventmesh-connector-http/src/main/java/org/apache/eventmesh/connector/http/source/config/HttpSourceConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/http/HttpSourceConfig.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.http.source.config;
+package org.apache.eventmesh.common.config.connector.http;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
+import org.apache.eventmesh.common.config.connector.SourceConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-connectors/eventmesh-connector-http/src/main/java/org/apache/eventmesh/connector/http/source/config/SourceConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/http/SourceConnectorConfig.java
similarity index 94%
rename from eventmesh-connectors/eventmesh-connector-http/src/main/java/org/apache/eventmesh/connector/http/source/config/SourceConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/http/SourceConnectorConfig.java
index 873a0d192..4ffd6a134 100644
--- a/eventmesh-connectors/eventmesh-connector-http/src/main/java/org/apache/eventmesh/connector/http/source/config/SourceConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/http/SourceConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.http.source.config;
+package org.apache.eventmesh.common.config.connector.http;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/sink/config/KnativeSinkConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/knative/KnativeSinkConfig.java
similarity index 88%
copy from eventmesh-connectors/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/sink/config/KnativeSinkConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/knative/KnativeSinkConfig.java
index 85bb38a90..aff7c275a 100644
--- a/eventmesh-connectors/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/sink/config/KnativeSinkConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/knative/KnativeSinkConfig.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.knative.sink.config;
+package org.apache.eventmesh.common.config.connector.knative;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.common.config.connector.SinkConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-connectors/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/source/config/KnativeSourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/knative/KnativeSourceConfig.java
similarity index 88%
rename from eventmesh-connectors/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/source/config/KnativeSourceConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/knative/KnativeSourceConfig.java
index 8ef36a8d7..644161d91 100644
--- a/eventmesh-connectors/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/source/config/KnativeSourceConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/knative/KnativeSourceConfig.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.knative.source.config;
+package org.apache.eventmesh.common.config.connector.knative;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
+import org.apache.eventmesh.common.config.connector.SourceConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-connectors/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/sink/config/SinkConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/knative/SinkConnectorConfig.java
similarity index 93%
rename from eventmesh-connectors/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/sink/config/SinkConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/knative/SinkConnectorConfig.java
index 5694c643f..076bd6875 100644
--- a/eventmesh-connectors/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/knative/SinkConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.knative.sink.config;
+package org.apache.eventmesh.common.config.connector.knative;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/source/config/SourceConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/knative/SourceConnectorConfig.java
similarity index 93%
rename from eventmesh-connectors/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/source/config/SourceConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/knative/SourceConnectorConfig.java
index 8d21c86b7..98e781552 100644
--- a/eventmesh-connectors/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/source/config/SourceConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/knative/SourceConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.knative.source.config;
+package org.apache.eventmesh.common.config.connector.knative;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-lark/src/main/java/org/apache/eventmesh/connector/lark/sink/config/LarkSinkConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/lark/LarkSinkConfig.java
similarity index 89%
rename from eventmesh-connectors/eventmesh-connector-lark/src/main/java/org/apache/eventmesh/connector/lark/sink/config/LarkSinkConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/lark/LarkSinkConfig.java
index a97ece91b..a9235129a 100644
--- a/eventmesh-connectors/eventmesh-connector-lark/src/main/java/org/apache/eventmesh/connector/lark/sink/config/LarkSinkConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/lark/LarkSinkConfig.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.lark.sink.config;
+package org.apache.eventmesh.common.config.connector.lark;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.common.config.connector.SinkConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-connectors/eventmesh-connector-lark/src/main/java/org/apache/eventmesh/connector/lark/sink/config/SinkConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/lark/SinkConnectorConfig.java
similarity index 56%
copy from eventmesh-connectors/eventmesh-connector-lark/src/main/java/org/apache/eventmesh/connector/lark/sink/config/SinkConnectorConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/lark/SinkConnectorConfig.java
index cde3aa673..a4895b8b2 100644
--- a/eventmesh-connectors/eventmesh-connector-lark/src/main/java/org/apache/eventmesh/connector/lark/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/lark/SinkConnectorConfig.java
@@ -15,13 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.lark.sink.config;
-
-import org.apache.eventmesh.openconnect.offsetmgmt.api.data.ConnectRecord;
-
-import org.apache.commons.lang3.StringUtils;
-
-import com.lark.oapi.service.im.v1.enums.ReceiveIdTypeEnum;
+package org.apache.eventmesh.common.config.connector.lark;
 
 import lombok.Data;
 
@@ -53,8 +47,6 @@ public class SinkConnectorConfig {
 
     /**
      * When sinking CouldEvent to lark, choose to call
-     * {@link org.apache.eventmesh.connector.lark.sink.ImServiceHandler#sink(ConnectRecord)}
-     * or {@link org.apache.eventmesh.connector.lark.sink.ImServiceHandler#sinkAsync(ConnectRecord)}
      */
     private String sinkAsync = "true";
 
@@ -62,20 +54,4 @@ public class SinkConnectorConfig {
 
     private String retryDelayInMills = "1000";
 
-    public void validateSinkConfiguration() {
-        // validate blank
-        if (StringUtils.isAnyBlank(appId, appSecret, receiveId)) {
-            throw new IllegalArgumentException("appId or appSecret or receiveId is blank,please check it.");
-        }
-
-        // validate receiveIdType
-        if (!StringUtils.containsAny(receiveIdType, ReceiveIdTypeEnum.CHAT_ID.getValue(),
-            ReceiveIdTypeEnum.EMAIL.getValue(),
-            ReceiveIdTypeEnum.OPEN_ID.getValue(),
-            ReceiveIdTypeEnum.USER_ID.getValue(),
-            ReceiveIdTypeEnum.UNION_ID.getValue())) {
-            throw new IllegalArgumentException(
-                String.format("sinkConnectorConfig.receiveIdType=[%s], Invalid.", receiveIdType));
-        }
-    }
 }
diff --git a/eventmesh-connectors/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/sink/config/KnativeSinkConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/kafka/KafkaSinkConfig.java
similarity index 84%
copy from eventmesh-connectors/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/sink/config/KnativeSinkConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/kafka/KafkaSinkConfig.java
index 85bb38a90..973eed11f 100644
--- a/eventmesh-connectors/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/sink/config/KnativeSinkConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/kafka/KafkaSinkConfig.java
@@ -15,16 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.knative.sink.config;
+package org.apache.eventmesh.common.config.connector.mq.kafka;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.common.config.connector.SinkConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
-@Data
 @EqualsAndHashCode(callSuper = true)
-public class KnativeSinkConfig extends SinkConfig {
+@Data
+public class KafkaSinkConfig extends SinkConfig {
 
     public SinkConnectorConfig connectorConfig;
 
diff --git a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/FileSourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/kafka/KafkaSourceConfig.java
similarity index 83%
copy from eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/FileSourceConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/kafka/KafkaSourceConfig.java
index b96954440..bf44a8271 100644
--- a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/FileSourceConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/kafka/KafkaSourceConfig.java
@@ -15,16 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.file.source.config;
+package org.apache.eventmesh.common.config.connector.mq.kafka;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
+import org.apache.eventmesh.common.config.connector.SourceConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
-@Data
 @EqualsAndHashCode(callSuper = true)
-public class FileSourceConfig extends SourceConfig {
+@Data
+public class KafkaSourceConfig extends SourceConfig {
 
     public SourceConnectorConfig connectorConfig;
 }
diff --git a/eventmesh-connectors/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/sink/config/SinkConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/kafka/SinkConnectorConfig.java
similarity index 96%
rename from eventmesh-connectors/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/sink/config/SinkConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/kafka/SinkConnectorConfig.java
index a240bf4f4..e7584319c 100644
--- a/eventmesh-connectors/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/kafka/SinkConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.kafka.sink.config;
+package org.apache.eventmesh.common.config.connector.mq.kafka;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/source/config/SourceConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/kafka/SourceConnectorConfig.java
similarity index 95%
rename from eventmesh-connectors/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/source/config/SourceConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/kafka/SourceConnectorConfig.java
index 2d2f52f85..21fb18eb2 100644
--- a/eventmesh-connectors/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/source/config/SourceConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/kafka/SourceConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.kafka.source.config;
+package org.apache.eventmesh.common.config.connector.mq.kafka;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/sink/config/KnativeSinkConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/pulsar/PulsarSinkConfig.java
similarity index 84%
copy from eventmesh-connectors/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/sink/config/KnativeSinkConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/pulsar/PulsarSinkConfig.java
index 85bb38a90..8cbfd5fb2 100644
--- a/eventmesh-connectors/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/sink/config/KnativeSinkConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/pulsar/PulsarSinkConfig.java
@@ -15,16 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.knative.sink.config;
+package org.apache.eventmesh.common.config.connector.mq.pulsar;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.common.config.connector.SinkConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
-@Data
 @EqualsAndHashCode(callSuper = true)
-public class KnativeSinkConfig extends SinkConfig {
+@Data
+public class PulsarSinkConfig extends SinkConfig {
 
     public SinkConnectorConfig connectorConfig;
 
diff --git a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/FileSourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/pulsar/PulsarSourceConfig.java
similarity index 83%
copy from eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/FileSourceConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/pulsar/PulsarSourceConfig.java
index b96954440..43eb2ca85 100644
--- a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/FileSourceConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/pulsar/PulsarSourceConfig.java
@@ -15,16 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.file.source.config;
+package org.apache.eventmesh.common.config.connector.mq.pulsar;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
+import org.apache.eventmesh.common.config.connector.SourceConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
-@Data
 @EqualsAndHashCode(callSuper = true)
-public class FileSourceConfig extends SourceConfig {
+@Data
+public class PulsarSourceConfig extends SourceConfig {
 
     public SourceConnectorConfig connectorConfig;
 }
diff --git a/eventmesh-connectors/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/sink/config/SinkConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/pulsar/SinkConnectorConfig.java
similarity index 93%
rename from eventmesh-connectors/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/sink/config/SinkConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/pulsar/SinkConnectorConfig.java
index e1ebba09c..b66f1a532 100644
--- a/eventmesh-connectors/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/pulsar/SinkConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.pulsar.sink.config;
+package org.apache.eventmesh.common.config.connector.mq.pulsar;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/source/config/SourceConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/pulsar/SourceConnectorConfig.java
similarity index 93%
rename from eventmesh-connectors/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/source/config/SourceConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/pulsar/SourceConnectorConfig.java
index bb8ff4687..9f8fbce2d 100644
--- a/eventmesh-connectors/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/source/config/SourceConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/pulsar/SourceConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.pulsar.source.config;
+package org.apache.eventmesh.common.config.connector.mq.pulsar;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/sink/config/RabbitMQSinkConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rabbitmq/RabbitMQSinkConfig.java
similarity index 88%
rename from eventmesh-connectors/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/sink/config/RabbitMQSinkConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rabbitmq/RabbitMQSinkConfig.java
index 1c4ec66d4..8dcb8ad50 100644
--- a/eventmesh-connectors/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/sink/config/RabbitMQSinkConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rabbitmq/RabbitMQSinkConfig.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.rabbitmq.sink.config;
+package org.apache.eventmesh.common.config.connector.mq.rabbitmq;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.common.config.connector.SinkConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-connectors/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/source/config/RabbitMQSourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rabbitmq/RabbitMQSourceConfig.java
similarity index 88%
rename from eventmesh-connectors/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/source/config/RabbitMQSourceConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rabbitmq/RabbitMQSourceConfig.java
index 55ce402ae..c268c1005 100644
--- a/eventmesh-connectors/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/source/config/RabbitMQSourceConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rabbitmq/RabbitMQSourceConfig.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.rabbitmq.source.config;
+package org.apache.eventmesh.common.config.connector.mq.rabbitmq;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
+import org.apache.eventmesh.common.config.connector.SourceConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-connectors/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/sink/config/SinkConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rabbitmq/SinkConnectorConfig.java
similarity index 88%
rename from eventmesh-connectors/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/sink/config/SinkConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rabbitmq/SinkConnectorConfig.java
index 358964bdc..a6f633f94 100644
--- a/eventmesh-connectors/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rabbitmq/SinkConnectorConfig.java
@@ -15,9 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.rabbitmq.sink.config;
-
-import com.rabbitmq.client.BuiltinExchangeType;
+package org.apache.eventmesh.common.config.connector.mq.rabbitmq;
 
 import lombok.Data;
 
@@ -36,7 +34,7 @@ public class SinkConnectorConfig {
 
     private String virtualHost;
 
-    private BuiltinExchangeType exchangeType;
+    private String exchangeType;
 
     private String exchangeName;
 
diff --git a/eventmesh-connectors/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/source/config/SourceConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rabbitmq/SourceConnectorConfig.java
similarity index 88%
rename from eventmesh-connectors/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/source/config/SourceConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rabbitmq/SourceConnectorConfig.java
index d83149f9c..29a041338 100644
--- a/eventmesh-connectors/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/source/config/SourceConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rabbitmq/SourceConnectorConfig.java
@@ -15,9 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.rabbitmq.source.config;
-
-import com.rabbitmq.client.BuiltinExchangeType;
+package org.apache.eventmesh.common.config.connector.mq.rabbitmq;
 
 import lombok.Data;
 
@@ -36,7 +34,7 @@ public class SourceConnectorConfig {
 
     private String virtualHost;
 
-    private BuiltinExchangeType exchangeType;
+    private String exchangeType;
 
     private String exchangeName;
 
diff --git a/eventmesh-connectors/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/sink/config/RocketMQSinkConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rocketmq/RocketMQSinkConfig.java
similarity index 88%
rename from eventmesh-connectors/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/sink/config/RocketMQSinkConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rocketmq/RocketMQSinkConfig.java
index bc4191c9b..d7c08e8b7 100644
--- a/eventmesh-connectors/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/sink/config/RocketMQSinkConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rocketmq/RocketMQSinkConfig.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.rocketmq.sink.config;
+package org.apache.eventmesh.common.config.connector.mq.rocketmq;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.common.config.connector.SinkConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-connectors/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/source/config/RocketMQSourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rocketmq/RocketMQSourceConfig.java
similarity index 88%
rename from eventmesh-connectors/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/source/config/RocketMQSourceConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rocketmq/RocketMQSourceConfig.java
index 43a74fabd..5c531d91c 100644
--- a/eventmesh-connectors/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/source/config/RocketMQSourceConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rocketmq/RocketMQSourceConfig.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.rocketmq.source.config;
+package org.apache.eventmesh.common.config.connector.mq.rocketmq;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
+import org.apache.eventmesh.common.config.connector.SourceConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-connectors/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/sink/config/SinkConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rocketmq/SinkConnectorConfig.java
similarity index 93%
rename from eventmesh-connectors/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/sink/config/SinkConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rocketmq/SinkConnectorConfig.java
index 034dd7ce0..93472f7a4 100644
--- a/eventmesh-connectors/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rocketmq/SinkConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.rocketmq.sink.config;
+package org.apache.eventmesh.common.config.connector.mq.rocketmq;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/source/config/SourceConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rocketmq/SourceConnectorConfig.java
similarity index 93%
rename from eventmesh-connectors/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/source/config/SourceConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rocketmq/SourceConnectorConfig.java
index 1dc8a0d5c..641d1873b 100644
--- a/eventmesh-connectors/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/source/config/SourceConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/mq/rocketmq/SourceConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.rocketmq.source.config;
+package org.apache.eventmesh.common.config.connector.mq.rocketmq;
 
 import lombok.Data;
 
diff --git a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/config/OffsetStorageConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/offset/OffsetStorageConfig.java
similarity index 82%
copy from eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/config/OffsetStorageConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/offset/OffsetStorageConfig.java
index 30a56a3d2..e8ff1d490 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/config/OffsetStorageConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/offset/OffsetStorageConfig.java
@@ -15,7 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.offsetmgmt.api.config;
+package org.apache.eventmesh.common.config.connector.offset;
+
+import org.apache.eventmesh.common.remote.job.DataSourceType;
 
 import java.util.Map;
 
@@ -29,4 +31,8 @@ public class OffsetStorageConfig {
     private String offsetStorageAddr;
 
     private Map<String, String> extensions;
+
+    private DataSourceType dataSourceType;
+
+    private DataSourceType dataSinkType;
 }
diff --git a/eventmesh-connectors/eventmesh-connector-openfunction/src/main/java/org/apache/eventmesh/connector/openfunction/sink/config/OpenFunctionSinkConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/openfunction/OpenFunctionSinkConfig.java
similarity index 88%
rename from eventmesh-connectors/eventmesh-connector-openfunction/src/main/java/org/apache/eventmesh/connector/openfunction/sink/config/OpenFunctionSinkConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/openfunction/OpenFunctionSinkConfig.java
index 6e4fbe3dc..151ff6883 100644
--- a/eventmesh-connectors/eventmesh-connector-openfunction/src/main/java/org/apache/eventmesh/connector/openfunction/sink/config/OpenFunctionSinkConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/openfunction/OpenFunctionSinkConfig.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.openfunction.sink.config;
+package org.apache.eventmesh.common.config.connector.openfunction;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.common.config.connector.SinkConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-connectors/eventmesh-connector-openfunction/src/main/java/org/apache/eventmesh/connector/openfunction/source/config/OpenFunctionSourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/openfunction/OpenFunctionSourceConfig.java
similarity index 88%
rename from eventmesh-connectors/eventmesh-connector-openfunction/src/main/java/org/apache/eventmesh/connector/openfunction/source/config/OpenFunctionSourceConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/openfunction/OpenFunctionSourceConfig.java
index f3f5b5275..e3a6123ed 100644
--- a/eventmesh-connectors/eventmesh-connector-openfunction/src/main/java/org/apache/eventmesh/connector/openfunction/source/config/OpenFunctionSourceConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/openfunction/OpenFunctionSourceConfig.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.openfunction.source.config;
+package org.apache.eventmesh.common.config.connector.openfunction;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
+import org.apache.eventmesh.common.config.connector.SourceConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-connectors/eventmesh-connector-openfunction/src/main/java/org/apache/eventmesh/connector/openfunction/sink/config/SinkConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/openfunction/SinkConnectorConfig.java
similarity index 93%
copy from eventmesh-connectors/eventmesh-connector-openfunction/src/main/java/org/apache/eventmesh/connector/openfunction/sink/config/SinkConnectorConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/openfunction/SinkConnectorConfig.java
index 77c1b7c70..b8bc93739 100644
--- a/eventmesh-connectors/eventmesh-connector-openfunction/src/main/java/org/apache/eventmesh/connector/openfunction/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/openfunction/SinkConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.openfunction.sink.config;
+package org.apache.eventmesh.common.config.connector.openfunction;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-openfunction/src/main/java/org/apache/eventmesh/connector/openfunction/source/config/SourceConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/openfunction/SourceConnectorConfig.java
similarity index 93%
rename from eventmesh-connectors/eventmesh-connector-openfunction/src/main/java/org/apache/eventmesh/connector/openfunction/source/config/SourceConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/openfunction/SourceConnectorConfig.java
index 93fc9739f..09dbdea14 100644
--- a/eventmesh-connectors/eventmesh-connector-openfunction/src/main/java/org/apache/eventmesh/connector/openfunction/source/config/SourceConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/openfunction/SourceConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.openfunction.source.config;
+package org.apache.eventmesh.common.config.connector.openfunction;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/sink/config/PravegaSinkConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/pravega/PravegaSinkConfig.java
similarity index 88%
rename from eventmesh-connectors/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/sink/config/PravegaSinkConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/pravega/PravegaSinkConfig.java
index 739c6539b..a94766c20 100644
--- a/eventmesh-connectors/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/sink/config/PravegaSinkConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/pravega/PravegaSinkConfig.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.pravega.sink.config;
+package org.apache.eventmesh.common.config.connector.pravega;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.common.config.connector.SinkConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-connectors/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/source/config/PravegaSourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/pravega/PravegaSourceConfig.java
similarity index 88%
rename from eventmesh-connectors/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/source/config/PravegaSourceConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/pravega/PravegaSourceConfig.java
index 87fbd3d57..105d3474e 100644
--- a/eventmesh-connectors/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/source/config/PravegaSourceConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/pravega/PravegaSourceConfig.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.pravega.source.config;
+package org.apache.eventmesh.common.config.connector.pravega;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
+import org.apache.eventmesh.common.config.connector.SourceConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-connectors/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/sink/config/SinkConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/pravega/SinkConnectorConfig.java
similarity index 95%
rename from eventmesh-connectors/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/sink/config/SinkConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/pravega/SinkConnectorConfig.java
index c254dee3b..7f56ea57a 100644
--- a/eventmesh-connectors/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/pravega/SinkConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.pravega.sink.config;
+package org.apache.eventmesh.common.config.connector.pravega;
 
 import java.net.URI;
 
diff --git a/eventmesh-connectors/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/source/config/SourceConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/pravega/SourceConnectorConfig.java
similarity index 95%
rename from eventmesh-connectors/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/source/config/SourceConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/pravega/SourceConnectorConfig.java
index 1ff54d1c1..da0f8c5f1 100644
--- a/eventmesh-connectors/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/source/config/SourceConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/pravega/SourceConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.pravega.source.config;
+package org.apache.eventmesh.common.config.connector.pravega;
 
 import java.net.URI;
 
diff --git a/eventmesh-connectors/eventmesh-connector-prometheus/src/main/java/org/apache/eventmesh/connector/prometheus/source/config/PrometheusSourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/prometheus/PrometheusSourceConfig.java
similarity index 88%
rename from eventmesh-connectors/eventmesh-connector-prometheus/src/main/java/org/apache/eventmesh/connector/prometheus/source/config/PrometheusSourceConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/prometheus/PrometheusSourceConfig.java
index 292b7e62f..3393e4a19 100644
--- a/eventmesh-connectors/eventmesh-connector-prometheus/src/main/java/org/apache/eventmesh/connector/prometheus/source/config/PrometheusSourceConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/prometheus/PrometheusSourceConfig.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.prometheus.source.config;
+package org.apache.eventmesh.common.config.connector.prometheus;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
+import org.apache.eventmesh.common.config.connector.SourceConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-connectors/eventmesh-connector-prometheus/src/main/java/org/apache/eventmesh/connector/prometheus/source/config/SourceConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/prometheus/SourceConnectorConfig.java
similarity index 94%
rename from eventmesh-connectors/eventmesh-connector-prometheus/src/main/java/org/apache/eventmesh/connector/prometheus/source/config/SourceConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/prometheus/SourceConnectorConfig.java
index 7e8b7ba93..1df3fe18c 100644
--- a/eventmesh-connectors/eventmesh-connector-prometheus/src/main/java/org/apache/eventmesh/connector/prometheus/source/config/SourceConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/prometheus/SourceConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.prometheus.source.config;
+package org.apache.eventmesh.common.config.connector.prometheus;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/sink/config/JdbcSinkConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/canal/CanalSinkConfig.java
similarity index 59%
copy from eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/sink/config/JdbcSinkConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/canal/CanalSinkConfig.java
index 2a5af32ca..f7a697625 100644
--- a/eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/sink/config/JdbcSinkConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/canal/CanalSinkConfig.java
@@ -15,20 +15,27 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.jdbc.sink.config;
+package org.apache.eventmesh.common.config.connector.rdb.canal;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.common.config.connector.SinkConfig;
+import org.apache.eventmesh.common.remote.job.SyncMode;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 @Data
 @EqualsAndHashCode(callSuper = true)
-public class JdbcSinkConfig extends SinkConfig {
+public class CanalSinkConfig extends SinkConfig {
 
-    private boolean supportUpsert = true;
+    private Integer batchSize = 50;                          // batchSize
 
-    private boolean supportDelete = true;
+    private Boolean useBatch = true;                        // enable batch
+
+    private Integer poolSize = 5;                           // sink thread size for single channel
+
+    private SyncMode syncMode;                              // sync mode: field/row
+
+    private Boolean skipException = false;                  // skip sink process exception
 
     public SinkConnectorConfig sinkConnectorConfig;
 
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/canal/CanalSourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/canal/CanalSourceConfig.java
new file mode 100644
index 000000000..e5edc5a78
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/canal/CanalSourceConfig.java
@@ -0,0 +1,80 @@
+/*
+ * 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.eventmesh.common.config.connector.rdb.canal;
+
+import org.apache.eventmesh.common.config.connector.SourceConfig;
+import org.apache.eventmesh.common.remote.job.SyncConsistency;
+import org.apache.eventmesh.common.remote.job.SyncMode;
+import org.apache.eventmesh.common.remote.offset.RecordPosition;
+
+import java.util.List;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class CanalSourceConfig extends SourceConfig {
+
+    private String destination;
+
+    private Long canalInstanceId;
+
+    private String desc;
+
+    private boolean ddlSync = true;
+
+    private boolean filterTableError = false;
+
+    private Long slaveId;
+
+    private Short clientId;
+
+    private Integer batchSize = 10000;
+
+    private Long batchTimeout = -1L;
+
+    private List<RecordPosition> recordPositions;
+
+    // ================================= channel parameter
+    // ================================
+
+    private Boolean enableRemedy = false;                                             // enable remedy
+
+    private SyncMode syncMode;                                                 // sync mode: field/row
+
+    private SyncConsistency syncConsistency;                                          // sync consistency
+
+    // ================================= system parameter
+    // ================================
+
+    private String systemSchema;                                             // Default is retl
+
+    private String systemMarkTable;                                          // Bidirectional synchronization mark table
+
+    private String systemMarkTableColumn;                                    // Column name of the bidirectional synchronization mark
+
+    private String systemMarkTableInfo;
+    // nfo information of the bidirectional synchronization mark, similar to BI_SYNC
+
+    private String systemBufferTable;                                        // sync buffer table
+
+    private String systemDualTable;                                          // sync heartbeat table
+
+    private SourceConnectorConfig sourceConnectorConfig;
+}
diff --git a/eventmesh-connectors/eventmesh-connector-mongodb/src/main/java/org/apache/eventmesh/connector/mongodb/sink/config/SinkConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/canal/SinkConnectorConfig.java
similarity index 75%
copy from eventmesh-connectors/eventmesh-connector-mongodb/src/main/java/org/apache/eventmesh/connector/mongodb/sink/config/SinkConnectorConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/canal/SinkConnectorConfig.java
index 087b2e48c..1124bb142 100644
--- a/eventmesh-connectors/eventmesh-connector-mongodb/src/main/java/org/apache/eventmesh/connector/mongodb/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/canal/SinkConnectorConfig.java
@@ -15,20 +15,29 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.mongodb.sink.config;
+package org.apache.eventmesh.common.config.connector.rdb.canal;
 
 import lombok.Data;
 
+/**
+ * Configuration parameters for a sink connector.
+ */
 @Data
 public class SinkConnectorConfig {
 
     private String connectorName;
 
-    private String connectorType;
-
     private String url;
 
-    private String database;
+    private String dbAddress;
+
+    private int dbPort;
+
+    private String userName;
+
+    private String passWord;
+
+    private String schemaName;
 
-    private String collection;
+    private String tableName;
 }
diff --git a/eventmesh-connectors/eventmesh-connector-mongodb/src/main/java/org/apache/eventmesh/connector/mongodb/source/config/SourceConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/canal/SourceConnectorConfig.java
similarity index 75%
copy from eventmesh-connectors/eventmesh-connector-mongodb/src/main/java/org/apache/eventmesh/connector/mongodb/source/config/SourceConnectorConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/canal/SourceConnectorConfig.java
index 5c48645a4..e9ae46607 100644
--- a/eventmesh-connectors/eventmesh-connector-mongodb/src/main/java/org/apache/eventmesh/connector/mongodb/source/config/SourceConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/canal/SourceConnectorConfig.java
@@ -15,21 +15,30 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.mongodb.source.config;
+package org.apache.eventmesh.common.config.connector.rdb.canal;
 
 import lombok.Data;
 
+/**
+ * Represents the configuration for a database connector.
+ */
 @Data
 public class SourceConnectorConfig {
 
     private String connectorName;
 
-    private String connectorType;
-
     private String url;
 
-    private String database;
+    private String dbAddress;
+
+    private int dbPort;
+
+    private String userName;
+
+    private String passWord;
+
+    private String schemaName;
 
-    private String collection;
+    private String tableName;
 
 }
diff --git a/eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/config/JdbcConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/jdbc/JdbcConfig.java
similarity index 96%
rename from eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/config/JdbcConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/jdbc/JdbcConfig.java
index d40801854..1b46a76c9 100644
--- a/eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/config/JdbcConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/jdbc/JdbcConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.jdbc.config;
+package org.apache.eventmesh.common.config.connector.rdb.jdbc;
 
 import java.util.Properties;
 
diff --git a/eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/sink/config/JdbcSinkConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/jdbc/JdbcSinkConfig.java
similarity index 89%
rename from eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/sink/config/JdbcSinkConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/jdbc/JdbcSinkConfig.java
index 2a5af32ca..83711c68b 100644
--- a/eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/sink/config/JdbcSinkConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/jdbc/JdbcSinkConfig.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.jdbc.sink.config;
+package org.apache.eventmesh.common.config.connector.rdb.jdbc;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.common.config.connector.SinkConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/source/config/JdbcSourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/jdbc/JdbcSourceConfig.java
similarity index 88%
rename from eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/source/config/JdbcSourceConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/jdbc/JdbcSourceConfig.java
index b330c331b..553a0581a 100644
--- a/eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/source/config/JdbcSourceConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/jdbc/JdbcSourceConfig.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.jdbc.source.config;
+package org.apache.eventmesh.common.config.connector.rdb.jdbc;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
+import org.apache.eventmesh.common.config.connector.SourceConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/source/config/MysqlConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/jdbc/MysqlConfig.java
similarity index 95%
copy from eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/source/config/MysqlConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/jdbc/MysqlConfig.java
index 032921350..ede507e1b 100644
--- a/eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/source/config/MysqlConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/jdbc/MysqlConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.jdbc.source.config;
+package org.apache.eventmesh.common.config.connector.rdb.jdbc;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/sink/config/SinkConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/jdbc/SinkConnectorConfig.java
similarity index 90%
copy from eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/sink/config/SinkConnectorConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/jdbc/SinkConnectorConfig.java
index e971b7b00..afbd51d14 100644
--- a/eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/jdbc/SinkConnectorConfig.java
@@ -15,9 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.jdbc.sink.config;
-
-import org.apache.eventmesh.connector.jdbc.config.JdbcConfig;
+package org.apache.eventmesh.common.config.connector.rdb.jdbc;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/source/config/SourceConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/jdbc/SourceConnectorConfig.java
similarity index 95%
rename from eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/source/config/SourceConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/jdbc/SourceConnectorConfig.java
index a27dbfedb..a10d8e09d 100644
--- a/eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/source/config/SourceConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/jdbc/SourceConnectorConfig.java
@@ -15,9 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.jdbc.source.config;
-
-import org.apache.eventmesh.connector.jdbc.config.JdbcConfig;
+package org.apache.eventmesh.common.config.connector.rdb.jdbc;
 
 import java.util.List;
 
diff --git a/eventmesh-connectors/eventmesh-connector-http/src/main/java/org/apache/eventmesh/connector/http/sink/config/HttpSinkConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/mongodb/MongodbSinkConfig.java
similarity index 83%
copy from eventmesh-connectors/eventmesh-connector-http/src/main/java/org/apache/eventmesh/connector/http/sink/config/HttpSinkConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/mongodb/MongodbSinkConfig.java
index 3dd0c2b6a..7d019ba1f 100644
--- a/eventmesh-connectors/eventmesh-connector-http/src/main/java/org/apache/eventmesh/connector/http/sink/config/HttpSinkConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/mongodb/MongodbSinkConfig.java
@@ -15,16 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.http.sink.config;
+package org.apache.eventmesh.common.config.connector.rdb.mongodb;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.common.config.connector.SinkConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
-@Data
 @EqualsAndHashCode(callSuper = true)
-public class HttpSinkConfig extends SinkConfig {
+@Data
+public class MongodbSinkConfig extends SinkConfig {
 
     public SinkConnectorConfig connectorConfig;
 }
diff --git a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/FileSourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/mongodb/MongodbSourceConfig.java
similarity index 83%
rename from eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/FileSourceConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/mongodb/MongodbSourceConfig.java
index b96954440..00dca10b2 100644
--- a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/FileSourceConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/mongodb/MongodbSourceConfig.java
@@ -15,16 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.file.source.config;
+package org.apache.eventmesh.common.config.connector.rdb.mongodb;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
+import org.apache.eventmesh.common.config.connector.SourceConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
-@Data
 @EqualsAndHashCode(callSuper = true)
-public class FileSourceConfig extends SourceConfig {
+@Data
+public class MongodbSourceConfig extends SourceConfig {
 
     public SourceConnectorConfig connectorConfig;
 }
diff --git a/eventmesh-connectors/eventmesh-connector-mongodb/src/main/java/org/apache/eventmesh/connector/mongodb/sink/config/SinkConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/mongodb/SinkConnectorConfig.java
similarity index 93%
rename from eventmesh-connectors/eventmesh-connector-mongodb/src/main/java/org/apache/eventmesh/connector/mongodb/sink/config/SinkConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/mongodb/SinkConnectorConfig.java
index 087b2e48c..58ae5ffc4 100644
--- a/eventmesh-connectors/eventmesh-connector-mongodb/src/main/java/org/apache/eventmesh/connector/mongodb/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/mongodb/SinkConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.mongodb.sink.config;
+package org.apache.eventmesh.common.config.connector.rdb.mongodb;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-mongodb/src/main/java/org/apache/eventmesh/connector/mongodb/source/config/SourceConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/mongodb/SourceConnectorConfig.java
similarity index 93%
rename from eventmesh-connectors/eventmesh-connector-mongodb/src/main/java/org/apache/eventmesh/connector/mongodb/source/config/SourceConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/mongodb/SourceConnectorConfig.java
index 5c48645a4..8ace602f8 100644
--- a/eventmesh-connectors/eventmesh-connector-mongodb/src/main/java/org/apache/eventmesh/connector/mongodb/source/config/SourceConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/rdb/mongodb/SourceConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.mongodb.source.config;
+package org.apache.eventmesh.common.config.connector.rdb.mongodb;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/sink/config/KnativeSinkConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/redis/RedisSinkConfig.java
similarity index 84%
rename from eventmesh-connectors/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/sink/config/KnativeSinkConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/redis/RedisSinkConfig.java
index 85bb38a90..27070343d 100644
--- a/eventmesh-connectors/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/sink/config/KnativeSinkConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/redis/RedisSinkConfig.java
@@ -15,16 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.knative.sink.config;
+package org.apache.eventmesh.common.config.connector.redis;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.common.config.connector.SinkConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
-@Data
 @EqualsAndHashCode(callSuper = true)
-public class KnativeSinkConfig extends SinkConfig {
+@Data
+public class RedisSinkConfig extends SinkConfig {
 
     public SinkConnectorConfig connectorConfig;
 
diff --git a/eventmesh-connectors/eventmesh-connector-http/src/main/java/org/apache/eventmesh/connector/http/source/config/HttpSourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/redis/RedisSourceConfig.java
similarity index 84%
rename from eventmesh-connectors/eventmesh-connector-http/src/main/java/org/apache/eventmesh/connector/http/source/config/HttpSourceConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/redis/RedisSourceConfig.java
index bee870cb1..5b04e6a82 100644
--- a/eventmesh-connectors/eventmesh-connector-http/src/main/java/org/apache/eventmesh/connector/http/source/config/HttpSourceConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/redis/RedisSourceConfig.java
@@ -15,16 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.http.source.config;
+package org.apache.eventmesh.common.config.connector.redis;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
+import org.apache.eventmesh.common.config.connector.SourceConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
-@Data
 @EqualsAndHashCode(callSuper = true)
-public class HttpSourceConfig extends SourceConfig {
+@Data
+public class RedisSourceConfig extends SourceConfig {
 
     public SourceConnectorConfig connectorConfig;
+
 }
diff --git a/eventmesh-connectors/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/sink/config/SinkConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/redis/SinkConnectorConfig.java
similarity index 94%
rename from eventmesh-connectors/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/sink/config/SinkConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/redis/SinkConnectorConfig.java
index 34fb0326a..ebf53adc3 100644
--- a/eventmesh-connectors/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/redis/SinkConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.redis.sink.config;
+package org.apache.eventmesh.common.config.connector.redis;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/source/config/SourceConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/redis/SourceConnectorConfig.java
similarity index 94%
rename from eventmesh-connectors/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/source/config/SourceConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/redis/SourceConnectorConfig.java
index 9913e1632..b363924ec 100644
--- a/eventmesh-connectors/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/source/config/SourceConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/redis/SourceConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.redis.source.config;
+package org.apache.eventmesh.common.config.connector.redis;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-s3/src/main/java/org/apache/eventmesh/connector/s3/source/config/S3SourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/s3/S3SourceConfig.java
similarity index 83%
rename from eventmesh-connectors/eventmesh-connector-s3/src/main/java/org/apache/eventmesh/connector/s3/source/config/S3SourceConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/s3/S3SourceConfig.java
index 0f4bec5d5..7691b6e23 100644
--- a/eventmesh-connectors/eventmesh-connector-s3/src/main/java/org/apache/eventmesh/connector/s3/source/config/S3SourceConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/s3/S3SourceConfig.java
@@ -15,12 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.s3.source.config;
+package org.apache.eventmesh.common.config.connector.s3;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
+import org.apache.eventmesh.common.config.connector.SourceConfig;
 
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class S3SourceConfig extends SourceConfig {
 
diff --git a/eventmesh-connectors/eventmesh-connector-s3/src/main/java/org/apache/eventmesh/connector/s3/source/config/SourceConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/s3/SourceConnectorConfig.java
similarity index 96%
rename from eventmesh-connectors/eventmesh-connector-s3/src/main/java/org/apache/eventmesh/connector/s3/source/config/SourceConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/s3/SourceConnectorConfig.java
index 2c9cb5a80..fdc453125 100644
--- a/eventmesh-connectors/eventmesh-connector-s3/src/main/java/org/apache/eventmesh/connector/s3/source/config/SourceConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/s3/SourceConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.s3.source.config;
+package org.apache.eventmesh.common.config.connector.s3;
 
 import java.util.Map;
 
diff --git a/eventmesh-connectors/eventmesh-connector-slack/src/main/java/org/apache/eventmesh/connector/slack/sink/config/SinkConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/slack/SinkConnectorConfig.java
similarity index 94%
rename from eventmesh-connectors/eventmesh-connector-slack/src/main/java/org/apache/eventmesh/connector/slack/sink/config/SinkConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/slack/SinkConnectorConfig.java
index 41884a94a..4267beddf 100644
--- a/eventmesh-connectors/eventmesh-connector-slack/src/main/java/org/apache/eventmesh/connector/slack/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/slack/SinkConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.slack.sink.config;
+package org.apache.eventmesh.common.config.connector.slack;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-slack/src/main/java/org/apache/eventmesh/connector/slack/sink/config/SlackSinkConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/slack/SlackSinkConfig.java
similarity index 89%
copy from eventmesh-connectors/eventmesh-connector-slack/src/main/java/org/apache/eventmesh/connector/slack/sink/config/SlackSinkConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/slack/SlackSinkConfig.java
index 016cd9ae9..969306ae6 100644
--- a/eventmesh-connectors/eventmesh-connector-slack/src/main/java/org/apache/eventmesh/connector/slack/sink/config/SlackSinkConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/slack/SlackSinkConfig.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.slack.sink.config;
+package org.apache.eventmesh.common.config.connector.slack;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.common.config.connector.SinkConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-connectors/eventmesh-connector-spring/src/main/java/org/apache/eventmesh/connector/spring/sink/connector/SinkConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/spring/SinkConnectorConfig.java
similarity index 93%
copy from eventmesh-connectors/eventmesh-connector-spring/src/main/java/org/apache/eventmesh/connector/spring/sink/connector/SinkConnectorConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/spring/SinkConnectorConfig.java
index a71c4ab66..0ded9886d 100644
--- a/eventmesh-connectors/eventmesh-connector-spring/src/main/java/org/apache/eventmesh/connector/spring/sink/connector/SinkConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/spring/SinkConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.spring.sink.connector;
+package org.apache.eventmesh.common.config.connector.spring;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-spring/src/main/java/org/apache/eventmesh/connector/spring/source/connector/SourceConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/spring/SourceConnectorConfig.java
similarity index 93%
copy from eventmesh-connectors/eventmesh-connector-spring/src/main/java/org/apache/eventmesh/connector/spring/source/connector/SourceConnectorConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/spring/SourceConnectorConfig.java
index 242869087..c31f8c988 100644
--- a/eventmesh-connectors/eventmesh-connector-spring/src/main/java/org/apache/eventmesh/connector/spring/source/connector/SourceConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/spring/SourceConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.spring.source.connector;
+package org.apache.eventmesh.common.config.connector.spring;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-slack/src/main/java/org/apache/eventmesh/connector/slack/sink/config/SlackSinkConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/spring/SpringSinkConfig.java
similarity index 84%
rename from eventmesh-connectors/eventmesh-connector-slack/src/main/java/org/apache/eventmesh/connector/slack/sink/config/SlackSinkConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/spring/SpringSinkConfig.java
index 016cd9ae9..14f1f4bbe 100644
--- a/eventmesh-connectors/eventmesh-connector-slack/src/main/java/org/apache/eventmesh/connector/slack/sink/config/SlackSinkConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/spring/SpringSinkConfig.java
@@ -15,16 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.slack.sink.config;
+package org.apache.eventmesh.common.config.connector.spring;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.common.config.connector.SinkConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 @Data
 @EqualsAndHashCode(callSuper = true)
-public class SlackSinkConfig extends SinkConfig {
+public class SpringSinkConfig extends SinkConfig {
 
     private SinkConnectorConfig sinkConnectorConfig;
 }
diff --git a/eventmesh-connectors/eventmesh-connector-spring/src/main/java/org/apache/eventmesh/connector/spring/source/config/SpringSourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/spring/SpringSourceConfig.java
similarity index 82%
rename from eventmesh-connectors/eventmesh-connector-spring/src/main/java/org/apache/eventmesh/connector/spring/source/config/SpringSourceConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/spring/SpringSourceConfig.java
index 191e9b119..e99dfc594 100644
--- a/eventmesh-connectors/eventmesh-connector-spring/src/main/java/org/apache/eventmesh/connector/spring/source/config/SpringSourceConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/spring/SpringSourceConfig.java
@@ -15,10 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.spring.source.config;
+package org.apache.eventmesh.common.config.connector.spring;
 
-import org.apache.eventmesh.connector.spring.source.connector.SourceConnectorConfig;
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
+import org.apache.eventmesh.common.config.connector.SourceConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-connectors/eventmesh-connector-wechat/src/main/java/org/apache/eventmesh/connector/wechat/sink/config/SinkConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/wechat/SinkConnectorConfig.java
similarity index 94%
rename from eventmesh-connectors/eventmesh-connector-wechat/src/main/java/org/apache/eventmesh/connector/wechat/sink/config/SinkConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/wechat/SinkConnectorConfig.java
index e575e65c6..95ca5e64c 100644
--- a/eventmesh-connectors/eventmesh-connector-wechat/src/main/java/org/apache/eventmesh/connector/wechat/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/wechat/SinkConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.wechat.sink.config;
+package org.apache.eventmesh.common.config.connector.wechat;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-wechat/src/main/java/org/apache/eventmesh/connector/wechat/sink/config/WeChatSinkConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/wechat/WeChatSinkConfig.java
similarity index 88%
rename from eventmesh-connectors/eventmesh-connector-wechat/src/main/java/org/apache/eventmesh/connector/wechat/sink/config/WeChatSinkConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/wechat/WeChatSinkConfig.java
index a77e1c77b..e968202c4 100644
--- a/eventmesh-connectors/eventmesh-connector-wechat/src/main/java/org/apache/eventmesh/connector/wechat/sink/config/WeChatSinkConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/wechat/WeChatSinkConfig.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.wechat.sink.config;
+package org.apache.eventmesh.common.config.connector.wechat;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.common.config.connector.SinkConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-connectors/eventmesh-connector-wecom/src/main/java/org/apache/eventmesh/connector/wecom/sink/config/SinkConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/wecom/SinkConnectorConfig.java
similarity index 94%
rename from eventmesh-connectors/eventmesh-connector-wecom/src/main/java/org/apache/eventmesh/connector/wecom/sink/config/SinkConnectorConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/wecom/SinkConnectorConfig.java
index 013d5a8bb..b32b5b7d3 100644
--- a/eventmesh-connectors/eventmesh-connector-wecom/src/main/java/org/apache/eventmesh/connector/wecom/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/wecom/SinkConnectorConfig.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.wecom.sink.config;
+package org.apache.eventmesh.common.config.connector.wecom;
 
 import lombok.Data;
 
diff --git a/eventmesh-connectors/eventmesh-connector-wecom/src/main/java/org/apache/eventmesh/connector/wecom/sink/config/WeComSinkConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/wecom/WeComSinkConfig.java
similarity index 89%
rename from eventmesh-connectors/eventmesh-connector-wecom/src/main/java/org/apache/eventmesh/connector/wecom/sink/config/WeComSinkConfig.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/wecom/WeComSinkConfig.java
index 8af43bdbe..5177baa44 100644
--- a/eventmesh-connectors/eventmesh-connector-wecom/src/main/java/org/apache/eventmesh/connector/wecom/sink/config/WeComSinkConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/connector/wecom/WeComSinkConfig.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.wecom.sink.config;
+package org.apache.eventmesh.common.config.connector.wecom;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
+import org.apache.eventmesh.common.config.connector.SinkConfig;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/SourceConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/enums/ComponentType.java
similarity index 72%
copy from eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/SourceConnectorConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/enums/ComponentType.java
index 6376a7fb4..a48e3fe01 100644
--- a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/SourceConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/enums/ComponentType.java
@@ -15,14 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.file.source.config;
+package org.apache.eventmesh.common.enums;
 
-import lombok.Data;
+public enum ComponentType {
+    CONNECTOR("connector"),
+    FUNCTION("function"),
+    MESH("mesh");
 
-@Data
-public class SourceConnectorConfig {
+    public String name;
 
-    private String connectorName;
+    ComponentType(String name) {
+        this.name = name;
+    }
 
-    private String filePath;
+    public String componentTypeName() {
+        return this.name;
+    }
 }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/grpc/adminserver/AdminServiceGrpc.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/grpc/adminserver/AdminServiceGrpc.java
new file mode 100644
index 000000000..df5f3ef33
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/grpc/adminserver/AdminServiceGrpc.java
@@ -0,0 +1,373 @@
+/*
+ * 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.eventmesh.common.protocol.grpc.adminserver;
+
+import static io.grpc.MethodDescriptor.generateFullMethodName;
+
+/**
+ * AdminServiceGrpc
+ */
+@javax.annotation.Generated(
+    value = "by gRPC proto compiler (version 1.40.0)",
+    comments = "Source: event_mesh_admin_service.proto")
+@io.grpc.stub.annotations.GrpcGenerated
+public final class AdminServiceGrpc {
+
+    private AdminServiceGrpc() {
+    }
+
+    public static final String SERVICE_NAME = "AdminService";
+
+    // Static method descriptors that strictly reflect the proto.
+    private static volatile io.grpc.MethodDescriptor<Payload,
+        Payload> getInvokeBiStreamMethod;
+
+    @io.grpc.stub.annotations.RpcMethod(
+        fullMethodName = SERVICE_NAME + '/' + "invokeBiStream",
+        requestType = Payload.class,
+        responseType = Payload.class,
+        methodType = io.grpc.MethodDescriptor.MethodType.BIDI_STREAMING)
+    public static io.grpc.MethodDescriptor<Payload,
+        Payload> getInvokeBiStreamMethod() {
+        io.grpc.MethodDescriptor<Payload, Payload> getInvokeBiStreamMethod;
+        if ((getInvokeBiStreamMethod = AdminServiceGrpc.getInvokeBiStreamMethod) == null) {
+            synchronized (AdminServiceGrpc.class) {
+                if ((getInvokeBiStreamMethod = AdminServiceGrpc.getInvokeBiStreamMethod) == null) {
+                    AdminServiceGrpc.getInvokeBiStreamMethod = getInvokeBiStreamMethod =
+                        io.grpc.MethodDescriptor.<Payload, Payload>newBuilder()
+                            .setType(io.grpc.MethodDescriptor.MethodType.BIDI_STREAMING)
+                            .setFullMethodName(generateFullMethodName(SERVICE_NAME, "invokeBiStream"))
+                            .setSampledToLocalTracing(true)
+                            .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                                Payload.getDefaultInstance()))
+                            .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                                Payload.getDefaultInstance()))
+                            .setSchemaDescriptor(new AdminServiceMethodDescriptorSupplier("invokeBiStream"))
+                            .build();
+                }
+            }
+        }
+        return getInvokeBiStreamMethod;
+    }
+
+    private static volatile io.grpc.MethodDescriptor<Payload,
+        Payload> getInvokeMethod;
+
+    @io.grpc.stub.annotations.RpcMethod(
+        fullMethodName = SERVICE_NAME + '/' + "invoke",
+        requestType = Payload.class,
+        responseType = Payload.class,
+        methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+    public static io.grpc.MethodDescriptor<Payload,
+        Payload> getInvokeMethod() {
+        io.grpc.MethodDescriptor<Payload, Payload> getInvokeMethod;
+        if ((getInvokeMethod = AdminServiceGrpc.getInvokeMethod) == null) {
+            synchronized (AdminServiceGrpc.class) {
+                if ((getInvokeMethod = AdminServiceGrpc.getInvokeMethod) == null) {
+                    AdminServiceGrpc.getInvokeMethod = getInvokeMethod =
+                        io.grpc.MethodDescriptor.<Payload, Payload>newBuilder()
+                            .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+                            .setFullMethodName(generateFullMethodName(SERVICE_NAME, "invoke"))
+                            .setSampledToLocalTracing(true)
+                            .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                                Payload.getDefaultInstance()))
+                            .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                                Payload.getDefaultInstance()))
+                            .setSchemaDescriptor(new AdminServiceMethodDescriptorSupplier("invoke"))
+                            .build();
+                }
+            }
+        }
+        return getInvokeMethod;
+    }
+
+    /**
+     * Creates a new async stub that supports all call types for the service
+     */
+    public static AdminServiceStub newStub(io.grpc.Channel channel) {
+        io.grpc.stub.AbstractStub.StubFactory<AdminServiceStub> factory =
+            new io.grpc.stub.AbstractStub.StubFactory<AdminServiceStub>() {
+                @Override
+                public AdminServiceStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+                    return new AdminServiceStub(channel, callOptions);
+                }
+            };
+        return AdminServiceStub.newStub(factory, channel);
+    }
+
+    /**
+     * Creates a new blocking-style stub that supports unary and streaming output calls on the service
+     */
+    public static AdminServiceBlockingStub newBlockingStub(
+        io.grpc.Channel channel) {
+        io.grpc.stub.AbstractStub.StubFactory<AdminServiceBlockingStub> factory =
+            new io.grpc.stub.AbstractStub.StubFactory<AdminServiceBlockingStub>() {
+                @Override
+                public AdminServiceBlockingStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+                    return new AdminServiceBlockingStub(channel, callOptions);
+                }
+            };
+        return AdminServiceBlockingStub.newStub(factory, channel);
+    }
+
+    /**
+     * Creates a new ListenableFuture-style stub that supports unary calls on the service
+     */
+    public static AdminServiceFutureStub newFutureStub(
+        io.grpc.Channel channel) {
+        io.grpc.stub.AbstractStub.StubFactory<AdminServiceFutureStub> factory =
+            new io.grpc.stub.AbstractStub.StubFactory<AdminServiceFutureStub>() {
+                @Override
+                public AdminServiceFutureStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+                    return new AdminServiceFutureStub(channel, callOptions);
+                }
+            };
+        return AdminServiceFutureStub.newStub(factory, channel);
+    }
+
+    /**
+     *
+     */
+    public static abstract class AdminServiceImplBase implements io.grpc.BindableService {
+
+        /**
+         *
+         */
+        public io.grpc.stub.StreamObserver<Payload> invokeBiStream(
+            io.grpc.stub.StreamObserver<Payload> responseObserver) {
+            return io.grpc.stub.ServerCalls.asyncUnimplementedStreamingCall(getInvokeBiStreamMethod(), responseObserver);
+        }
+
+        /**
+         *
+         */
+        public void invoke(Payload request,
+            io.grpc.stub.StreamObserver<Payload> responseObserver) {
+            io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getInvokeMethod(), responseObserver);
+        }
+
+        @Override
+        public final io.grpc.ServerServiceDefinition bindService() {
+            return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
+                .addMethod(
+                    getInvokeBiStreamMethod(),
+                    io.grpc.stub.ServerCalls.asyncBidiStreamingCall(
+                        new MethodHandlers<
+                            Payload,
+                            Payload>(
+                            this, METHODID_INVOKE_BI_STREAM)))
+                .addMethod(
+                    getInvokeMethod(),
+                    io.grpc.stub.ServerCalls.asyncUnaryCall(
+                        new MethodHandlers<
+                            Payload,
+                            Payload>(
+                            this, METHODID_INVOKE)))
+                .build();
+        }
+    }
+
+    /**
+     *
+     */
+    public static final class AdminServiceStub extends io.grpc.stub.AbstractAsyncStub<AdminServiceStub> {
+
+        private AdminServiceStub(
+            io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+            super(channel, callOptions);
+        }
+
+        @Override
+        protected AdminServiceStub build(
+            io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+            return new AdminServiceStub(channel, callOptions);
+        }
+
+        /**
+         *
+         */
+        public io.grpc.stub.StreamObserver<Payload> invokeBiStream(
+            io.grpc.stub.StreamObserver<Payload> responseObserver) {
+            return io.grpc.stub.ClientCalls.asyncBidiStreamingCall(
+                getChannel().newCall(getInvokeBiStreamMethod(), getCallOptions()), responseObserver);
+        }
+
+        /**
+         *
+         */
+        public void invoke(Payload request,
+            io.grpc.stub.StreamObserver<Payload> responseObserver) {
+            io.grpc.stub.ClientCalls.asyncUnaryCall(
+                getChannel().newCall(getInvokeMethod(), getCallOptions()), request, responseObserver);
+        }
+    }
+
+    /**
+     *
+     */
+    public static final class AdminServiceBlockingStub extends io.grpc.stub.AbstractBlockingStub<AdminServiceBlockingStub> {
+
+        private AdminServiceBlockingStub(
+            io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+            super(channel, callOptions);
+        }
+
+        @Override
+        protected AdminServiceBlockingStub build(
+            io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+            return new AdminServiceBlockingStub(channel, callOptions);
+        }
+
+        /**
+         *
+         */
+        public Payload invoke(Payload request) {
+            return io.grpc.stub.ClientCalls.blockingUnaryCall(
+                getChannel(), getInvokeMethod(), getCallOptions(), request);
+        }
+    }
+
+    /**
+     *
+     */
+    public static final class AdminServiceFutureStub extends io.grpc.stub.AbstractFutureStub<AdminServiceFutureStub> {
+
+        private AdminServiceFutureStub(
+            io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+            super(channel, callOptions);
+        }
+
+        @Override
+        protected AdminServiceFutureStub build(
+            io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+            return new AdminServiceFutureStub(channel, callOptions);
+        }
+
+        /**
+         *
+         */
+        public com.google.common.util.concurrent.ListenableFuture<Payload> invoke(
+            Payload request) {
+            return io.grpc.stub.ClientCalls.futureUnaryCall(
+                getChannel().newCall(getInvokeMethod(), getCallOptions()), request);
+        }
+    }
+
+    private static final int METHODID_INVOKE = 0;
+    private static final int METHODID_INVOKE_BI_STREAM = 1;
+
+    private static final class MethodHandlers<Req, Resp> implements
+        io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
+        io.grpc.stub.ServerCalls.ServerStreamingMethod<Req, Resp>,
+        io.grpc.stub.ServerCalls.ClientStreamingMethod<Req, Resp>,
+        io.grpc.stub.ServerCalls.BidiStreamingMethod<Req, Resp> {
+
+        private final AdminServiceImplBase serviceImpl;
+        private final int methodId;
+
+        MethodHandlers(AdminServiceImplBase serviceImpl, int methodId) {
+            this.serviceImpl = serviceImpl;
+            this.methodId = methodId;
+        }
+
+        @Override
+        @SuppressWarnings("unchecked")
+        public void invoke(Req request, io.grpc.stub.StreamObserver<Resp> responseObserver) {
+            switch (methodId) {
+                case METHODID_INVOKE:
+                    serviceImpl.invoke((Payload) request,
+                        (io.grpc.stub.StreamObserver<Payload>) responseObserver);
+                    break;
+                default:
+                    throw new AssertionError();
+            }
+        }
+
+        @Override
+        @SuppressWarnings("unchecked")
+        public io.grpc.stub.StreamObserver<Req> invoke(
+            io.grpc.stub.StreamObserver<Resp> responseObserver) {
+            switch (methodId) {
+                case METHODID_INVOKE_BI_STREAM:
+                    return (io.grpc.stub.StreamObserver<Req>) serviceImpl.invokeBiStream(
+                        (io.grpc.stub.StreamObserver<Payload>) responseObserver);
+                default:
+                    throw new AssertionError();
+            }
+        }
+    }
+
+    private static abstract class AdminServiceBaseDescriptorSupplier
+        implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier {
+
+        AdminServiceBaseDescriptorSupplier() {
+        }
+
+        @Override
+        public com.google.protobuf.Descriptors.FileDescriptor getFileDescriptor() {
+            return EventMeshAdminService.getDescriptor();
+        }
+
+        @Override
+        public com.google.protobuf.Descriptors.ServiceDescriptor getServiceDescriptor() {
+            return getFileDescriptor().findServiceByName("AdminService");
+        }
+    }
+
+    private static final class AdminServiceFileDescriptorSupplier
+        extends AdminServiceBaseDescriptorSupplier {
+
+        AdminServiceFileDescriptorSupplier() {
+        }
+    }
+
+    private static final class AdminServiceMethodDescriptorSupplier
+        extends AdminServiceBaseDescriptorSupplier
+        implements io.grpc.protobuf.ProtoMethodDescriptorSupplier {
+
+        private final String methodName;
+
+        AdminServiceMethodDescriptorSupplier(String methodName) {
+            this.methodName = methodName;
+        }
+
+        @Override
+        public com.google.protobuf.Descriptors.MethodDescriptor getMethodDescriptor() {
+            return getServiceDescriptor().findMethodByName(methodName);
+        }
+    }
+
+    private static volatile io.grpc.ServiceDescriptor serviceDescriptor;
+
+    public static io.grpc.ServiceDescriptor getServiceDescriptor() {
+        io.grpc.ServiceDescriptor result = serviceDescriptor;
+        if (result == null) {
+            synchronized (AdminServiceGrpc.class) {
+                result = serviceDescriptor;
+                if (result == null) {
+                    serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME)
+                        .setSchemaDescriptor(new AdminServiceFileDescriptorSupplier())
+                        .addMethod(getInvokeBiStreamMethod())
+                        .addMethod(getInvokeMethod())
+                        .build();
+                }
+            }
+        }
+        return result;
+    }
+}
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/grpc/adminserver/EventMeshAdminService.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/grpc/adminserver/EventMeshAdminService.java
new file mode 100644
index 000000000..d67ed4159
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/grpc/adminserver/EventMeshAdminService.java
@@ -0,0 +1,99 @@
+/*
+ * 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.eventmesh.common.protocol.grpc.adminserver;// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: event_mesh_admin_service.proto
+
+public final class EventMeshAdminService {
+
+    private EventMeshAdminService() {
+    }
+
+    public static void registerAllExtensions(
+        com.google.protobuf.ExtensionRegistryLite registry) {
+    }
+
+    public static void registerAllExtensions(
+        com.google.protobuf.ExtensionRegistry registry) {
+        registerAllExtensions(
+            (com.google.protobuf.ExtensionRegistryLite) registry);
+    }
+
+    static final com.google.protobuf.Descriptors.Descriptor
+        internal_static_Metadata_descriptor;
+    static final
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internal_static_Metadata_fieldAccessorTable;
+    static final com.google.protobuf.Descriptors.Descriptor
+        internal_static_Metadata_HeadersEntry_descriptor;
+    static final
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internal_static_Metadata_HeadersEntry_fieldAccessorTable;
+    static final com.google.protobuf.Descriptors.Descriptor
+        internal_static_Payload_descriptor;
+    static final
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internal_static_Payload_fieldAccessorTable;
+
+    public static com.google.protobuf.Descriptors.FileDescriptor
+    getDescriptor() {
+        return descriptor;
+    }
+
+    private static com.google.protobuf.Descriptors.FileDescriptor
+        descriptor;
+
+    static {
+        String[] descriptorData = {
+            "\n\036event_mesh_admin_service.proto\032\031google" +
+                "/protobuf/any.proto\"q\n\010Metadata\022\014\n\004type\030" +
+                "\003 \001(\t\022\'\n\007headers\030\007 \003(\0132\026.Metadata.Header" +
+                "sEntry\032.\n\014HeadersEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005v" +
+                "alue\030\002 \001(\t:\0028\001\"4\n\007Payload\022\033\n\010metadata\030\002 " +
+                "\001(\0132\t.Metadata\022\014\n\004body\030\003 \001(\0142Z\n\014AdminSer" +
+                "vice\022*\n\016invokeBiStream\022\010.Payload\032\010.Paylo" +
+                "ad\"\000(\0010\001\022\036\n\006invoke\022\010.Payload\032\010.Payload\"\000" +
+                "B\002P\001b\006proto3"
+        };
+        descriptor = com.google.protobuf.Descriptors.FileDescriptor
+            .internalBuildGeneratedFileFrom(descriptorData,
+                new com.google.protobuf.Descriptors.FileDescriptor[] {
+                    com.google.protobuf.AnyProto.getDescriptor(),
+                });
+        internal_static_Metadata_descriptor =
+            getDescriptor().getMessageTypes().get(0);
+        internal_static_Metadata_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+            internal_static_Metadata_descriptor,
+            new String[] {"Type", "Headers",});
+        internal_static_Metadata_HeadersEntry_descriptor =
+            internal_static_Metadata_descriptor.getNestedTypes().get(0);
+        internal_static_Metadata_HeadersEntry_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+            internal_static_Metadata_HeadersEntry_descriptor,
+            new String[] {"Key", "Value",});
+        internal_static_Payload_descriptor =
+            getDescriptor().getMessageTypes().get(1);
+        internal_static_Payload_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+            internal_static_Payload_descriptor,
+            new String[] {"Metadata", "Body",});
+        com.google.protobuf.AnyProto.getDescriptor();
+    }
+
+    // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/grpc/adminserver/Metadata.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/grpc/adminserver/Metadata.java
new file mode 100644
index 000000000..f25754f28
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/grpc/adminserver/Metadata.java
@@ -0,0 +1,962 @@
+/*
+ * 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.eventmesh.common.protocol.grpc.adminserver;// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: event_mesh_admin_service.proto
+
+/**
+ * Protobuf type {@code Metadata}
+ */
+public final class Metadata extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:Metadata)
+    MetadataOrBuilder {
+
+    private static final long serialVersionUID = 0L;
+
+    // Use Metadata.newBuilder() to construct.
+    private Metadata(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+        super(builder);
+    }
+
+    private Metadata() {
+        type_ = "";
+    }
+
+    @Override
+    @SuppressWarnings({"unused"})
+    protected Object newInstance(
+        UnusedPrivateParameter unused) {
+        return new Metadata();
+    }
+
+    @Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+        return this.unknownFields;
+    }
+
+    private Metadata(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+        this();
+        if (extensionRegistry == null) {
+            throw new NullPointerException();
+        }
+        int mutable_bitField0_ = 0;
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+            com.google.protobuf.UnknownFieldSet.newBuilder();
+        try {
+            boolean done = false;
+            while (!done) {
+                int tag = input.readTag();
+                switch (tag) {
+                    case 0:
+                        done = true;
+                        break;
+                    case 26: {
+                        String s = input.readStringRequireUtf8();
+
+                        type_ = s;
+                        break;
+                    }
+                    case 58: {
+                        if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                            headers_ = com.google.protobuf.MapField.newMapField(
+                                HeadersDefaultEntryHolder.defaultEntry);
+                            mutable_bitField0_ |= 0x00000001;
+                        }
+                        com.google.protobuf.MapEntry<String, String>
+                            headers__ = input.readMessage(
+                            HeadersDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry);
+                        headers_.getMutableMap().put(
+                            headers__.getKey(), headers__.getValue());
+                        break;
+                    }
+                    default: {
+                        if (!parseUnknownField(
+                            input, unknownFields, extensionRegistry, tag)) {
+                            done = true;
+                        }
+                        break;
+                    }
+                }
+            }
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+            throw e.setUnfinishedMessage(this);
+        } catch (java.io.IOException e) {
+            throw new com.google.protobuf.InvalidProtocolBufferException(
+                e).setUnfinishedMessage(this);
+        } finally {
+            this.unknownFields = unknownFields.build();
+            makeExtensionsImmutable();
+        }
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor
+    getDescriptor() {
+        return EventMeshAdminService.internal_static_Metadata_descriptor;
+    }
+
+    @SuppressWarnings({"rawtypes"})
+    @Override
+    protected com.google.protobuf.MapField internalGetMapField(
+        int number) {
+        switch (number) {
+            case 7:
+                return internalGetHeaders();
+            default:
+                throw new RuntimeException(
+                    "Invalid map field number: " + number);
+        }
+    }
+
+    @Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+    internalGetFieldAccessorTable() {
+        return EventMeshAdminService.internal_static_Metadata_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                Metadata.class, Builder.class);
+    }
+
+    public static final int TYPE_FIELD_NUMBER = 3;
+    private volatile Object type_;
+
+    /**
+     * <code>string type = 3;</code>
+     *
+     * @return The type.
+     */
+    @Override
+    public String getType() {
+        Object ref = type_;
+        if (ref instanceof String) {
+            return (String) ref;
+        } else {
+            com.google.protobuf.ByteString bs =
+                (com.google.protobuf.ByteString) ref;
+            String s = bs.toStringUtf8();
+            type_ = s;
+            return s;
+        }
+    }
+
+    /**
+     * <code>string type = 3;</code>
+     *
+     * @return The bytes for type.
+     */
+    @Override
+    public com.google.protobuf.ByteString
+    getTypeBytes() {
+        Object ref = type_;
+        if (ref instanceof String) {
+            com.google.protobuf.ByteString b =
+                com.google.protobuf.ByteString.copyFromUtf8(
+                    (String) ref);
+            type_ = b;
+            return b;
+        } else {
+            return (com.google.protobuf.ByteString) ref;
+        }
+    }
+
+    public static final int HEADERS_FIELD_NUMBER = 7;
+
+    private static final class HeadersDefaultEntryHolder {
+
+        static final com.google.protobuf.MapEntry<
+            String, String> defaultEntry =
+            com.google.protobuf.MapEntry
+                .<String, String>newDefaultInstance(
+                    EventMeshAdminService.internal_static_Metadata_HeadersEntry_descriptor,
+                    com.google.protobuf.WireFormat.FieldType.STRING,
+                    "",
+                    com.google.protobuf.WireFormat.FieldType.STRING,
+                    "");
+    }
+
+    private com.google.protobuf.MapField<
+        String, String> headers_;
+
+    private com.google.protobuf.MapField<String, String>
+    internalGetHeaders() {
+        if (headers_ == null) {
+            return com.google.protobuf.MapField.emptyMapField(
+                HeadersDefaultEntryHolder.defaultEntry);
+        }
+        return headers_;
+    }
+
+    public int getHeadersCount() {
+        return internalGetHeaders().getMap().size();
+    }
+
+    /**
+     * <code>map&lt;string, string&gt; headers = 7;</code>
+     */
+
+    @Override
+    public boolean containsHeaders(
+        String key) {
+        if (key == null) {
+            throw new NullPointerException();
+        }
+        return internalGetHeaders().getMap().containsKey(key);
+    }
+
+    /**
+     * Use {@link #getHeadersMap()} instead.
+     */
+    @Override
+    @Deprecated
+    public java.util.Map<String, String> getHeaders() {
+        return getHeadersMap();
+    }
+
+    /**
+     * <code>map&lt;string, string&gt; headers = 7;</code>
+     */
+    @Override
+
+    public java.util.Map<String, String> getHeadersMap() {
+        return internalGetHeaders().getMap();
+    }
+
+    /**
+     * <code>map&lt;string, string&gt; headers = 7;</code>
+     */
+    @Override
+
+    public String getHeadersOrDefault(
+        String key,
+        String defaultValue) {
+        if (key == null) {
+            throw new NullPointerException();
+        }
+        java.util.Map<String, String> map =
+            internalGetHeaders().getMap();
+        return map.containsKey(key) ? map.get(key) : defaultValue;
+    }
+
+    /**
+     * <code>map&lt;string, string&gt; headers = 7;</code>
+     */
+    @Override
+
+    public String getHeadersOrThrow(
+        String key) {
+        if (key == null) {
+            throw new NullPointerException();
+        }
+        java.util.Map<String, String> map =
+            internalGetHeaders().getMap();
+        if (!map.containsKey(key)) {
+            throw new IllegalArgumentException();
+        }
+        return map.get(key);
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @Override
+    public final boolean isInitialized() {
+        byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) {
+        return true;
+      }
+      if (isInitialized == 0) {
+        return false;
+      }
+
+        memoizedIsInitialized = 1;
+        return true;
+    }
+
+    @Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+        throws java.io.IOException {
+        if (!getTypeBytes().isEmpty()) {
+            com.google.protobuf.GeneratedMessageV3.writeString(output, 3, type_);
+        }
+        com.google.protobuf.GeneratedMessageV3
+            .serializeStringMapTo(
+                output,
+                internalGetHeaders(),
+                HeadersDefaultEntryHolder.defaultEntry,
+                7);
+        unknownFields.writeTo(output);
+    }
+
+    @Override
+    public int getSerializedSize() {
+        int size = memoizedSize;
+      if (size != -1) {
+        return size;
+      }
+
+        size = 0;
+        if (!getTypeBytes().isEmpty()) {
+            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, type_);
+        }
+        for (java.util.Map.Entry<String, String> entry
+            : internalGetHeaders().getMap().entrySet()) {
+            com.google.protobuf.MapEntry<String, String>
+                headers__ = HeadersDefaultEntryHolder.defaultEntry.newBuilderForType()
+                .setKey(entry.getKey())
+                .setValue(entry.getValue())
+                .build();
+            size += com.google.protobuf.CodedOutputStream
+                .computeMessageSize(7, headers__);
+        }
+        size += unknownFields.getSerializedSize();
+        memoizedSize = size;
+        return size;
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (obj == this) {
+            return true;
+        }
+        if (!(obj instanceof Metadata)) {
+            return super.equals(obj);
+        }
+        Metadata other = (Metadata) obj;
+
+      if (!getType()
+          .equals(other.getType())) {
+        return false;
+      }
+      if (!internalGetHeaders().equals(
+          other.internalGetHeaders())) {
+        return false;
+      }
+      if (!unknownFields.equals(other.unknownFields)) {
+        return false;
+      }
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        if (memoizedHashCode != 0) {
+            return memoizedHashCode;
+        }
+        int hash = 41;
+        hash = (19 * hash) + getDescriptor().hashCode();
+        hash = (37 * hash) + TYPE_FIELD_NUMBER;
+        hash = (53 * hash) + getType().hashCode();
+        if (!internalGetHeaders().getMap().isEmpty()) {
+            hash = (37 * hash) + HEADERS_FIELD_NUMBER;
+            hash = (53 * hash) + internalGetHeaders().hashCode();
+        }
+        hash = (29 * hash) + unknownFields.hashCode();
+        memoizedHashCode = hash;
+        return hash;
+    }
+
+    public static Metadata parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data);
+    }
+
+    public static Metadata parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static Metadata parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data);
+    }
+
+    public static Metadata parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static Metadata parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data);
+    }
+
+    public static Metadata parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static Metadata parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input);
+    }
+
+    public static Metadata parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static Metadata parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static Metadata parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static Metadata parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input);
+    }
+
+    public static Metadata parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @Override
+    public Builder newBuilderForType() {
+        return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+        return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(Metadata prototype) {
+        return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @Override
+    public Builder toBuilder() {
+        return this == DEFAULT_INSTANCE
+            ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        Builder builder = new Builder(parent);
+        return builder;
+    }
+
+    /**
+     * Protobuf type {@code Metadata}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:Metadata)
+        MetadataOrBuilder {
+
+        public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+            return EventMeshAdminService.internal_static_Metadata_descriptor;
+        }
+
+        @SuppressWarnings({"rawtypes"})
+        protected com.google.protobuf.MapField internalGetMapField(
+            int number) {
+            switch (number) {
+                case 7:
+                    return internalGetHeaders();
+                default:
+                    throw new RuntimeException(
+                        "Invalid map field number: " + number);
+            }
+        }
+
+        @SuppressWarnings({"rawtypes"})
+        protected com.google.protobuf.MapField internalGetMutableMapField(
+            int number) {
+            switch (number) {
+                case 7:
+                    return internalGetMutableHeaders();
+                default:
+                    throw new RuntimeException(
+                        "Invalid map field number: " + number);
+            }
+        }
+
+        @Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+            return EventMeshAdminService.internal_static_Metadata_fieldAccessorTable
+                .ensureFieldAccessorsInitialized(
+                    Metadata.class, Builder.class);
+        }
+
+        // Construct using Metadata.newBuilder()
+        private Builder() {
+            maybeForceBuilderInitialization();
+        }
+
+        private Builder(
+            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+            super(parent);
+            maybeForceBuilderInitialization();
+        }
+
+        private void maybeForceBuilderInitialization() {
+            if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+            }
+        }
+
+        @Override
+        public Builder clear() {
+            super.clear();
+            type_ = "";
+
+            internalGetMutableHeaders().clear();
+            return this;
+        }
+
+        @Override
+        public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+            return EventMeshAdminService.internal_static_Metadata_descriptor;
+        }
+
+        @Override
+        public Metadata getDefaultInstanceForType() {
+            return Metadata.getDefaultInstance();
+        }
+
+        @Override
+        public Metadata build() {
+            Metadata result = buildPartial();
+            if (!result.isInitialized()) {
+                throw newUninitializedMessageException(result);
+            }
+            return result;
+        }
+
+        @Override
+        public Metadata buildPartial() {
+            Metadata result = new Metadata(this);
+            int from_bitField0_ = bitField0_;
+            result.type_ = type_;
+            result.headers_ = internalGetHeaders();
+            result.headers_.makeImmutable();
+            onBuilt();
+            return result;
+        }
+
+        @Override
+        public Builder clone() {
+            return super.clone();
+        }
+
+        @Override
+        public Builder setField(
+            com.google.protobuf.Descriptors.FieldDescriptor field,
+            Object value) {
+            return super.setField(field, value);
+        }
+
+        @Override
+        public Builder clearField(
+            com.google.protobuf.Descriptors.FieldDescriptor field) {
+            return super.clearField(field);
+        }
+
+        @Override
+        public Builder clearOneof(
+            com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+            return super.clearOneof(oneof);
+        }
+
+        @Override
+        public Builder setRepeatedField(
+            com.google.protobuf.Descriptors.FieldDescriptor field,
+            int index, Object value) {
+            return super.setRepeatedField(field, index, value);
+        }
+
+        @Override
+        public Builder addRepeatedField(
+            com.google.protobuf.Descriptors.FieldDescriptor field,
+            Object value) {
+            return super.addRepeatedField(field, value);
+        }
+
+        @Override
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+            if (other instanceof Metadata) {
+                return mergeFrom((Metadata) other);
+            } else {
+                super.mergeFrom(other);
+                return this;
+            }
+        }
+
+        public Builder mergeFrom(Metadata other) {
+          if (other == Metadata.getDefaultInstance()) {
+            return this;
+          }
+            if (!other.getType().isEmpty()) {
+                type_ = other.type_;
+                onChanged();
+            }
+            internalGetMutableHeaders().mergeFrom(
+                other.internalGetHeaders());
+            this.mergeUnknownFields(other.unknownFields);
+            onChanged();
+            return this;
+        }
+
+        @Override
+        public final boolean isInitialized() {
+            return true;
+        }
+
+        @Override
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+            Metadata parsedMessage = null;
+            try {
+                parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                parsedMessage = (Metadata) e.getUnfinishedMessage();
+                throw e.unwrapIOException();
+            } finally {
+                if (parsedMessage != null) {
+                    mergeFrom(parsedMessage);
+                }
+            }
+            return this;
+        }
+
+        private int bitField0_;
+
+        private Object type_ = "";
+
+        /**
+         * <code>string type = 3;</code>
+         *
+         * @return The type.
+         */
+        public String getType() {
+            Object ref = type_;
+            if (!(ref instanceof String)) {
+                com.google.protobuf.ByteString bs =
+                    (com.google.protobuf.ByteString) ref;
+                String s = bs.toStringUtf8();
+                type_ = s;
+                return s;
+            } else {
+                return (String) ref;
+            }
+        }
+
+        /**
+         * <code>string type = 3;</code>
+         *
+         * @return The bytes for type.
+         */
+        public com.google.protobuf.ByteString
+        getTypeBytes() {
+            Object ref = type_;
+            if (ref instanceof String) {
+                com.google.protobuf.ByteString b =
+                    com.google.protobuf.ByteString.copyFromUtf8(
+                        (String) ref);
+                type_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        /**
+         * <code>string type = 3;</code>
+         *
+         * @param value The type to set.
+         * @return This builder for chaining.
+         */
+        public Builder setType(
+            String value) {
+            if (value == null) {
+                throw new NullPointerException();
+            }
+
+            type_ = value;
+            onChanged();
+            return this;
+        }
+
+        /**
+         * <code>string type = 3;</code>
+         *
+         * @return This builder for chaining.
+         */
+        public Builder clearType() {
+
+            type_ = getDefaultInstance().getType();
+            onChanged();
+            return this;
+        }
+
+        /**
+         * <code>string type = 3;</code>
+         *
+         * @param value The bytes for type to set.
+         * @return This builder for chaining.
+         */
+        public Builder setTypeBytes(
+            com.google.protobuf.ByteString value) {
+            if (value == null) {
+                throw new NullPointerException();
+            }
+            checkByteStringIsUtf8(value);
+
+            type_ = value;
+            onChanged();
+            return this;
+        }
+
+        private com.google.protobuf.MapField<
+            String, String> headers_;
+
+        private com.google.protobuf.MapField<String, String>
+        internalGetHeaders() {
+            if (headers_ == null) {
+                return com.google.protobuf.MapField.emptyMapField(
+                    HeadersDefaultEntryHolder.defaultEntry);
+            }
+            return headers_;
+        }
+
+        private com.google.protobuf.MapField<String, String>
+        internalGetMutableHeaders() {
+            onChanged();
+            ;
+            if (headers_ == null) {
+                headers_ = com.google.protobuf.MapField.newMapField(
+                    HeadersDefaultEntryHolder.defaultEntry);
+            }
+            if (!headers_.isMutable()) {
+                headers_ = headers_.copy();
+            }
+            return headers_;
+        }
+
+        public int getHeadersCount() {
+            return internalGetHeaders().getMap().size();
+        }
+
+        /**
+         * <code>map&lt;string, string&gt; headers = 7;</code>
+         */
+
+        @Override
+        public boolean containsHeaders(
+            String key) {
+            if (key == null) {
+                throw new NullPointerException();
+            }
+            return internalGetHeaders().getMap().containsKey(key);
+        }
+
+        /**
+         * Use {@link #getHeadersMap()} instead.
+         */
+        @Override
+        @Deprecated
+        public java.util.Map<String, String> getHeaders() {
+            return getHeadersMap();
+        }
+
+        /**
+         * <code>map&lt;string, string&gt; headers = 7;</code>
+         */
+        @Override
+
+        public java.util.Map<String, String> getHeadersMap() {
+            return internalGetHeaders().getMap();
+        }
+
+        /**
+         * <code>map&lt;string, string&gt; headers = 7;</code>
+         */
+        @Override
+
+        public String getHeadersOrDefault(
+            String key,
+            String defaultValue) {
+            if (key == null) {
+                throw new NullPointerException();
+            }
+            java.util.Map<String, String> map =
+                internalGetHeaders().getMap();
+            return map.containsKey(key) ? map.get(key) : defaultValue;
+        }
+
+        /**
+         * <code>map&lt;string, string&gt; headers = 7;</code>
+         */
+        @Override
+
+        public String getHeadersOrThrow(
+            String key) {
+            if (key == null) {
+                throw new NullPointerException();
+            }
+            java.util.Map<String, String> map =
+                internalGetHeaders().getMap();
+            if (!map.containsKey(key)) {
+                throw new IllegalArgumentException();
+            }
+            return map.get(key);
+        }
+
+        public Builder clearHeaders() {
+            internalGetMutableHeaders().getMutableMap()
+                .clear();
+            return this;
+        }
+
+        /**
+         * <code>map&lt;string, string&gt; headers = 7;</code>
+         */
+
+        public Builder removeHeaders(
+            String key) {
+            if (key == null) {
+                throw new NullPointerException();
+            }
+            internalGetMutableHeaders().getMutableMap()
+                .remove(key);
+            return this;
+        }
+
+        /**
+         * Use alternate mutation accessors instead.
+         */
+        @Deprecated
+        public java.util.Map<String, String>
+        getMutableHeaders() {
+            return internalGetMutableHeaders().getMutableMap();
+        }
+
+        /**
+         * <code>map&lt;string, string&gt; headers = 7;</code>
+         */
+        public Builder putHeaders(
+            String key,
+            String value) {
+            if (key == null) {
+                throw new NullPointerException();
+            }
+            if (value == null) {
+                throw new NullPointerException();
+            }
+            internalGetMutableHeaders().getMutableMap()
+                .put(key, value);
+            return this;
+        }
+
+        /**
+         * <code>map&lt;string, string&gt; headers = 7;</code>
+         */
+
+        public Builder putAllHeaders(
+            java.util.Map<String, String> values) {
+            internalGetMutableHeaders().getMutableMap()
+                .putAll(values);
+            return this;
+        }
+
+        @Override
+        public final Builder setUnknownFields(
+            final com.google.protobuf.UnknownFieldSet unknownFields) {
+            return super.setUnknownFields(unknownFields);
+        }
+
+        @Override
+        public final Builder mergeUnknownFields(
+            final com.google.protobuf.UnknownFieldSet unknownFields) {
+            return super.mergeUnknownFields(unknownFields);
+        }
+
+        // @@protoc_insertion_point(builder_scope:Metadata)
+    }
+
+    // @@protoc_insertion_point(class_scope:Metadata)
+    private static final Metadata DEFAULT_INSTANCE;
+
+    static {
+        DEFAULT_INSTANCE = new Metadata();
+    }
+
+    public static Metadata getDefaultInstance() {
+        return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<Metadata>
+        PARSER = new com.google.protobuf.AbstractParser<Metadata>() {
+        @Override
+        public Metadata parsePartialFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+            return new Metadata(input, extensionRegistry);
+        }
+    };
+
+    public static com.google.protobuf.Parser<Metadata> parser() {
+        return PARSER;
+    }
+
+    @Override
+    public com.google.protobuf.Parser<Metadata> getParserForType() {
+        return PARSER;
+    }
+
+    @Override
+    public Metadata getDefaultInstanceForType() {
+        return DEFAULT_INSTANCE;
+    }
+
+}
+
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/grpc/adminserver/MetadataOrBuilder.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/grpc/adminserver/MetadataOrBuilder.java
new file mode 100644
index 000000000..7afef491f
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/grpc/adminserver/MetadataOrBuilder.java
@@ -0,0 +1,78 @@
+/*
+ * 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.eventmesh.common.protocol.grpc.adminserver;// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: event_mesh_admin_service.proto
+
+public interface MetadataOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:Metadata)
+    com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>string type = 3;</code>
+     *
+     * @return The type.
+     */
+    String getType();
+
+    /**
+     * <code>string type = 3;</code>
+     *
+     * @return The bytes for type.
+     */
+    com.google.protobuf.ByteString
+    getTypeBytes();
+
+    /**
+     * <code>map&lt;string, string&gt; headers = 7;</code>
+     */
+    int getHeadersCount();
+
+    /**
+     * <code>map&lt;string, string&gt; headers = 7;</code>
+     */
+    boolean containsHeaders(
+        String key);
+
+    /**
+     * Use {@link #getHeadersMap()} instead.
+     */
+    @Deprecated
+    java.util.Map<String, String>
+    getHeaders();
+
+    /**
+     * <code>map&lt;string, string&gt; headers = 7;</code>
+     */
+    java.util.Map<String, String>
+    getHeadersMap();
+
+    /**
+     * <code>map&lt;string, string&gt; headers = 7;</code>
+     */
+
+    String getHeadersOrDefault(
+        String key,
+        String defaultValue);
+
+    /**
+     * <code>map&lt;string, string&gt; headers = 7;</code>
+     */
+
+    String getHeadersOrThrow(
+        String key);
+}
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/grpc/adminserver/Payload.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/grpc/adminserver/Payload.java
new file mode 100644
index 000000000..a0067099a
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/grpc/adminserver/Payload.java
@@ -0,0 +1,893 @@
+/*
+ * 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.eventmesh.common.protocol.grpc.adminserver;// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: event_mesh_admin_service.proto
+
+/**
+ * Protobuf type {@code Payload}
+ */
+public final class Payload extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:Payload)
+    PayloadOrBuilder {
+
+    private static final long serialVersionUID = 0L;
+
+    // Use Payload.newBuilder() to construct.
+    private Payload(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+        super(builder);
+    }
+
+    private Payload() {
+    }
+
+    @Override
+    @SuppressWarnings({"unused"})
+    protected Object newInstance(
+        UnusedPrivateParameter unused) {
+        return new Payload();
+    }
+
+    @Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+        return this.unknownFields;
+    }
+
+    private Payload(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+        this();
+        if (extensionRegistry == null) {
+            throw new NullPointerException();
+        }
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+            com.google.protobuf.UnknownFieldSet.newBuilder();
+        try {
+            boolean done = false;
+            while (!done) {
+                int tag = input.readTag();
+                switch (tag) {
+                    case 0:
+                        done = true;
+                        break;
+                    case 18: {
+                        Metadata.Builder subBuilder = null;
+                        if (metadata_ != null) {
+                            subBuilder = metadata_.toBuilder();
+                        }
+                        metadata_ = input.readMessage(Metadata.parser(), extensionRegistry);
+                        if (subBuilder != null) {
+                            subBuilder.mergeFrom(metadata_);
+                            metadata_ = subBuilder.buildPartial();
+                        }
+
+                        break;
+                    }
+                    case 26: {
+                        com.google.protobuf.Any.Builder subBuilder = null;
+                        if (body_ != null) {
+                            subBuilder = body_.toBuilder();
+                        }
+                        body_ = input.readMessage(com.google.protobuf.Any.parser(), extensionRegistry);
+                        if (subBuilder != null) {
+                            subBuilder.mergeFrom(body_);
+                            body_ = subBuilder.buildPartial();
+                        }
+
+                        break;
+                    }
+                    default: {
+                        if (!parseUnknownField(
+                            input, unknownFields, extensionRegistry, tag)) {
+                            done = true;
+                        }
+                        break;
+                    }
+                }
+            }
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+            throw e.setUnfinishedMessage(this);
+        } catch (java.io.IOException e) {
+            throw new com.google.protobuf.InvalidProtocolBufferException(
+                e).setUnfinishedMessage(this);
+        } finally {
+            this.unknownFields = unknownFields.build();
+            makeExtensionsImmutable();
+        }
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor
+    getDescriptor() {
+        return EventMeshAdminService.internal_static_Payload_descriptor;
+    }
+
+    @Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+    internalGetFieldAccessorTable() {
+        return EventMeshAdminService.internal_static_Payload_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                Payload.class, Builder.class);
+    }
+
+    public static final int METADATA_FIELD_NUMBER = 2;
+    private Metadata metadata_;
+
+    /**
+     * <code>.Metadata metadata = 2;</code>
+     *
+     * @return Whether the metadata field is set.
+     */
+    @Override
+    public boolean hasMetadata() {
+        return metadata_ != null;
+    }
+
+    /**
+     * <code>.Metadata metadata = 2;</code>
+     *
+     * @return The metadata.
+     */
+    @Override
+    public Metadata getMetadata() {
+        return metadata_ == null ? Metadata.getDefaultInstance() : metadata_;
+    }
+
+    /**
+     * <code>.Metadata metadata = 2;</code>
+     */
+    @Override
+    public MetadataOrBuilder getMetadataOrBuilder() {
+        return getMetadata();
+    }
+
+    public static final int BODY_FIELD_NUMBER = 3;
+    private com.google.protobuf.Any body_;
+
+    /**
+     * <code>.google.protobuf.Any body = 3;</code>
+     *
+     * @return Whether the body field is set.
+     */
+    @Override
+    public boolean hasBody() {
+        return body_ != null;
+    }
+
+    /**
+     * <code>.google.protobuf.Any body = 3;</code>
+     *
+     * @return The body.
+     */
+    @Override
+    public com.google.protobuf.Any getBody() {
+        return body_ == null ? com.google.protobuf.Any.getDefaultInstance() : body_;
+    }
+
+    /**
+     * <code>.google.protobuf.Any body = 3;</code>
+     */
+    @Override
+    public com.google.protobuf.AnyOrBuilder getBodyOrBuilder() {
+        return getBody();
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @Override
+    public final boolean isInitialized() {
+        byte isInitialized = memoizedIsInitialized;
+        if (isInitialized == 1) {
+            return true;
+        }
+        if (isInitialized == 0) {
+            return false;
+        }
+
+        memoizedIsInitialized = 1;
+        return true;
+    }
+
+    @Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+        throws java.io.IOException {
+        if (metadata_ != null) {
+            output.writeMessage(2, getMetadata());
+        }
+        if (body_ != null) {
+            output.writeMessage(3, getBody());
+        }
+        unknownFields.writeTo(output);
+    }
+
+    @Override
+    public int getSerializedSize() {
+        int size = memoizedSize;
+        if (size != -1) {
+            return size;
+        }
+
+        size = 0;
+        if (metadata_ != null) {
+            size += com.google.protobuf.CodedOutputStream
+                .computeMessageSize(2, getMetadata());
+        }
+        if (body_ != null) {
+            size += com.google.protobuf.CodedOutputStream
+                .computeMessageSize(3, getBody());
+        }
+        size += unknownFields.getSerializedSize();
+        memoizedSize = size;
+        return size;
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (obj == this) {
+            return true;
+        }
+        if (!(obj instanceof Payload)) {
+            return super.equals(obj);
+        }
+        Payload other = (Payload) obj;
+
+        if (hasMetadata() != other.hasMetadata()) {
+            return false;
+        }
+        if (hasMetadata()) {
+            if (!getMetadata()
+                .equals(other.getMetadata())) {
+                return false;
+            }
+        }
+        if (hasBody() != other.hasBody()) {
+            return false;
+        }
+        if (hasBody()) {
+            if (!getBody()
+                .equals(other.getBody())) {
+                return false;
+            }
+        }
+        if (!unknownFields.equals(other.unknownFields)) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        if (memoizedHashCode != 0) {
+            return memoizedHashCode;
+        }
+        int hash = 41;
+        hash = (19 * hash) + getDescriptor().hashCode();
+        if (hasMetadata()) {
+            hash = (37 * hash) + METADATA_FIELD_NUMBER;
+            hash = (53 * hash) + getMetadata().hashCode();
+        }
+        if (hasBody()) {
+            hash = (37 * hash) + BODY_FIELD_NUMBER;
+            hash = (53 * hash) + getBody().hashCode();
+        }
+        hash = (29 * hash) + unknownFields.hashCode();
+        memoizedHashCode = hash;
+        return hash;
+    }
+
+    public static Payload parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data);
+    }
+
+    public static Payload parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static Payload parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data);
+    }
+
+    public static Payload parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static Payload parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data);
+    }
+
+    public static Payload parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static Payload parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input);
+    }
+
+    public static Payload parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static Payload parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static Payload parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static Payload parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input);
+    }
+
+    public static Payload parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @Override
+    public Builder newBuilderForType() {
+        return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+        return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(Payload prototype) {
+        return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @Override
+    public Builder toBuilder() {
+        return this == DEFAULT_INSTANCE
+            ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        Builder builder = new Builder(parent);
+        return builder;
+    }
+
+    /**
+     * Protobuf type {@code Payload}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:Payload)
+        PayloadOrBuilder {
+
+        public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+            return EventMeshAdminService.internal_static_Payload_descriptor;
+        }
+
+        @Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+            return EventMeshAdminService.internal_static_Payload_fieldAccessorTable
+                .ensureFieldAccessorsInitialized(
+                    Payload.class, Builder.class);
+        }
+
+        // Construct using Payload.newBuilder()
+        private Builder() {
+            maybeForceBuilderInitialization();
+        }
+
+        private Builder(
+            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+            super(parent);
+            maybeForceBuilderInitialization();
+        }
+
+        private void maybeForceBuilderInitialization() {
+            if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+            }
+        }
+
+        @Override
+        public Builder clear() {
+            super.clear();
+            if (metadataBuilder_ == null) {
+                metadata_ = null;
+            } else {
+                metadata_ = null;
+                metadataBuilder_ = null;
+            }
+            if (bodyBuilder_ == null) {
+                body_ = null;
+            } else {
+                body_ = null;
+                bodyBuilder_ = null;
+            }
+            return this;
+        }
+
+        @Override
+        public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+            return EventMeshAdminService.internal_static_Payload_descriptor;
+        }
+
+        @Override
+        public Payload getDefaultInstanceForType() {
+            return Payload.getDefaultInstance();
+        }
+
+        @Override
+        public Payload build() {
+            Payload result = buildPartial();
+            if (!result.isInitialized()) {
+                throw newUninitializedMessageException(result);
+            }
+            return result;
+        }
+
+        @Override
+        public Payload buildPartial() {
+            Payload result = new Payload(this);
+            if (metadataBuilder_ == null) {
+                result.metadata_ = metadata_;
+            } else {
+                result.metadata_ = metadataBuilder_.build();
+            }
+            if (bodyBuilder_ == null) {
+                result.body_ = body_;
+            } else {
+                result.body_ = bodyBuilder_.build();
+            }
+            onBuilt();
+            return result;
+        }
+
+        @Override
+        public Builder clone() {
+            return super.clone();
+        }
+
+        @Override
+        public Builder setField(
+            com.google.protobuf.Descriptors.FieldDescriptor field,
+            Object value) {
+            return super.setField(field, value);
+        }
+
+        @Override
+        public Builder clearField(
+            com.google.protobuf.Descriptors.FieldDescriptor field) {
+            return super.clearField(field);
+        }
+
+        @Override
+        public Builder clearOneof(
+            com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+            return super.clearOneof(oneof);
+        }
+
+        @Override
+        public Builder setRepeatedField(
+            com.google.protobuf.Descriptors.FieldDescriptor field,
+            int index, Object value) {
+            return super.setRepeatedField(field, index, value);
+        }
+
+        @Override
+        public Builder addRepeatedField(
+            com.google.protobuf.Descriptors.FieldDescriptor field,
+            Object value) {
+            return super.addRepeatedField(field, value);
+        }
+
+        @Override
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+            if (other instanceof Payload) {
+                return mergeFrom((Payload) other);
+            } else {
+                super.mergeFrom(other);
+                return this;
+            }
+        }
+
+        public Builder mergeFrom(Payload other) {
+            if (other == Payload.getDefaultInstance()) {
+                return this;
+            }
+            if (other.hasMetadata()) {
+                mergeMetadata(other.getMetadata());
+            }
+            if (other.hasBody()) {
+                mergeBody(other.getBody());
+            }
+            this.mergeUnknownFields(other.unknownFields);
+            onChanged();
+            return this;
+        }
+
+        @Override
+        public final boolean isInitialized() {
+            return true;
+        }
+
+        @Override
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+            Payload parsedMessage = null;
+            try {
+                parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                parsedMessage = (Payload) e.getUnfinishedMessage();
+                throw e.unwrapIOException();
+            } finally {
+                if (parsedMessage != null) {
+                    mergeFrom(parsedMessage);
+                }
+            }
+            return this;
+        }
+
+        private Metadata metadata_;
+        private com.google.protobuf.SingleFieldBuilderV3<
+            Metadata, Metadata.Builder, MetadataOrBuilder> metadataBuilder_;
+
+        /**
+         * <code>.Metadata metadata = 2;</code>
+         *
+         * @return Whether the metadata field is set.
+         */
+        public boolean hasMetadata() {
+            return metadataBuilder_ != null || metadata_ != null;
+        }
+
+        /**
+         * <code>.Metadata metadata = 2;</code>
+         *
+         * @return The metadata.
+         */
+        public Metadata getMetadata() {
+            if (metadataBuilder_ == null) {
+                return metadata_ == null ? Metadata.getDefaultInstance() : metadata_;
+            } else {
+                return metadataBuilder_.getMessage();
+            }
+        }
+
+        /**
+         * <code>.Metadata metadata = 2;</code>
+         */
+        public Builder setMetadata(Metadata value) {
+            if (metadataBuilder_ == null) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                metadata_ = value;
+                onChanged();
+            } else {
+                metadataBuilder_.setMessage(value);
+            }
+
+            return this;
+        }
+
+        /**
+         * <code>.Metadata metadata = 2;</code>
+         */
+        public Builder setMetadata(
+            Metadata.Builder builderForValue) {
+            if (metadataBuilder_ == null) {
+                metadata_ = builderForValue.build();
+                onChanged();
+            } else {
+                metadataBuilder_.setMessage(builderForValue.build());
+            }
+
+            return this;
+        }
+
+        /**
+         * <code>.Metadata metadata = 2;</code>
+         */
+        public Builder mergeMetadata(Metadata value) {
+            if (metadataBuilder_ == null) {
+                if (metadata_ != null) {
+                    metadata_ =
+                        Metadata.newBuilder(metadata_).mergeFrom(value).buildPartial();
+                } else {
+                    metadata_ = value;
+                }
+                onChanged();
+            } else {
+                metadataBuilder_.mergeFrom(value);
+            }
+
+            return this;
+        }
+
+        /**
+         * <code>.Metadata metadata = 2;</code>
+         */
+        public Builder clearMetadata() {
+            if (metadataBuilder_ == null) {
+                metadata_ = null;
+                onChanged();
+            } else {
+                metadata_ = null;
+                metadataBuilder_ = null;
+            }
+
+            return this;
+        }
+
+        /**
+         * <code>.Metadata metadata = 2;</code>
+         */
+        public Metadata.Builder getMetadataBuilder() {
+
+            onChanged();
+            return getMetadataFieldBuilder().getBuilder();
+        }
+
+        /**
+         * <code>.Metadata metadata = 2;</code>
+         */
+        public MetadataOrBuilder getMetadataOrBuilder() {
+            if (metadataBuilder_ != null) {
+                return metadataBuilder_.getMessageOrBuilder();
+            } else {
+                return metadata_ == null ?
+                    Metadata.getDefaultInstance() : metadata_;
+            }
+        }
+
+        /**
+         * <code>.Metadata metadata = 2;</code>
+         */
+        private com.google.protobuf.SingleFieldBuilderV3<
+            Metadata, Metadata.Builder, MetadataOrBuilder>
+        getMetadataFieldBuilder() {
+            if (metadataBuilder_ == null) {
+                metadataBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+                    Metadata, Metadata.Builder, MetadataOrBuilder>(
+                    getMetadata(),
+                    getParentForChildren(),
+                    isClean());
+                metadata_ = null;
+            }
+            return metadataBuilder_;
+        }
+
+        private com.google.protobuf.Any body_;
+        private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.protobuf.Any, com.google.protobuf.Any.Builder, com.google.protobuf.AnyOrBuilder> bodyBuilder_;
+
+        /**
+         * <code>.google.protobuf.Any body = 3;</code>
+         *
+         * @return Whether the body field is set.
+         */
+        public boolean hasBody() {
+            return bodyBuilder_ != null || body_ != null;
+        }
+
+        /**
+         * <code>.google.protobuf.Any body = 3;</code>
+         *
+         * @return The body.
+         */
+        public com.google.protobuf.Any getBody() {
+            if (bodyBuilder_ == null) {
+                return body_ == null ? com.google.protobuf.Any.getDefaultInstance() : body_;
+            } else {
+                return bodyBuilder_.getMessage();
+            }
+        }
+
+        /**
+         * <code>.google.protobuf.Any body = 3;</code>
+         */
+        public Builder setBody(com.google.protobuf.Any value) {
+            if (bodyBuilder_ == null) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                body_ = value;
+                onChanged();
+            } else {
+                bodyBuilder_.setMessage(value);
+            }
+
+            return this;
+        }
+
+        /**
+         * <code>.google.protobuf.Any body = 3;</code>
+         */
+        public Builder setBody(
+            com.google.protobuf.Any.Builder builderForValue) {
+            if (bodyBuilder_ == null) {
+                body_ = builderForValue.build();
+                onChanged();
+            } else {
+                bodyBuilder_.setMessage(builderForValue.build());
+            }
+
+            return this;
+        }
+
+        /**
+         * <code>.google.protobuf.Any body = 3;</code>
+         */
+        public Builder mergeBody(com.google.protobuf.Any value) {
+            if (bodyBuilder_ == null) {
+                if (body_ != null) {
+                    body_ =
+                        com.google.protobuf.Any.newBuilder(body_).mergeFrom(value).buildPartial();
+                } else {
+                    body_ = value;
+                }
+                onChanged();
+            } else {
+                bodyBuilder_.mergeFrom(value);
+            }
+
+            return this;
+        }
+
+        /**
+         * <code>.google.protobuf.Any body = 3;</code>
+         */
+        public Builder clearBody() {
+            if (bodyBuilder_ == null) {
+                body_ = null;
+                onChanged();
+            } else {
+                body_ = null;
+                bodyBuilder_ = null;
+            }
+
+            return this;
+        }
+
+        /**
+         * <code>.google.protobuf.Any body = 3;</code>
+         */
+        public com.google.protobuf.Any.Builder getBodyBuilder() {
+
+            onChanged();
+            return getBodyFieldBuilder().getBuilder();
+        }
+
+        /**
+         * <code>.google.protobuf.Any body = 3;</code>
+         */
+        public com.google.protobuf.AnyOrBuilder getBodyOrBuilder() {
+            if (bodyBuilder_ != null) {
+                return bodyBuilder_.getMessageOrBuilder();
+            } else {
+                return body_ == null ?
+                    com.google.protobuf.Any.getDefaultInstance() : body_;
+            }
+        }
+
+        /**
+         * <code>.google.protobuf.Any body = 3;</code>
+         */
+        private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.protobuf.Any, com.google.protobuf.Any.Builder, com.google.protobuf.AnyOrBuilder>
+        getBodyFieldBuilder() {
+            if (bodyBuilder_ == null) {
+                bodyBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+                    com.google.protobuf.Any, com.google.protobuf.Any.Builder, com.google.protobuf.AnyOrBuilder>(
+                    getBody(),
+                    getParentForChildren(),
+                    isClean());
+                body_ = null;
+            }
+            return bodyBuilder_;
+        }
+
+        @Override
+        public final Builder setUnknownFields(
+            final com.google.protobuf.UnknownFieldSet unknownFields) {
+            return super.setUnknownFields(unknownFields);
+        }
+
+        @Override
+        public final Builder mergeUnknownFields(
+            final com.google.protobuf.UnknownFieldSet unknownFields) {
+            return super.mergeUnknownFields(unknownFields);
+        }
+
+        // @@protoc_insertion_point(builder_scope:Payload)
+    }
+
+    // @@protoc_insertion_point(class_scope:Payload)
+    private static final Payload DEFAULT_INSTANCE;
+
+    static {
+        DEFAULT_INSTANCE = new Payload();
+    }
+
+    public static Payload getDefaultInstance() {
+        return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<Payload>
+        PARSER = new com.google.protobuf.AbstractParser<Payload>() {
+        @Override
+        public Payload parsePartialFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+            return new Payload(input, extensionRegistry);
+        }
+    };
+
+    public static com.google.protobuf.Parser<Payload> parser() {
+        return PARSER;
+    }
+
+    @Override
+    public com.google.protobuf.Parser<Payload> getParserForType() {
+        return PARSER;
+    }
+
+    @Override
+    public Payload getDefaultInstanceForType() {
+        return DEFAULT_INSTANCE;
+    }
+
+}
+
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/grpc/adminserver/PayloadOrBuilder.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/grpc/adminserver/PayloadOrBuilder.java
new file mode 100644
index 000000000..a50a340e1
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/grpc/adminserver/PayloadOrBuilder.java
@@ -0,0 +1,62 @@
+/*
+ * 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.eventmesh.common.protocol.grpc.adminserver;// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: event_mesh_admin_service.proto
+
+public interface PayloadOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:Payload)
+    com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>.Metadata metadata = 2;</code>
+     *
+     * @return Whether the metadata field is set.
+     */
+    boolean hasMetadata();
+
+    /**
+     * <code>.Metadata metadata = 2;</code>
+     *
+     * @return The metadata.
+     */
+    Metadata getMetadata();
+
+    /**
+     * <code>.Metadata metadata = 2;</code>
+     */
+    MetadataOrBuilder getMetadataOrBuilder();
+
+    /**
+     * <code>.google.protobuf.Any body = 3;</code>
+     *
+     * @return Whether the body field is set.
+     */
+    boolean hasBody();
+
+    /**
+     * <code>.google.protobuf.Any body = 3;</code>
+     *
+     * @return The body.
+     */
+    com.google.protobuf.Any getBody();
+
+    /**
+     * <code>.google.protobuf.Any body = 3;</code>
+     */
+    com.google.protobuf.AnyOrBuilder getBodyOrBuilder();
+}
diff --git a/eventmesh-connectors/eventmesh-connector-dingtalk/src/main/java/org/apache/eventmesh/connector/dingtalk/sink/config/SinkConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/grpc/proto/event_mesh_admin_service.proto
similarity index 69%
copy from eventmesh-connectors/eventmesh-connector-dingtalk/src/main/java/org/apache/eventmesh/connector/dingtalk/sink/config/SinkConnectorConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/grpc/proto/event_mesh_admin_service.proto
index 2211fd1ad..fa7095840 100644
--- a/eventmesh-connectors/eventmesh-connector-dingtalk/src/main/java/org/apache/eventmesh/connector/dingtalk/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/grpc/proto/event_mesh_admin_service.proto
@@ -15,22 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.dingtalk.sink.config;
+syntax="proto3";
 
-import lombok.Data;
+import "google/protobuf/any.proto";
 
-@Data
-public class SinkConnectorConfig {
+option java_multiple_files=true;
 
-    private String connectorName;
-
-    private String appKey;
-
-    private String appSecret;
+message Metadata {
+    string type = 3;
+    map<string, string> headers = 7;
+}
 
-    private String openConversationId;
 
-    private String robotCode;
+message Payload {
+    Metadata metadata = 2;
+    bytes body = 3;
+}
 
-    private String coolAppCode;
+service AdminService {
+  rpc invokeBiStream(stream Payload) returns (stream Payload){}
+  rpc invoke(Payload) returns (Payload){}
 }
+
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/Config.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/Job.java
similarity index 83%
copy from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/Config.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/Job.java
index 330aa9393..b65517bec 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/Config.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/Job.java
@@ -15,7 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.config;
+package org.apache.eventmesh.common.remote;
 
-public abstract class Config {
+public class Job {
+    private long id;
+    private long taskID;
+    private JobType type;
+    private JobState state;
 }
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnector.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/JobState.java
similarity index 68%
copy from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnector.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/JobState.java
index 70b62c120..7b0ae5074 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/connector/SinkConnector.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/JobState.java
@@ -15,16 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.connector;
+package org.apache.eventmesh.common.remote;
 
-import org.apache.eventmesh.openconnect.api.config.SinkConfig;
-import org.apache.eventmesh.openconnect.api.sink.Sink;
+public enum JobState {
+    INIT, STARTED, RUNNING, PAUSE, COMPLETE, DELETE, FAIL;
+    private static final JobState[] STATES = JobState.values();
 
-public abstract class SinkConnector implements Sink {
+    public static JobState fromIndex(Integer index) {
+        if (index == null || index < 0 || index >= STATES.length) {
+            return null;
+        }
 
-    private final SinkConfig sinkConfig;
-
-    protected SinkConnector(SinkConfig sinkConfig) {
-        this.sinkConfig = sinkConfig;
+        return STATES[index];
     }
 }
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/Config.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/JobType.java
similarity index 88%
copy from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/Config.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/JobType.java
index 330aa9393..3c8272af4 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/Config.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/JobType.java
@@ -15,7 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.config;
+package org.apache.eventmesh.common.remote;
 
-public abstract class Config {
+public enum JobType {
+    FULL,
+    INCREASE,
+    STRUCT_SYNC
 }
diff --git a/eventmesh-connectors/eventmesh-connector-dingtalk/src/main/java/org/apache/eventmesh/connector/dingtalk/sink/config/SinkConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/Task.java
similarity index 68%
copy from eventmesh-connectors/eventmesh-connector-dingtalk/src/main/java/org/apache/eventmesh/connector/dingtalk/sink/config/SinkConnectorConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/Task.java
index 2211fd1ad..6f97c4207 100644
--- a/eventmesh-connectors/eventmesh-connector-dingtalk/src/main/java/org/apache/eventmesh/connector/dingtalk/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/Task.java
@@ -15,22 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.dingtalk.sink.config;
+package org.apache.eventmesh.common.remote;
+
+// task : job = 1 : m
+public class Task {
+    private long id;
+    private String name;
+    private String desc;
+    private String uid;
+    private String sourceUser;
+    private String sourcePasswd;
+    private String targetUser;
+    private String targetPasswd;
+    private int sourceType;
+    private int targetType;
 
-import lombok.Data;
 
-@Data
-public class SinkConnectorConfig {
-
-    private String connectorName;
-
-    private String appKey;
-
-    private String appSecret;
-
-    private String openConversationId;
-
-    private String robotCode;
-
-    private String coolAppCode;
 }
diff --git a/eventmesh-connectors/eventmesh-connector-dingtalk/src/main/java/org/apache/eventmesh/connector/dingtalk/sink/config/SinkConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/exception/ErrorCode.java
similarity index 71%
copy from eventmesh-connectors/eventmesh-connector-dingtalk/src/main/java/org/apache/eventmesh/connector/dingtalk/sink/config/SinkConnectorConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/exception/ErrorCode.java
index 2211fd1ad..f24971acc 100644
--- a/eventmesh-connectors/eventmesh-connector-dingtalk/src/main/java/org/apache/eventmesh/connector/dingtalk/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/exception/ErrorCode.java
@@ -15,22 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.dingtalk.sink.config;
+package org.apache.eventmesh.common.remote.exception;
 
-import lombok.Data;
+public class ErrorCode {
 
-@Data
-public class SinkConnectorConfig {
+    public static final int SUCCESS = 0;
+    public static final int BAD_REQUEST = 4001;
+    public static final int BAD_DB_DATA = 4002;
 
-    private String connectorName;
-
-    private String appKey;
-
-    private String appSecret;
-
-    private String openConversationId;
-
-    private String robotCode;
-
-    private String coolAppCode;
+    public static final int INTERNAL_ERR = 5000;
+    public static final int STARTUP_CONFIG_MISS = 5001;
 }
diff --git a/eventmesh-connectors/eventmesh-connector-mongodb/src/main/java/org/apache/eventmesh/connector/mongodb/config/MongodbServerConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/exception/PayloadFormatException.java
similarity index 78%
copy from eventmesh-connectors/eventmesh-connector-mongodb/src/main/java/org/apache/eventmesh/connector/mongodb/config/MongodbServerConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/exception/PayloadFormatException.java
index 95c651b35..affa6b8bb 100644
--- a/eventmesh-connectors/eventmesh-connector-mongodb/src/main/java/org/apache/eventmesh/connector/mongodb/config/MongodbServerConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/exception/PayloadFormatException.java
@@ -15,14 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.mongodb.config;
+package org.apache.eventmesh.common.remote.exception;
 
-import lombok.Data;
+public class PayloadFormatException extends RemoteRuntimeException {
 
-@Data
-public class MongodbServerConfig {
-
-    private boolean sourceEnable;
-
-    private boolean sinkEnable;
+    public PayloadFormatException(int code, String desc) {
+        super(code, desc);
+    }
 }
diff --git a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/SourceConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/exception/RemoteRuntimeException.java
similarity index 72%
copy from eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/SourceConnectorConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/exception/RemoteRuntimeException.java
index 6376a7fb4..708a558d3 100644
--- a/eventmesh-connectors/eventmesh-connector-file/src/main/java/org/apache/eventmesh/connector/file/source/config/SourceConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/exception/RemoteRuntimeException.java
@@ -15,14 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.file.source.config;
+package org.apache.eventmesh.common.remote.exception;
 
-import lombok.Data;
+public class RemoteRuntimeException extends RuntimeException {
 
-@Data
-public class SourceConnectorConfig {
+    protected final int code;
+    protected final String message;
 
-    private String connectorName;
-
-    private String filePath;
+    public RemoteRuntimeException(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
 }
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/Config.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/job/DataSourceClassify.java
similarity index 85%
copy from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/Config.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/job/DataSourceClassify.java
index 330aa9393..36f4064e7 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/Config.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/job/DataSourceClassify.java
@@ -15,7 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.config;
+package org.apache.eventmesh.common.remote.job;
 
-public abstract class Config {
+public enum DataSourceClassify {
+    // relationship db
+    RDB,
+    MQ,
+    CACHE;
 }
diff --git a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/Config.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/job/DataSourceDriverType.java
similarity index 87%
copy from eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/Config.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/job/DataSourceDriverType.java
index 330aa9393..52bc81119 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-java/src/main/java/org/apache/eventmesh/openconnect/api/config/Config.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/job/DataSourceDriverType.java
@@ -15,7 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.api.config;
+package org.apache.eventmesh.common.remote.job;
 
-public abstract class Config {
+public enum DataSourceDriverType {
+    MYSQL,
+    REDIS,
+    ROCKETMQ;
 }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/job/DataSourceType.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/job/DataSourceType.java
new file mode 100644
index 000000000..e41865d24
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/job/DataSourceType.java
@@ -0,0 +1,54 @@
+/*
+ * 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.eventmesh.common.remote.job;
+
+public enum DataSourceType {
+    MYSQL("MySQL", DataSourceDriverType.MYSQL, DataSourceClassify.RDB),
+    REDIS("Redis", DataSourceDriverType.REDIS, DataSourceClassify.CACHE),
+    ROCKETMQ("RocketMQ", DataSourceDriverType.ROCKETMQ, DataSourceClassify.MQ);
+    private final String name;
+    private final DataSourceDriverType driverType;
+    private final DataSourceClassify classify;
+
+    DataSourceType(String name, DataSourceDriverType driverType, DataSourceClassify classify) {
+        this.name = name;
+        this.driverType = driverType;
+        this.classify = classify;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public DataSourceDriverType getDriverType() {
+        return driverType;
+    }
+
+    public DataSourceClassify getClassify() {
+        return classify;
+    }
+
+    private static final DataSourceType[] TYPES = DataSourceType.values();
+
+    public static DataSourceType getDataSourceType(Integer index) {
+        if (index == null || index < 0 || index >= TYPES.length) {
+            return null;
+        }
+        return TYPES[index];
+    }
+}
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/job/JobTransportType.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/job/JobTransportType.java
new file mode 100644
index 000000000..5f06cf1f2
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/job/JobTransportType.java
@@ -0,0 +1,68 @@
+/*
+ * 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.eventmesh.common.remote.job;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public enum JobTransportType {
+    MYSQL_MYSQL(DataSourceType.MYSQL, DataSourceType.MYSQL),
+    REDIS_REDIS(DataSourceType.REDIS, DataSourceType.REDIS),
+    ROCKETMQ_ROCKETMQ(DataSourceType.ROCKETMQ, DataSourceType.ROCKETMQ);
+    private static final Map<String, JobTransportType> INDEX_TYPES = new HashMap<>();
+    private static final JobTransportType[] TYPES = JobTransportType.values();
+    private static final String SEPARATOR = "@";
+
+    static {
+        for (JobTransportType type : TYPES) {
+            INDEX_TYPES.put(generateKey(type.src, type.dst), type);
+        }
+    }
+
+    DataSourceType src;
+
+    DataSourceType dst;
+
+    JobTransportType(DataSourceType src, DataSourceType dst) {
+        this.src = src;
+        this.dst = dst;
+    }
+
+    private static String generateKey(DataSourceType src, DataSourceType dst) {
+        return src.ordinal() + SEPARATOR + dst.ordinal();
+    }
+
+    public DataSourceType getSrc() {
+        return src;
+    }
+
+    public DataSourceType getDst() {
+        return dst;
+    }
+
+    public static JobTransportType getJobTransportType(DataSourceType src, DataSourceType dst) {
+        return INDEX_TYPES.get(generateKey(src, dst));
+    }
+
+    public static JobTransportType getJobTransportType(Integer index) {
+        if (index == null || index < 0 || index >= TYPES.length) {
+            return null;
+        }
+        return TYPES[index];
+    }
+}
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/job/SyncConsistency.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/job/SyncConsistency.java
new file mode 100644
index 000000000..a5aec2aa3
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/job/SyncConsistency.java
@@ -0,0 +1,69 @@
+/*
+ * 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.eventmesh.common.remote.job;
+
+public enum SyncConsistency {
+    /**
+     * based with media
+     */
+    MEDIA("M"),
+    /**
+     * based with store
+     */
+    STORE("S"),
+    /**
+     * Based on the current change value, eventual consistency
+     */
+    BASE("B");
+
+    private String value;
+
+    SyncConsistency(String value) {
+        this.value = value;
+    }
+
+    public static SyncConsistency valuesOf(String value) {
+        SyncConsistency[] modes = values();
+        for (SyncConsistency mode : modes) {
+            if (mode.value.equalsIgnoreCase(value)) {
+                return mode;
+            }
+        }
+        return null;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public boolean isMedia() {
+        return this.equals(SyncConsistency.MEDIA);
+    }
+
+    public boolean isStore() {
+        return this.equals(SyncConsistency.STORE);
+    }
+
+    public boolean isBase() {
+        return this.equals(SyncConsistency.BASE);
+    }
+}
diff --git a/eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/sink/config/SinkConnectorConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/job/SyncMode.java
similarity index 52%
copy from eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/sink/config/SinkConnectorConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/job/SyncMode.java
index e971b7b00..0f2f9bdfc 100644
--- a/eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/sink/config/SinkConnectorConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/job/SyncMode.java
@@ -15,29 +15,47 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.jdbc.sink.config;
-
-import org.apache.eventmesh.connector.jdbc.config.JdbcConfig;
-
-import lombok.Data;
-
-/**
- * Configuration parameters for a sink connector.
- */
-@Data
-public class SinkConnectorConfig {
+package org.apache.eventmesh.common.remote.job;
 
+public enum SyncMode {
     /**
-     * The name of the sink connector.
+     * row
      */
-    private String connectorName;
-
+    ROW("R"),
     /**
-     * JDBC configuration for connecting to a database.
+     * field
      */
-    private JdbcConfig jdbcConfig;
+    FIELD("F");
+
+    private String value;
+
+    SyncMode(String value) {
+        this.value = value;
+    }
+
+    public static SyncMode valuesOf(String value) {
+        SyncMode[] modes = values();
+        for (SyncMode mode : modes) {
+            if (mode.value.equalsIgnoreCase(value)) {
+                return mode;
+            }
+        }
+        return null;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public boolean isRow() {
+        return this.equals(SyncMode.ROW);
+    }
 
-    public String getDatabaseType() {
-        return "mysql";
+    public boolean isField() {
+        return this.equals(SyncMode.FIELD);
     }
 }
diff --git a/eventmesh-connectors/eventmesh-connector-mongodb/src/main/java/org/apache/eventmesh/connector/mongodb/config/MongodbServerConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/RecordOffset.java
similarity index 80%
copy from eventmesh-connectors/eventmesh-connector-mongodb/src/main/java/org/apache/eventmesh/connector/mongodb/config/MongodbServerConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/RecordOffset.java
index 95c651b35..f78585ca1 100644
--- a/eventmesh-connectors/eventmesh-connector-mongodb/src/main/java/org/apache/eventmesh/connector/mongodb/config/MongodbServerConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/RecordOffset.java
@@ -15,14 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.mongodb.config;
+package org.apache.eventmesh.common.remote.offset;
 
-import lombok.Data;
+public abstract class RecordOffset {
 
-@Data
-public class MongodbServerConfig {
+    public abstract Class<? extends RecordOffset> getRecordOffsetClass();
 
-    private boolean sourceEnable;
+    public RecordOffset() {
 
-    private boolean sinkEnable;
+    }
 }
diff --git a/eventmesh-connectors/eventmesh-connector-mongodb/src/main/java/org/apache/eventmesh/connector/mongodb/config/MongodbServerConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/RecordPartition.java
similarity index 79%
copy from eventmesh-connectors/eventmesh-connector-mongodb/src/main/java/org/apache/eventmesh/connector/mongodb/config/MongodbServerConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/RecordPartition.java
index 95c651b35..00e4c30e4 100644
--- a/eventmesh-connectors/eventmesh-connector-mongodb/src/main/java/org/apache/eventmesh/connector/mongodb/config/MongodbServerConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/RecordPartition.java
@@ -15,14 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.mongodb.config;
+package org.apache.eventmesh.common.remote.offset;
 
-import lombok.Data;
+public abstract class RecordPartition {
 
-@Data
-public class MongodbServerConfig {
+    public abstract Class<? extends RecordPartition> getRecordPartitionClass();
 
-    private boolean sourceEnable;
+    public RecordPartition() {
 
-    private boolean sinkEnable;
+    }
 }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/RecordPosition.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/RecordPosition.java
new file mode 100644
index 000000000..c3c2d5dd7
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/RecordPosition.java
@@ -0,0 +1,128 @@
+/*
+ * 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.eventmesh.common.remote.offset;
+
+import org.apache.eventmesh.common.remote.offset.S3.S3RecordOffset;
+import org.apache.eventmesh.common.remote.offset.S3.S3RecordPartition;
+import org.apache.eventmesh.common.remote.offset.canal.CanalRecordOffset;
+import org.apache.eventmesh.common.remote.offset.canal.CanalRecordPartition;
+import org.apache.eventmesh.common.remote.offset.file.FileRecordOffset;
+import org.apache.eventmesh.common.remote.offset.file.FileRecordPartition;
+import org.apache.eventmesh.common.remote.offset.kafka.KafkaRecordOffset;
+import org.apache.eventmesh.common.remote.offset.kafka.KafkaRecordPartition;
+import org.apache.eventmesh.common.remote.offset.pulsar.PulsarRecordOffset;
+import org.apache.eventmesh.common.remote.offset.pulsar.PulsarRecordPartition;
+import org.apache.eventmesh.common.remote.offset.rocketmq.RocketMQRecordOffset;
+import org.apache.eventmesh.common.remote.offset.rocketmq.RocketMQRecordPartition;
+
+import java.util.Objects;
+
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+
+public class RecordPosition {
+
+    @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
+    @JsonSubTypes({
+        @JsonSubTypes.Type(value = CanalRecordPartition.class, name = "CanalRecordPartition"),
+        @JsonSubTypes.Type(value = FileRecordPartition.class, name = "FileRecordPartition"),
+        @JsonSubTypes.Type(value = S3RecordPartition.class, name = "S3RecordPartition"),
+        @JsonSubTypes.Type(value = KafkaRecordPartition.class, name = "KafkaRecordPartition"),
+        @JsonSubTypes.Type(value = PulsarRecordPartition.class, name = "PulsarRecordPartition"),
+        @JsonSubTypes.Type(value = RocketMQRecordPartition.class, name = "RocketMQRecordPartition"),
+    })
+    private RecordPartition recordPartition;
+
+    private Class<? extends RecordPartition> recordPartitionClazz;
+
+    @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
+    @JsonSubTypes({
+        @JsonSubTypes.Type(value = CanalRecordOffset.class, name = "CanalRecordOffset"),
+        @JsonSubTypes.Type(value = FileRecordOffset.class, name = "FileRecordOffset"),
+        @JsonSubTypes.Type(value = S3RecordOffset.class, name = "S3RecordOffset"),
+        @JsonSubTypes.Type(value = KafkaRecordOffset.class, name = "KafkaRecordOffset"),
+        @JsonSubTypes.Type(value = PulsarRecordOffset.class, name = "PulsarRecordOffset"),
+        @JsonSubTypes.Type(value = RocketMQRecordOffset.class, name = "RocketMQRecordOffset"),
+    })
+    private RecordOffset recordOffset;
+
+    private Class<? extends RecordOffset> recordOffsetClazz;
+
+    public RecordPosition() {
+
+    }
+
+    public RecordPosition(
+        RecordPartition recordPartition, RecordOffset recordOffset) {
+        this.recordPartition = recordPartition;
+        this.recordOffset = recordOffset;
+        this.recordPartitionClazz = recordPartition.getRecordPartitionClass();
+        this.recordOffsetClazz = recordOffset.getRecordOffsetClass();
+    }
+
+    public RecordPartition getRecordPartition() {
+        return recordPartition;
+    }
+
+    public void setRecordPartition(RecordPartition recordPartition) {
+        this.recordPartition = recordPartition;
+        if (recordPartition == null) {
+            this.recordPartitionClazz = null;
+            return;
+        }
+        this.recordPartitionClazz = recordPartition.getRecordPartitionClass();
+    }
+
+    public RecordOffset getRecordOffset() {
+        return recordOffset;
+    }
+
+    public void setRecordOffset(RecordOffset recordOffset) {
+        this.recordOffset = recordOffset;
+        if (recordOffset == null) {
+            this.recordOffsetClazz = null;
+            return;
+        }
+        this.recordOffsetClazz = recordOffset.getRecordOffsetClass();
+    }
+
+    public Class<? extends RecordPartition> getRecordPartitionClazz() {
+        return recordPartitionClazz;
+    }
+
+    public Class<? extends RecordOffset> getRecordOffsetClazz() {
+        return recordOffsetClazz;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (!(o instanceof RecordPosition)) {
+            return false;
+        }
+        RecordPosition position = (RecordPosition) o;
+        return recordPartition.equals(position.recordPartition) && recordOffset.equals(position.recordOffset);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(recordPartition, recordOffset);
+    }
+}
diff --git a/eventmesh-connectors/eventmesh-connector-chatgpt/src/main/java/org/apache/eventmesh/connector/chatgpt/source/config/ChatGPTSourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/S3/S3RecordOffset.java
similarity index 70%
copy from eventmesh-connectors/eventmesh-connector-chatgpt/src/main/java/org/apache/eventmesh/connector/chatgpt/source/config/ChatGPTSourceConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/S3/S3RecordOffset.java
index 959686691..9f38e4b2c 100644
--- a/eventmesh-connectors/eventmesh-connector-chatgpt/src/main/java/org/apache/eventmesh/connector/chatgpt/source/config/ChatGPTSourceConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/S3/S3RecordOffset.java
@@ -15,21 +15,27 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.chatgpt.source.config;
+package org.apache.eventmesh.common.remote.offset.S3;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
+import org.apache.eventmesh.common.remote.offset.RecordOffset;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.ToString;
 
-@Data
 @EqualsAndHashCode(callSuper = true)
-public class ChatGPTSourceConfig extends SourceConfig {
+@Data
+@ToString
+public class S3RecordOffset extends RecordOffset {
 
-    public ChatGPTSourceConnectorConfig connectorConfig;
+    private Long offset;
 
-    public OpenaiProxyConfig openaiProxyConfig;
+    @Override
+    public Class<? extends RecordOffset> getRecordOffsetClass() {
+        return S3RecordOffset.class;
+    }
 
-    public OpenaiConfig openaiConfig;
+    public S3RecordOffset() {
 
+    }
 }
diff --git a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/data/RecordPartition.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/S3/S3RecordPartition.java
similarity index 58%
rename from eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/data/RecordPartition.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/S3/S3RecordPartition.java
index 959a6b9b3..3e42a4d09 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/data/RecordPartition.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/S3/S3RecordPartition.java
@@ -15,32 +15,33 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.offsetmgmt.api.data;
+package org.apache.eventmesh.common.remote.offset.S3;
+
+import org.apache.eventmesh.common.remote.offset.RecordPartition;
 
-import java.util.HashMap;
-import java.util.Map;
 import java.util.Objects;
 
-public class RecordPartition {
+import lombok.Data;
+import lombok.ToString;
 
-    /**
-     * if pull message from mq key=topic,
-     * value=topicName key=brokerName,
-     * value=brokerName key=queueId,
-     * value=queueId
-     */
-    private Map<String, ?> partition = new HashMap<>();
 
-    public RecordPartition() {
+@Data
+@ToString
+public class S3RecordPartition extends RecordPartition {
 
-    }
+    private String region;
+
+    private String bucket;
 
-    public RecordPartition(Map<String, ?> partition) {
-        this.partition = partition;
+    private String fileName;
+
+    @Override
+    public Class<? extends RecordPartition> getRecordPartitionClass() {
+        return S3RecordPartition.class;
     }
 
-    public Map<String, ?> getPartition() {
-        return partition;
+    public S3RecordPartition() {
+        super();
     }
 
     @Override
@@ -48,15 +49,15 @@ public class RecordPartition {
         if (this == o) {
             return true;
         }
-        if (!(o instanceof RecordPartition)) {
+        if (o == null || getClass() != o.getClass()) {
             return false;
         }
-        RecordPartition partition1 = (RecordPartition) o;
-        return Objects.equals(partition, partition1.partition);
+        S3RecordPartition that = (S3RecordPartition) o;
+        return Objects.equals(fileName, that.fileName);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(partition);
+        return Objects.hash(fileName);
     }
 }
diff --git a/eventmesh-connectors/eventmesh-connector-chatgpt/src/main/java/org/apache/eventmesh/connector/chatgpt/source/config/ChatGPTSourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/canal/CanalRecordOffset.java
similarity index 69%
copy from eventmesh-connectors/eventmesh-connector-chatgpt/src/main/java/org/apache/eventmesh/connector/chatgpt/source/config/ChatGPTSourceConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/canal/CanalRecordOffset.java
index 959686691..90c94c99b 100644
--- a/eventmesh-connectors/eventmesh-connector-chatgpt/src/main/java/org/apache/eventmesh/connector/chatgpt/source/config/ChatGPTSourceConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/canal/CanalRecordOffset.java
@@ -15,21 +15,27 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.chatgpt.source.config;
+package org.apache.eventmesh.common.remote.offset.canal;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
+import org.apache.eventmesh.common.remote.offset.RecordOffset;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.ToString;
 
-@Data
 @EqualsAndHashCode(callSuper = true)
-public class ChatGPTSourceConfig extends SourceConfig {
+@Data
+@ToString
+public class CanalRecordOffset extends RecordOffset {
 
-    public ChatGPTSourceConnectorConfig connectorConfig;
+    private Long offset;
 
-    public OpenaiProxyConfig openaiProxyConfig;
+    @Override
+    public Class<? extends RecordOffset> getRecordOffsetClass() {
+        return CanalRecordOffset.class;
+    }
 
-    public OpenaiConfig openaiConfig;
+    public CanalRecordOffset() {
 
+    }
 }
diff --git a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/data/RecordPosition.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/canal/CanalRecordPartition.java
similarity index 57%
rename from eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/data/RecordPosition.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/canal/CanalRecordPartition.java
index 0b836ab60..72d404bab 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/data/RecordPosition.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/canal/CanalRecordPartition.java
@@ -15,28 +15,31 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.offsetmgmt.api.data;
+package org.apache.eventmesh.common.remote.offset.canal;
+
+import org.apache.eventmesh.common.remote.offset.RecordPartition;
 
 import java.util.Objects;
 
-public class RecordPosition {
+import lombok.Data;
+import lombok.ToString;
 
-    private final RecordPartition recordPartition;
 
-    private final RecordOffset recordOffset;
+@Data
+@ToString
+public class CanalRecordPartition extends RecordPartition {
 
-    public RecordPosition(
-        RecordPartition recordPartition, RecordOffset recordOffset) {
-        this.recordPartition = recordPartition;
-        this.recordOffset = recordOffset;
-    }
+    private String journalName;
 
-    public RecordPartition getPartition() {
-        return recordPartition;
+    private Long timeStamp;
+
+    @Override
+    public Class<? extends RecordPartition> getRecordPartitionClass() {
+        return CanalRecordPartition.class;
     }
 
-    public RecordOffset getOffset() {
-        return recordOffset;
+    public CanalRecordPartition() {
+        super();
     }
 
     @Override
@@ -44,15 +47,15 @@ public class RecordPosition {
         if (this == o) {
             return true;
         }
-        if (!(o instanceof RecordPosition)) {
+        if (o == null || getClass() != o.getClass()) {
             return false;
         }
-        RecordPosition position = (RecordPosition) o;
-        return recordPartition.equals(position.recordPartition) && recordOffset.equals(position.recordOffset);
+        CanalRecordPartition that = (CanalRecordPartition) o;
+        return Objects.equals(journalName, that.journalName) && Objects.equals(timeStamp, that.timeStamp);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(recordPartition, recordOffset);
+        return Objects.hash(journalName, timeStamp);
     }
 }
diff --git a/eventmesh-connectors/eventmesh-connector-chatgpt/src/main/java/org/apache/eventmesh/connector/chatgpt/source/config/ChatGPTSourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/file/FileRecordOffset.java
similarity index 69%
copy from eventmesh-connectors/eventmesh-connector-chatgpt/src/main/java/org/apache/eventmesh/connector/chatgpt/source/config/ChatGPTSourceConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/file/FileRecordOffset.java
index 959686691..cda293cb8 100644
--- a/eventmesh-connectors/eventmesh-connector-chatgpt/src/main/java/org/apache/eventmesh/connector/chatgpt/source/config/ChatGPTSourceConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/file/FileRecordOffset.java
@@ -15,21 +15,27 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.chatgpt.source.config;
+package org.apache.eventmesh.common.remote.offset.file;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
+import org.apache.eventmesh.common.remote.offset.RecordOffset;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.ToString;
 
-@Data
 @EqualsAndHashCode(callSuper = true)
-public class ChatGPTSourceConfig extends SourceConfig {
+@Data
+@ToString
+public class FileRecordOffset extends RecordOffset {
 
-    public ChatGPTSourceConnectorConfig connectorConfig;
+    private Long offset;
 
-    public OpenaiProxyConfig openaiProxyConfig;
+    @Override
+    public Class<? extends RecordOffset> getRecordOffsetClass() {
+        return FileRecordOffset.class;
+    }
 
-    public OpenaiConfig openaiConfig;
+    public FileRecordOffset() {
 
+    }
 }
diff --git a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/data/RecordOffset.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/file/FileRecordPartition.java
similarity index 61%
copy from eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/data/RecordOffset.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/file/FileRecordPartition.java
index fee70de27..1a6dddad4 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/data/RecordOffset.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/file/FileRecordPartition.java
@@ -15,30 +15,29 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.offsetmgmt.api.data;
+package org.apache.eventmesh.common.remote.offset.file;
+
+import org.apache.eventmesh.common.remote.offset.RecordPartition;
 
-import java.util.HashMap;
-import java.util.Map;
 import java.util.Objects;
 
-public class RecordOffset {
+import lombok.Data;
+import lombok.ToString;
 
-    /**
-     * if pull message from mq key=queueOffset,
-     * value=queueOffset value
-     */
-    private Map<String, ?> offset = new HashMap<>();
 
-    public RecordOffset() {
+@Data
+@ToString
+public class FileRecordPartition extends RecordPartition {
 
-    }
+    private String fileName;
 
-    public RecordOffset(Map<String, ?> offset) {
-        this.offset = offset;
+    @Override
+    public Class<? extends RecordPartition> getRecordPartitionClass() {
+        return FileRecordPartition.class;
     }
 
-    public Map<String, ?> getOffset() {
-        return offset;
+    public FileRecordPartition() {
+        super();
     }
 
     @Override
@@ -46,16 +45,15 @@ public class RecordOffset {
         if (this == o) {
             return true;
         }
-        if (!(o instanceof RecordOffset)) {
+        if (o == null || getClass() != o.getClass()) {
             return false;
         }
-        RecordOffset offset1 = (RecordOffset) o;
-        return Objects.equals(offset, offset1.offset);
+        FileRecordPartition that = (FileRecordPartition) o;
+        return Objects.equals(fileName, that.fileName);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(offset);
+        return Objects.hash(fileName);
     }
-
 }
diff --git a/eventmesh-connectors/eventmesh-connector-chatgpt/src/main/java/org/apache/eventmesh/connector/chatgpt/source/config/ChatGPTSourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/http/HttpRecordOffset.java
similarity index 67%
copy from eventmesh-connectors/eventmesh-connector-chatgpt/src/main/java/org/apache/eventmesh/connector/chatgpt/source/config/ChatGPTSourceConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/http/HttpRecordOffset.java
index 959686691..f5084c755 100644
--- a/eventmesh-connectors/eventmesh-connector-chatgpt/src/main/java/org/apache/eventmesh/connector/chatgpt/source/config/ChatGPTSourceConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/http/HttpRecordOffset.java
@@ -15,21 +15,29 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.chatgpt.source.config;
+package org.apache.eventmesh.common.remote.offset.http;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
+import org.apache.eventmesh.common.remote.offset.RecordOffset;
+
+import java.util.Map;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.ToString;
 
-@Data
 @EqualsAndHashCode(callSuper = true)
-public class ChatGPTSourceConfig extends SourceConfig {
+@Data
+@ToString
+public class HttpRecordOffset extends RecordOffset {
 
-    public ChatGPTSourceConnectorConfig connectorConfig;
+    private Map<String, ?> offsetMap;
 
-    public OpenaiProxyConfig openaiProxyConfig;
+    @Override
+    public Class<? extends RecordOffset> getRecordOffsetClass() {
+        return HttpRecordOffset.class;
+    }
 
-    public OpenaiConfig openaiConfig;
+    public HttpRecordOffset() {
 
+    }
 }
diff --git a/eventmesh-connectors/eventmesh-connector-chatgpt/src/main/java/org/apache/eventmesh/connector/chatgpt/source/config/ChatGPTSourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/http/HttpRecordPartition.java
similarity index 69%
copy from eventmesh-connectors/eventmesh-connector-chatgpt/src/main/java/org/apache/eventmesh/connector/chatgpt/source/config/ChatGPTSourceConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/http/HttpRecordPartition.java
index 959686691..453b3b501 100644
--- a/eventmesh-connectors/eventmesh-connector-chatgpt/src/main/java/org/apache/eventmesh/connector/chatgpt/source/config/ChatGPTSourceConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/http/HttpRecordPartition.java
@@ -15,21 +15,26 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.chatgpt.source.config;
+package org.apache.eventmesh.common.remote.offset.http;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
+import org.apache.eventmesh.common.remote.offset.RecordPartition;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.ToString;
 
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class ChatGPTSourceConfig extends SourceConfig {
-
-    public ChatGPTSourceConnectorConfig connectorConfig;
 
-    public OpenaiProxyConfig openaiProxyConfig;
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ToString
+public class HttpRecordPartition extends RecordPartition {
 
-    public OpenaiConfig openaiConfig;
+    @Override
+    public Class<? extends RecordPartition> getRecordPartitionClass() {
+        return HttpRecordPartition.class;
+    }
 
+    public HttpRecordPartition() {
+        super();
+    }
 }
diff --git a/eventmesh-connectors/eventmesh-connector-chatgpt/src/main/java/org/apache/eventmesh/connector/chatgpt/source/config/ChatGPTSourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/jdbc/JdbcRecordOffset.java
similarity index 69%
copy from eventmesh-connectors/eventmesh-connector-chatgpt/src/main/java/org/apache/eventmesh/connector/chatgpt/source/config/ChatGPTSourceConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/jdbc/JdbcRecordOffset.java
index 959686691..a97a90e65 100644
--- a/eventmesh-connectors/eventmesh-connector-chatgpt/src/main/java/org/apache/eventmesh/connector/chatgpt/source/config/ChatGPTSourceConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/jdbc/JdbcRecordOffset.java
@@ -15,21 +15,27 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.chatgpt.source.config;
+package org.apache.eventmesh.common.remote.offset.jdbc;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
+import org.apache.eventmesh.common.remote.offset.RecordOffset;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.ToString;
 
-@Data
 @EqualsAndHashCode(callSuper = true)
-public class ChatGPTSourceConfig extends SourceConfig {
+@Data
+@ToString
+public class JdbcRecordOffset extends RecordOffset {
 
-    public ChatGPTSourceConnectorConfig connectorConfig;
+    private Long offset;
 
-    public OpenaiProxyConfig openaiProxyConfig;
+    @Override
+    public Class<? extends RecordOffset> getRecordOffsetClass() {
+        return JdbcRecordOffset.class;
+    }
 
-    public OpenaiConfig openaiConfig;
+    public JdbcRecordOffset() {
 
+    }
 }
diff --git a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/data/RecordOffset.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/jdbc/JdbcRecordPartition.java
similarity index 61%
copy from eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/data/RecordOffset.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/jdbc/JdbcRecordPartition.java
index fee70de27..1eb6937a8 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/data/RecordOffset.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/jdbc/JdbcRecordPartition.java
@@ -15,30 +15,29 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.offsetmgmt.api.data;
+package org.apache.eventmesh.common.remote.offset.jdbc;
+
+import org.apache.eventmesh.common.remote.offset.RecordPartition;
 
-import java.util.HashMap;
-import java.util.Map;
 import java.util.Objects;
 
-public class RecordOffset {
+import lombok.Data;
+import lombok.ToString;
 
-    /**
-     * if pull message from mq key=queueOffset,
-     * value=queueOffset value
-     */
-    private Map<String, ?> offset = new HashMap<>();
 
-    public RecordOffset() {
+@Data
+@ToString
+public class JdbcRecordPartition extends RecordPartition {
 
-    }
+    private String fileName;
 
-    public RecordOffset(Map<String, ?> offset) {
-        this.offset = offset;
+    @Override
+    public Class<? extends RecordPartition> getRecordPartitionClass() {
+        return JdbcRecordPartition.class;
     }
 
-    public Map<String, ?> getOffset() {
-        return offset;
+    public JdbcRecordPartition() {
+        super();
     }
 
     @Override
@@ -46,16 +45,15 @@ public class RecordOffset {
         if (this == o) {
             return true;
         }
-        if (!(o instanceof RecordOffset)) {
+        if (o == null || getClass() != o.getClass()) {
             return false;
         }
-        RecordOffset offset1 = (RecordOffset) o;
-        return Objects.equals(offset, offset1.offset);
+        JdbcRecordPartition that = (JdbcRecordPartition) o;
+        return Objects.equals(fileName, that.fileName);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(offset);
+        return Objects.hash(fileName);
     }
-
 }
diff --git a/eventmesh-connectors/eventmesh-connector-chatgpt/src/main/java/org/apache/eventmesh/connector/chatgpt/source/config/ChatGPTSourceConfig.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/kafka/KafkaRecordOffset.java
similarity index 69%
copy from eventmesh-connectors/eventmesh-connector-chatgpt/src/main/java/org/apache/eventmesh/connector/chatgpt/source/config/ChatGPTSourceConfig.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/kafka/KafkaRecordOffset.java
index 959686691..134ef06fe 100644
--- a/eventmesh-connectors/eventmesh-connector-chatgpt/src/main/java/org/apache/eventmesh/connector/chatgpt/source/config/ChatGPTSourceConfig.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/kafka/KafkaRecordOffset.java
@@ -15,21 +15,27 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.chatgpt.source.config;
+package org.apache.eventmesh.common.remote.offset.kafka;
 
-import org.apache.eventmesh.openconnect.api.config.SourceConfig;
+import org.apache.eventmesh.common.remote.offset.RecordOffset;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.ToString;
 
-@Data
 @EqualsAndHashCode(callSuper = true)
-public class ChatGPTSourceConfig extends SourceConfig {
+@Data
+@ToString
+public class KafkaRecordOffset extends RecordOffset {
 
-    public ChatGPTSourceConnectorConfig connectorConfig;
+    private Long offset;
 
-    public OpenaiProxyConfig openaiProxyConfig;
+    @Override
+    public Class<? extends RecordOffset> getRecordOffsetClass() {
+        return KafkaRecordOffset.class;
+    }
 
-    public OpenaiConfig openaiConfig;
+    public KafkaRecordOffset() {
 
+    }
 }
diff --git a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/data/RecordOffset.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/kafka/KafkaRecordPartition.java
similarity index 58%
copy from eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/data/RecordOffset.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/kafka/KafkaRecordPartition.java
index fee70de27..77dec8226 100644
--- a/eventmesh-openconnect/eventmesh-openconnect-offsetmgmt-plugin/eventmesh-openconnect-offsetmgmt-api/src/main/java/org/apache/eventmesh/openconnect/offsetmgmt/api/data/RecordOffset.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/remote/offset/kafka/KafkaRecordPartition.java
@@ -15,30 +15,31 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.openconnect.offsetmgmt.api.data;
+package org.apache.eventmesh.common.remote.offset.kafka;
+
+import org.apache.eventmesh.common.remote.offset.RecordPartition;
 
-import java.util.HashMap;
-import java.util.Map;
 import java.util.Objects;
 
-public class RecordOffset {
+import lombok.Data;
+import lombok.ToString;
 
-    /**
-     * if pull message from mq key=queueOffset,
-     * value=queueOffset value
-     */
... 12559 lines suppressed ...


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@eventmesh.apache.org
For additional commands, e-mail: commits-help@eventmesh.apache.org