You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rocketmq.apache.org by yu...@apache.org on 2022/04/14 10:59:28 UTC

[rocketmq-eventbridge] branch main updated: init rocketmq-eventbridge

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

yukon pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/rocketmq-eventbridge.git


The following commit(s) were added to refs/heads/main by this push:
     new 3667813  init rocketmq-eventbridge
3667813 is described below

commit 366781320fa2bc6f0d0d9c2978dcb1b513e537cb
Author: 2011shenlin <20...@gmail.com>
AuthorDate: Thu Apr 14 17:01:48 2022 +0800

    init rocketmq-eventbridge
---
 .gitignore                                         |  22 +
 README.md                                          | 108 ++++-
 adapter/api/pom.xml                                | 100 +++++
 .../adapter/api/controller/EventBusController.java |  95 +++++
 .../api/controller/EventDataController.java        |  95 +++++
 .../api/controller/EventRuleController.java        | 145 +++++++
 .../api/controller/EventSourceController.java      | 122 ++++++
 .../api/controller/EventTargetController.java      |  94 +++++
 .../api/controller/EventTypeController.java        |  70 ++++
 .../api/converter/CloudEventBatchedConverter.java  |  46 +++
 .../api/converter/CloudEventBinaryConverter.java   |  75 ++++
 .../converter/CloudEventStructuredConverter.java   |  51 +++
 .../adapter/api/converter/EventConverter.java      |  47 +++
 .../api/converter/EventConverterAdapter.java       |  88 ++++
 .../api/converter/EventTargetConverter.java        | 145 +++++++
 .../api/converter/EventTargetDTOConverter.java     | 130 ++++++
 .../format/BatchedCloudEventDeserializer.java      | 214 ++++++++++
 .../format/BatchedCloudEventSerializer.java        | 133 ++++++
 .../api/converter/format/BatchedJsonFormat.java    | 114 ++++++
 .../eventbridge/adapter/api/dto/BaseDTO.java       |  28 ++
 .../eventbridge/adapter/api/dto/BaseRequest.java   |  42 ++
 .../eventbridge/adapter/api/dto/BaseResponse.java  |  34 ++
 .../adapter/api/dto/bus/CreateEventBusRequest.java |  32 ++
 .../api/dto/bus/CreateEventBusResponse.java        |  31 ++
 .../adapter/api/dto/bus/DeleteEventBusRequest.java |  28 ++
 .../api/dto/bus/DeleteEventBusResponse.java        |  26 ++
 .../adapter/api/dto/bus/EventBusDTO.java           |  31 ++
 .../adapter/api/dto/bus/GetEventBusRequest.java    |  29 ++
 .../adapter/api/dto/bus/GetEventBusResponse.java   |  38 ++
 .../adapter/api/dto/bus/ListEventBusesRequest.java |  32 ++
 .../api/dto/bus/ListEventBusesResponse.java        |  42 ++
 .../eventbridge/adapter/api/dto/data/EventDTO.java |  28 ++
 .../adapter/api/dto/data/PutEventsRequest.java     |  39 ++
 .../adapter/api/dto/data/PutEventsResponse.java    |  50 +++
 .../adapter/api/dto/rule/CreateRuleRequest.java    |  39 ++
 .../adapter/api/dto/rule/CreateRuleResponse.java   |  31 ++
 .../adapter/api/dto/rule/DeleteRuleRequest.java    |  31 ++
 .../adapter/api/dto/rule/DeleteRuleResponse.java   |  24 ++
 .../adapter/api/dto/rule/DisableRuleRequest.java   |  31 ++
 .../adapter/api/dto/rule/DisableRuleResponse.java  |  24 ++
 .../adapter/api/dto/rule/EnableRuleRequest.java    |  31 ++
 .../adapter/api/dto/rule/EnableRuleResponse.java   |  24 ++
 .../adapter/api/dto/rule/EventRuleDTO.java         |  50 +++
 .../adapter/api/dto/rule/GetRuleRequest.java       |  32 ++
 .../adapter/api/dto/rule/GetRuleResponse.java      |  55 +++
 .../adapter/api/dto/rule/ListRulesRequest.java     |  36 ++
 .../adapter/api/dto/rule/ListRulesResponse.java    |  42 ++
 .../adapter/api/dto/rule/UpdateRuleRequest.java    |  38 ++
 .../adapter/api/dto/rule/UpdateRuleResponse.java   |  24 ++
 .../api/dto/source/CreateEventSourceRequest.java   |  43 ++
 .../api/dto/source/CreateEventSourceResponse.java  |  30 ++
 .../api/dto/source/DeleteEventSourceRequest.java   |  31 ++
 .../api/dto/source/DeleteEventSourceResponse.java  |  24 ++
 .../adapter/api/dto/source/EventSourceDTO.java     |  51 +++
 .../api/dto/source/GetEventSourceRequest.java      |  31 ++
 .../api/dto/source/GetEventSourceResponse.java     |  44 ++
 .../api/dto/source/ListEventSourcesRequest.java    |  38 ++
 .../api/dto/source/ListEventSourcesResponse.java   |  42 ++
 .../api/dto/source/UpdateEventSourceRequest.java   |  42 ++
 .../api/dto/source/UpdateEventSourceResponse.java  |  22 +
 .../api/dto/target/CreateTargetsRequest.java       |  37 ++
 .../api/dto/target/CreateTargetsResponse.java      |  22 +
 .../adapter/api/dto/target/DeadLetterQueueDTO.java |  34 ++
 .../api/dto/target/DeleteTargetsRequest.java       |  36 ++
 .../api/dto/target/DeleteTargetsResponse.java      |  22 +
 .../adapter/api/dto/target/EventTargetDTO.java     |  38 ++
 .../adapter/api/dto/target/ListTargetsRequest.java |  31 ++
 .../api/dto/target/ListTargetsResponse.java        |  36 ++
 .../adapter/api/dto/target/RetryStrategyDTO.java   |  34 ++
 .../adapter/api/dto/target/RunOptionsDTO.java      |  34 ++
 .../api/dto/target/UpdateTargetsRequest.java       |  37 ++
 .../api/dto/target/UpdateTargetsResponse.java      |  22 +
 .../adapter/api/dto/type/EventTypeDTO.java         |  47 +++
 .../api/dto/type/ListEventTypesRequest.java        |  38 ++
 .../api/dto/type/ListEventTypesResponse.java       |  41 ++
 .../adapter/api/handler/EventDataHandler.java      |  57 +++
 .../api/handler/ReactorPutEventCallback.java       |  36 ++
 .../api/converter/EventConverterAdapterTest.java   | 121 ++++++
 .../api/converter/EventTargetConverterTest.java    | 108 +++++
 .../api/converter/EventTargetDTOConverterTest.java |  98 +++++
 .../adapter/api/handler/EventDataHandlerTest.java  | 115 ++++++
 adapter/persistence/pom.xml                        |  65 +++
 .../adapter/persistence/PersistenceConfig.java     |  52 +++
 .../bus/mybatis/mapper/EventBusMapper.java         |  37 ++
 .../repository/MybatisEventBusRepository.java      |  60 +++
 .../converter/EventSourceClassConverter.java       |  49 +++
 .../converter/EventTargetClassConverter.java       |  49 +++
 .../mybatis/dataobject/EventSourceClassDO.java     |  37 ++
 .../mybatis/dataobject/EventTargetClassDO.java     |  37 ++
 .../mybatis/mapper/EventSourceClassMapper.java     |  25 ++
 .../mybatis/mapper/EventTargetClassMapper.java     |  27 ++
 .../MybatisEventSourceClassRepository.java         |  40 ++
 .../MybatisEventTargetClassRepository.java         |  40 ++
 .../data/mybatis/dataobject/EventTopicDO.java      |  37 ++
 .../data/mybatis/mapper/EventTopicMapper.java      |  31 ++
 .../rocketmq/repository/BatchSendCallback.java     |  48 +++
 .../rocketmq/repository/DefaultSendCallback.java   |  49 +++
 .../repository/RocketMQEventDataRepository.java    | 115 ++++++
 .../rpc/EventDataOnRocketMQConnectAPI.java         |  28 ++
 .../rule/mybatis/mapper/EventRuleMapper.java       |  44 ++
 .../repository/MybatisEventRuleRepository.java     |  77 ++++
 .../mybatis/converter/EventSourceConverter.java    |  49 +++
 .../converter/EventSourceRunnerConverter.java      |  49 +++
 .../source/mybatis/dataobject/EventSourceDO.java   |  39 ++
 .../mybatis/dataobject/EventSourceRunnerDO.java    |  38 ++
 .../source/mybatis/mapper/EventSourceMapper.java   |  46 +++
 .../mybatis/mapper/EventSourceRunnerMapper.java    |  35 ++
 .../repository/MybatisEventSourceRepository.java   |  81 ++++
 .../MybatisEventSourceRunnerRepository.java        |  63 +++
 .../mybatis/converter/EventTargetConverter.java    |  58 +++
 .../converter/EventTargetRunnerConverter.java      |  47 +++
 .../target/mybatis/dataobject/EventTargetDO.java   |  39 ++
 .../mybatis/dataobject/EventTargetRunnerDO.java    |  39 ++
 .../target/mybatis/mapper/EventTargetMapper.java   |  43 ++
 .../mybatis/mapper/EventTargetRunnerMapper.java    |  44 ++
 .../repository/MybatisEventTargetRepository.java   |  80 ++++
 .../MybatisEventTargetRunnerRepository.java        |  71 ++++
 .../type/mybatis/mapper/EventTypeMapper.java       |  43 ++
 .../repository/MybatisEventTypeRepository.java     |  67 +++
 .../main/resources/db/migration/V1__baseline.sql   | 150 +++++++
 .../src/main/resources/mybatis/EventBusMapper.xml  |  74 ++++
 .../src/main/resources/mybatis/EventRuleMapper.xml |  91 +++++
 .../resources/mybatis/EventSourceClassMapper.xml   |  32 ++
 .../main/resources/mybatis/EventSourceMapper.xml   |  95 +++++
 .../resources/mybatis/EventSourceRunnerMapper.xml  |  66 +++
 .../resources/mybatis/EventTargetClassMapper.xml   |  32 ++
 .../main/resources/mybatis/EventTargetMapper.xml   |  84 ++++
 .../resources/mybatis/EventTargetRunnerMapper.xml  |  79 ++++
 .../main/resources/mybatis/EventTopicMapper.xml    |  48 +++
 .../src/main/resources/mybatis/EventTypeMapper.xml |  80 ++++
 adapter/pom.xml                                    |  21 +
 adapter/rpc/README.md                              |   0
 adapter/rpc/pom.xml                                |  51 +++
 .../adapter/rpc/config/RpcConfiguration.java       |  22 +
 .../adapter/rpc/impl/AccountAPIImpl.java           |  48 +++
 .../adapter/rpc/impl/AppConfigAPIImpl.java         |  39 ++
 .../adapter/rpc/impl/RocketMQEventDataAPIImpl.java | 149 +++++++
 .../rpc/impl/connect/RocketMQConnectClient.java    | 116 ++++++
 .../RocketMQConnectSourceRunnerAPIImpl.java        |  92 +++++
 .../RocketMQConnectTargetRunnerAPIImpl.java        | 108 +++++
 .../rpc/impl/connect/RocketMQConverter.java        | 100 +++++
 .../RocketMQConnectSourceRunnerContext.java        |  27 ++
 .../RocketMQConnectTargetRunnerContext.java        |  28 ++
 .../impl/connect/dto/ActionStatusResponseEnum.java |  83 ++++
 .../rpc/impl/connect/dto/BaseConnectorRequest.java |  25 ++
 .../connect/dto/ConnectStatusResponseEnum.java     |  33 ++
 .../connect/dto/CreateSinkConnectorRequest.java    |  73 ++++
 .../connect/dto/CreateSourceConnectorRequest.java  |  74 ++++
 .../impl/connect/dto/DeleteConnectorRequest.java   |  38 ++
 .../connect/dto/GetConnectorStatusRequest.java     |  38 ++
 .../impl/connect/dto/StartConnectorRequest.java    |  38 ++
 .../rpc/impl/connect/dto/StopConnectorRequest.java |  38 ++
 .../rpc/impl/connect/dto/TransformRequest.java     |  31 ++
 application/README-CN.md                           |   4 +
 application/pom.xml                                |  19 +
 common/README.md                                   |   0
 common/pom.xml                                     |  63 +++
 .../rocketmq/eventbridge/config/AppConfig.java     |  31 ++
 .../eventbridge/config/EventBridgeConstants.java   |  23 ++
 .../rocketmq/eventbridge/config/GlobalConfig.java  |  35 ++
 .../rocketmq/eventbridge/config/LocalConfig.java   |  24 ++
 .../eventbridge/event/EventBridgeEvent.java        |  68 +++
 .../exception/EventBridgeException.java            |  62 +++
 .../eventbridge/exception/code/BaseErrorCode.java  |  26 ++
 .../exception/code/DefaultErrorCode.java           |  50 +++
 .../eventbridge/exception/code/EventErrorCode.java |  67 +++
 .../exception/code/FiltterPatternErrorCode.java    |  52 +++
 .../rocketmq/eventbridge/tools/EventTool.java      |  63 +++
 .../rocketmq/eventbridge/tools/JsonUtil.java       |  70 ++++
 .../tools/pattern/ComplexConditionBuilders.java    |  87 ++++
 .../tools/pattern/FilterPatternTool.java           |  33 ++
 .../pattern/InvalidEventPatternException.java      |  55 +++
 .../tools/pattern/NumericOperators.java            | 109 +++++
 .../tools/pattern/PatternCondition.java            | 291 +++++++++++++
 .../tools/pattern/PatternConditionBuilder.java     | 215 ++++++++++
 .../eventbridge/tools/pattern/PatternEntry.java    | 102 +++++
 .../tools/pattern/PatternErrorMessages.java        |  69 ++++
 .../tools/pattern/PatternEvaluator.java            | 216 ++++++++++
 .../tools/pattern/PatternEvaluatorBuilder.java     | 227 +++++++++++
 .../eventbridge/tools/pattern/PatternType.java     |  33 ++
 .../tools/transform/ConstantTransform.java         |  33 ++
 .../rocketmq/eventbridge/tools/transform/Data.java |  29 ++
 .../tools/transform/DeleteFieldTransform.java      |  63 +++
 .../eventbridge/tools/transform/Extract.java       |  37 ++
 .../tools/transform/InsertFieldTransform.java      |  63 +++
 .../tools/transform/JsonPathExtract.java           | 120 ++++++
 .../tools/transform/JsonPathTransform.java         |  55 +++
 .../eventbridge/tools/transform/JsonPathUtil.java  | 174 ++++++++
 .../eventbridge/tools/transform/JsonUtil.java      | 133 ++++++
 .../eventbridge/tools/transform/ObjectData.java    |  50 +++
 .../eventbridge/tools/transform/ObjectUtil.java    |  68 +++
 .../tools/transform/OriginalTransform.java         |  26 ++
 .../tools/transform/RegularExtract.java            |  22 +
 .../eventbridge/tools/transform/StringData.java    |  59 +++
 .../tools/transform/StringSubstitutorTemplate.java | 141 +++++++
 .../eventbridge/tools/transform/StringType.java    |  33 ++
 .../eventbridge/tools/transform/Template.java      |  35 ++
 .../tools/transform/TemplateBuilder.java           |  32 ++
 .../tools/transform/TemplateTransform.java         |  49 +++
 .../eventbridge/tools/transform/Transform.java     |  73 ++++
 .../tools/transform/TransformBuilder.java          | 112 +++++
 .../eventbridge/tools/transform/TransformEnum.java |  50 +++
 .../tools/transform/TransformErrorCode.java        |  54 +++
 .../tools/transform/TransformFieldEnum.java        |  31 ++
 .../tools/transform/TransformParam.java            |  62 +++
 .../tools/transform/TransformValidator.java        |  58 +++
 .../tools/transform/UpdateFieldTransform.java      |  67 +++
 .../eventbridge/tools/transform/Variable.java      |  55 +++
 .../tools/pattern/PatternEvaluatorBuilderTest.java | 338 +++++++++++++++
 .../tools/pattern/PatternEvaluatorTest.java        | 454 +++++++++++++++++++++
 .../tools/transform/BaseTransformTest.java         |  36 ++
 .../tools/transform/ConstantTransformTest.java     |  33 ++
 .../tools/transform/DeleteFieldTransformTest.java  |  71 ++++
 .../tools/transform/InsertFieldTransformTest.java  |  75 ++++
 .../tools/transform/JsonPathExtractTest.java       |  75 ++++
 .../JsonPathTransformFromJsonStringTest.java       |  74 ++++
 .../tools/transform/JsonPathUtilTest.java          |  29 ++
 .../tools/transform/OriginalTransformTest.java     |  33 ++
 .../TemplateTransformFromJsonStringTest.java       |  93 +++++
 .../tools/transform/UpdateFieldTransformTest.java  |  77 ++++
 domain/README-CN.md                                |  24 ++
 domain/pom.xml                                     |  64 +++
 .../domain/common/EventBridgeConstants.java        |  51 +++
 .../domain/common/enums/ErrorToleranceEnum.java    |  49 +++
 .../domain/common/enums/EventRuleStatusEnum.java   |  32 ++
 .../domain/common/enums/EventSourceStatusEnum.java |  34 ++
 .../domain/common/enums/EventSourceTypeEnum.java   |  60 +++
 .../domain/common/enums/EventTargetStatusEnum.java |  26 ++
 .../domain/common/enums/PushRetryStrategyEnum.java |  59 +++
 .../common/exception/EventBridgeErrorCode.java     | 104 +++++
 .../domain/model/AbstractResourceService.java      |  56 +++
 .../domain/model/AbstractRunnerService.java        |  32 ++
 .../eventbridge/domain/model/Component.java        |  29 ++
 .../eventbridge/domain/model/PaginationResult.java |  29 ++
 .../eventbridge/domain/model/bus/EventBus.java     |  36 ++
 .../domain/model/bus/EventBusService.java          | 104 +++++
 .../domain/model/classes/APIAttribute.java         |  30 ++
 .../classes/AbstractEventSourceClassService.java   |  24 ++
 .../domain/model/classes/EventSourceClass.java     |  38 ++
 .../model/classes/EventSourceClassService.java     | 129 ++++++
 .../domain/model/classes/EventTargetClass.java     |  37 ++
 .../model/classes/EventTargetClassService.java     | 116 ++++++
 .../domain/model/data/EventDataService.java        |  42 ++
 .../domain/model/data/PutEventCallback.java        |  23 ++
 .../domain/model/data/PutEventsResponseEntry.java  |  31 ++
 .../eventbridge/domain/model/rule/EventRule.java   |  42 ++
 .../domain/model/rule/EventRuleDetail.java         |  36 ++
 .../domain/model/rule/EventRuleService.java        | 133 ++++++
 .../domain/model/run/DeadLetterQueue.java          |  33 ++
 .../domain/model/run/EventSourceRunner.java        |  41 ++
 .../domain/model/run/EventSourceRunnerService.java |  94 +++++
 .../domain/model/run/EventTargetRunner.java        |  43 ++
 .../domain/model/run/EventTargetRunnerService.java | 146 +++++++
 .../domain/model/run/RetryStrategy.java            |  33 ++
 .../eventbridge/domain/model/run/RunOptions.java   |  32 ++
 .../model/source/ConnectEventSourceService.java    | 101 +++++
 .../domain/model/source/EventSource.java           |  43 ++
 .../domain/model/source/EventSourceService.java    | 125 ++++++
 .../model/source/EventSourceServiceFactory.java    |  66 +++
 .../eventbridge/domain/model/source/EventType.java |  34 ++
 .../domain/model/source/EventTypeService.java      |  72 ++++
 .../model/source/HTTPEventSourceService.java       |  65 +++
 .../model/source/ScheduledEventSourceService.java  |  43 ++
 .../domain/model/target/EventTarget.java           |  43 ++
 .../domain/model/target/EventTargetService.java    | 177 ++++++++
 .../domain/repository/EventBusRepository.java      |  35 ++
 .../domain/repository/EventDataRepository.java     |  59 +++
 .../domain/repository/EventRuleRepository.java     |  44 ++
 .../repository/EventSourceClassRepository.java     |  25 ++
 .../domain/repository/EventSourceRepository.java   |  42 ++
 .../repository/EventSourceRunnerRepository.java    |  32 ++
 .../repository/EventTargetClassRepository.java     |  25 ++
 .../domain/repository/EventTargetRepository.java   |  40 ++
 .../repository/EventTargetRunnerRepository.java    |  39 ++
 .../domain/repository/EventTypeRepository.java     |  38 ++
 .../eventbridge/domain/rpc/AccountAPI.java         |  29 ++
 .../eventbridge/domain/rpc/SourceRunnerAPI.java    |  41 ++
 .../eventbridge/domain/rpc/TargetRunnerAPI.java    |  43 ++
 .../domain/service/EventBusDomainService.java      |  58 +++
 .../domain/service/EventRuleDomainService.java     |  85 ++++
 .../domain/model/EventBusServiceTest.java          | 102 +++++
 .../domain/model/EventRuleServiceTest.java         | 118 ++++++
 .../domain/model/EventSourceClassServiceTest.java  | 148 +++++++
 .../model/EventSourceServiceFactoryTest.java       | 118 ++++++
 .../model/EventTargetRunnerClassServiceTest.java   | 147 +++++++
 .../domain/service/EventBusDomainServiceTest.java  |  66 +++
 .../domain/service/EventRuleDomainServiceTest.java |  55 +++
 pom.xml                                            | 306 ++++++++++++++
 start/README-CN.md                                 |  25 ++
 start/pom.xml                                      |  61 +++
 .../java/org/apache/rocketmq/eventbridge/Main.java |  34 ++
 .../rocketmq/eventbridge/config/SwaggerConfig.java |  54 +++
 .../rocketmq/eventbridge/filter/LoginFilter.java   |  42 ++
 .../eventbridge/handler/ExceptionHandler.java      |  74 ++++
 start/src/main/resources/application.properties    |  17 +
 start/src/main/resources/logback-spring.xml        |  32 ++
 start/src/test/resources/application.properties    |  17 +
 style/copyright/Apache.xml                         |  23 ++
 style/copyright/profiles_settings.xml              |  64 +++
 style/rmq_checkstyle.xml                           | 140 +++++++
 style/rmq_codeStyle.xml                            | 143 +++++++
 supports/connect-cloudevent-transform/README.md    |   0
 supports/connect-cloudevent-transform/pom.xml      | 177 ++++++++
 .../transform/eventbridge/CloudEventTransform.java | 204 +++++++++
 .../rocketmq/connect/CloudEventTransformTest.java  |  56 +++
 supports/connect-eventbridge-transform/README.md   |   0
 supports/connect-eventbridge-transform/pom.xml     | 175 ++++++++
 .../eventbridge/ConnectRecordJsonPathExtract.java  |  84 ++++
 .../eventbridge/EventBridgeTransform.java          |  80 ++++
 .../eventbridge/EventBridgeTransformBuilder.java   |  88 ++++
 .../rocketmq/connect/EventBridgeTransformTest.java |  53 +++
 supports/connect-filter-transform/README.md        |   0
 supports/connect-filter-transform/pom.xml          | 191 +++++++++
 .../eventbridge/EventBridgeFilterTransform.java    |  88 ++++
 .../EventBridgeFilterTransformTest.java            |  42 ++
 315 files changed, 19924 insertions(+), 1 deletion(-)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..89cb037
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,22 @@
+*dependency-reduced-pom.xml
+.classpath
+.project
+.settings/
+devenv
+*.log*
+*.iml
+*.pid
+.idea/
+*.versionsBackup
+!NOTICE-BIN
+!LICENSE-BIN
+.DS_Store
+*.class
+adapter/api/target/
+adapter/persistence/target/
+adapter/rpc/target/
+application/target/
+domain/target/
+start/target/
+common/target/
+supports/*/target/
diff --git a/README.md b/README.md
index ee96150..b377d89 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,107 @@
-# rocketmq-eventbridge
+
+## Apache RocketMQ EventBridge
+RocketMQ EventBridge is a subproject of rocketmq to make it easier to build event-driven applications. In addition, rocketmq-eventbridge can route events between many services and applications based on the standard CloudEvents 1.0 specification. Users can use rocketmq-eventbridge to build loosely coupled and distributed event-driven architectures.
+
+## Architecture
+Events are sent to the event bus in two ways: 1) Push events through the SDK or Webhook actively; 2) Pulled events by eventbridge passively. Events obtained in both ways will be stored on the event bus. EventBus is the core concept in EventBridge, which allows you to subscribe to the events, filter the events, and push to the specified target by creating the event rule. The event on the event bus is stored by rocketmq. Through rocketmq-connect, we can pull the event from the register sou [...]
+
+- `application`  应用服务模块, 定义Application Service
+- `adapter` 适配层
+    - `persistence` 持久化相关, 一般存放Repository的实现(包含DO对象)
+    - `api` 暴露给外部的api接口提供者
+    - `rpc` 添加自己反转依赖的SPI, 以及SPI的实现适配
+- `domain` 领域设计的核心模块
+    - 每个聚合通过package隔离,定义于`model`package下
+    - org.apache.rocketmq.eventbridge.domain.service` 存放当前子域下的所有领域服务
+- `start` 启动入口(多个子域被打包在同一个应用jar包中时, start模块会被排除)
+
+
+## Demo
+#### Dependencies
+* rocketmq-connect
+  
+* Mysql 
+
+#### 
+
+* Create EventBus
+```
+http://127.0.0.1:7001/bus/createEventBus
+```
+```json
+{
+"eventBusName":"demo",
+"description":"a demo bus."
+}
+```
+
+
+* Create EventSource
+```
+http://127.0.0.1:7001/bus/createEventSource
+```
+```json
+{
+"eventBusName":"demo",
+"eventSourceName":"demo-source",
+"description":"a demo bus."
+}
+```
+
+
+* Create EventRule
+```
+http://127.0.0.1:7001/rule/createEventRule
+```
+```json
+{
+  "eventBusName":"demo",
+  "eventRuleName":"demo",
+  "description":"test",
+  "filterPattern":"{}"
+}
+```
+
+* Create Target
+
+This is a sample with DingTalk target.
+```
+http://127.0.0.1:7001/target/createEventTargets
+```
+```json
+{
+    "eventBusName":"demo",
+    "eventRuleName":"demo",
+    "eventTargetRunners":[
+        {
+            "eventTargetName":"demo",
+            "className":"acs.dingtalk",
+            "config":{
+            "WebHook":"https://oapi.dingtalk.com/robot/send?access_token=b43a54b702314415c2acdae97eda1e092528b7a9dddb31510a5b4430be2ef867",
+            "SecretKey":"SEC53483bf496b8f9e0b4ab0ab669d422208e6ccfaedfd5120ea6b8426b9ecd47aa",
+            "Body":"{\"template\":\"{\\\"text\\\":{\\\"content\\\":\\\"${content}\\\"},\\\"msgtype\\\":\\\"text\\\"}\",\"form\":\"TEMPLATE\",\"value\":\"{\\\"content\\\":\\\"$.data.body\\\"}\"}"
+            }
+        }
+    ]
+}
+```
+* Put Events to EventBus 
+```
+URL: http://127.0.0.1:7001/putEvents
+Header: Content-Type:"application/cloudevents+json; charset=UTF-8"
+```
+```json
+{
+    "specversion" : "1.0",
+    "type" : "com.github.pull_request.opened",
+    "source" : "https://github.com/cloudevents/spec/pull",
+    "subject" : "123",
+    "id" : "A234-1234-1234",
+    "time" : "2018-04-05T17:31:00Z",
+    "datacontenttype" : "application/json",
+    "data" : {
+        "body":"demo"
+    },
+    "aliyuneventbusname":"demo"
+}
+```
\ No newline at end of file
diff --git a/adapter/api/pom.xml b/adapter/api/pom.xml
new file mode 100644
index 0000000..f62f562
--- /dev/null
+++ b/adapter/api/pom.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>rocketmq-eventbridge-adapter</artifactId>
+        <groupId>org.apache.rocketmq</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>rocketmq-eventbridge-adapter-api</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+
+    <properties>
+        <jakarta.version>2.1.6</jakarta.version>
+        <jersey.version>2.30.1</jersey.version>
+        <reactor.version>3.4.14</reactor.version>
+    </properties>
+
+    <dependencies>
+        <!-- Project modules -->
+        <dependency>
+            <groupId>org.apache.rocketmq</groupId>
+            <artifactId>rocketmq-eventbridge-adapter-persistence</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.rocketmq</groupId>
+            <artifactId>rocketmq-eventbridge-adapter-rpc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.rocketmq</groupId>
+            <artifactId>rocketmq-eventbridge-domain</artifactId>
+        </dependency>
+        <!-- Framework -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-webflux</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-autoconfigure</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.ws.rs</groupId>
+            <artifactId>jakarta.ws.rs-api</artifactId>
+            <version>${jakarta.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.core</groupId>
+            <artifactId>jersey-common</artifactId>
+            <version>${jersey.version}</version>
+        </dependency>
+
+        <!-- tools -->
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.cloudevents</groupId>
+            <artifactId>cloudevents-json-jackson</artifactId>
+            <version>${cloudevents.version}</version>
+        </dependency>
+        <dependency>
+            <artifactId>cloudevents-http-basic</artifactId>
+            <groupId>io.cloudevents</groupId>
+            <version>${cloudevents.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.cloudevents</groupId>
+            <artifactId>cloudevents-http-restful-ws</artifactId>
+            <version>${cloudevents.version}</version>
+        </dependency>
+        <!-- Test -->
+        <dependency>
+            <groupId>io.projectreactor</groupId>
+            <artifactId>reactor-test</artifactId>
+            <version>${reactor.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/controller/EventBusController.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/controller/EventBusController.java
new file mode 100644
index 0000000..5424b34
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/controller/EventBusController.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.controller;
+
+import java.util.List;
+
+import com.google.common.collect.Lists;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.bus.CreateEventBusRequest;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.bus.CreateEventBusResponse;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.bus.DeleteEventBusRequest;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.bus.DeleteEventBusResponse;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.bus.EventBusDTO;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.bus.GetEventBusRequest;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.bus.GetEventBusResponse;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.bus.ListEventBusesRequest;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.bus.ListEventBusesResponse;
+import org.apache.rocketmq.eventbridge.domain.model.PaginationResult;
+import org.apache.rocketmq.eventbridge.domain.model.bus.EventBus;
+import org.apache.rocketmq.eventbridge.domain.rpc.AccountAPI;
+import org.apache.rocketmq.eventbridge.domain.service.EventBusDomainService;
+import org.apache.rocketmq.eventbridge.domain.model.bus.EventBusService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/bus/")
+public class EventBusController {
+
+    @Autowired
+    EventBusService eventBusService;
+
+    @Autowired
+    EventBusDomainService eventBusDomainService;
+
+    @Autowired
+    AccountAPI accountAPI;
+
+    @PostMapping(value = {"createEventBus"})
+    public CreateEventBusResponse createEventBus(@RequestBody CreateEventBusRequest createEventBusRequest) {
+        eventBusService.createEventBus(accountAPI.getResourceOwnerAccountId(), createEventBusRequest.getEventBusName(),
+            createEventBusRequest.getDescription());
+        return new CreateEventBusResponse(createEventBusRequest.getEventBusName());
+    }
+
+    @PostMapping(value = {"getEventBus"})
+    public GetEventBusResponse getEventBus(@RequestBody GetEventBusRequest getEventBusRequest) {
+        EventBus eventbus = eventBusService.getEventBus(accountAPI.getResourceOwnerAccountId(),
+            getEventBusRequest.getEventBusName());
+        return new GetEventBusResponse(eventbus.getName(), eventbus.getDescription(), eventbus.getGmtCreate()
+            .getTime());
+    }
+
+    @PostMapping(value = {"deleteEventBus"})
+    public DeleteEventBusResponse deleteEventBus(@RequestBody DeleteEventBusRequest deleteEventBusRequest) {
+        eventBusDomainService.deleteEventBusCheckDependencies(accountAPI.getResourceOwnerAccountId(),
+            deleteEventBusRequest.getEventBusName());
+        return new DeleteEventBusResponse();
+    }
+
+    @PostMapping(value = {"listEventBuses"})
+    public ListEventBusesResponse listEventBuses(@RequestBody ListEventBusesRequest listEventBusesRequest) {
+        PaginationResult<List<EventBus>> paginationResult = eventBusService.listEventBuses(
+            accountAPI.getResourceOwnerAccountId(), listEventBusesRequest.getNextToken(),
+            listEventBusesRequest.getMaxResults());
+        List<EventBusDTO> eventBuses = Lists.newArrayList();
+        paginationResult.getData()
+            .forEach(eventBus -> {
+                EventBusDTO eventBusDTO = new EventBusDTO();
+                eventBusDTO.setEventBusName(eventBusDTO.getEventBusName());
+                eventBusDTO.setDescription(eventBus.getDescription());
+                eventBuses.add(eventBusDTO);
+            });
+        return new ListEventBusesResponse(eventBuses, paginationResult.getNextToken(), paginationResult.getTotal(),
+            listEventBusesRequest.getMaxResults());
+    }
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/controller/EventDataController.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/controller/EventDataController.java
new file mode 100644
index 0000000..d809b77
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/controller/EventDataController.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.controller;
+
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.collect.Lists;
+import io.cloudevents.CloudEvent;
+import io.cloudevents.core.format.EventFormat;
+import io.cloudevents.core.message.MessageReader;
+import io.cloudevents.core.provider.EventFormatProvider;
+import io.cloudevents.http.HttpMessageFactory;
+import io.cloudevents.jackson.JsonFormat;
+import io.netty.handler.codec.http.DefaultHttpHeaders;
+import io.netty.handler.codec.http.HttpHeaders;
+import org.apache.rocketmq.eventbridge.adapter.api.converter.EventConverterAdapter;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.data.PutEventsResponse;
+import org.apache.rocketmq.eventbridge.adapter.api.handler.EventDataHandler;
+import org.apache.rocketmq.eventbridge.domain.rpc.AccountAPI;
+import org.apache.rocketmq.eventbridge.event.EventBridgeEvent;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import reactor.core.publisher.Mono;
+
+@RestController
+@RequestMapping("/")
+public class EventDataController {
+
+    @Autowired
+    EventDataHandler eventDataHandler;
+
+    @Autowired
+    AccountAPI accountAPI;
+
+    @Autowired
+    EventConverterAdapter eventConverterAdapter;
+
+    @PostMapping(value = {"putEvents"})
+    public Mono<PutEventsResponse> putEvents(@RequestHeader Map<String, String> headers, @RequestBody byte[] body) {
+        List<CloudEvent> cloudEvents = eventConverterAdapter.toEventsRequest(headers, body);
+        List<EventBridgeEvent> eventList = this.converterEventBridgeEvent(cloudEvents);
+        return eventDataHandler.putEvents(accountAPI.getResourceOwnerAccountId(), eventList);
+    }
+
+    private List<EventBridgeEvent> converterEventBridgeEvent(List<CloudEvent> cloudEvents) {
+        List<EventBridgeEvent> eventList = Lists.newArrayListWithCapacity(cloudEvents.size());
+        if (CollectionUtils.isEmpty(cloudEvents)) {
+            return eventList;
+        }
+        cloudEvents.forEach(cloudEvent -> {
+            EventBridgeEvent event = EventBridgeEvent.builder()
+                .id(cloudEvent.getId())
+                .source(cloudEvent.getSource())
+                .type(cloudEvent.getType())
+                .subject(cloudEvent.getSubject())
+                .specversion(cloudEvent.getSpecVersion()
+                    .toString())
+                .dataschema(cloudEvent.getDataSchema())
+                .datacontenttype(cloudEvent.getDataContentType())
+                .time(cloudEvent.getTime())
+                .data(cloudEvent.getData().toBytes())
+                .build();
+            if (cloudEvent.getExtensionNames() != null) {
+                cloudEvent.getExtensionNames()
+                    .forEach(extensionName -> {
+                        event.addExtension(extensionName, cloudEvent.getExtension(extensionName));
+                    });
+            }
+            eventList.add(event);
+        });
+        return eventList;
+    }
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/controller/EventRuleController.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/controller/EventRuleController.java
new file mode 100644
index 0000000..f6c6a93
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/controller/EventRuleController.java
@@ -0,0 +1,145 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.controller;
+
+import java.util.List;
+
+import com.google.common.collect.Lists;
+import org.apache.rocketmq.eventbridge.adapter.api.converter.EventTargetDTOConverter;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.rule.CreateRuleRequest;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.rule.CreateRuleResponse;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.rule.DeleteRuleRequest;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.rule.DeleteRuleResponse;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.rule.DisableRuleRequest;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.rule.DisableRuleResponse;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.rule.EnableRuleRequest;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.rule.EnableRuleResponse;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.rule.EventRuleDTO;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.rule.GetRuleRequest;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.rule.GetRuleResponse;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.rule.ListRulesRequest;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.rule.ListRulesResponse;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.rule.UpdateRuleRequest;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.rule.UpdateRuleResponse;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.target.EventTargetDTO;
+import org.apache.rocketmq.eventbridge.domain.model.PaginationResult;
+import org.apache.rocketmq.eventbridge.domain.model.rule.EventRule;
+import org.apache.rocketmq.eventbridge.domain.model.rule.EventRuleDetail;
+import org.apache.rocketmq.eventbridge.domain.model.rule.EventRuleService;
+import org.apache.rocketmq.eventbridge.domain.rpc.AccountAPI;
+import org.apache.rocketmq.eventbridge.domain.service.EventRuleDomainService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/rule/")
+public class EventRuleController {
+
+    @Autowired
+    private EventRuleService eventRuleService;
+
+    @Autowired
+    private EventRuleDomainService eventRuleDomainService;
+
+    @Autowired
+    AccountAPI accountAPI;
+
+    @PostMapping(value = {"createRule"})
+    public CreateRuleResponse createRule(@RequestBody CreateRuleRequest createRuleRequest) {
+        eventRuleService.createEventRule(accountAPI.getResourceOwnerAccountId(), createRuleRequest.getEventBusName(),
+            createRuleRequest.getEventRuleName(), createRuleRequest.getDescription(),
+            createRuleRequest.getFilterPattern());
+        return new CreateRuleResponse(createRuleRequest.getEventRuleName());
+    }
+
+    @PostMapping(value = {"getRule"})
+    public GetRuleResponse getRule(@RequestBody GetRuleRequest getRuleRequest) {
+        EventRuleDetail eventRuleDetail = eventRuleDomainService.getEventRuleDetail(
+            accountAPI.getResourceOwnerAccountId(), getRuleRequest.getEventBusName(),
+            getRuleRequest.getEventRuleName());
+
+        List<EventTargetDTO> eventTargets = EventTargetDTOConverter.convert(eventRuleDetail.getEventTargets());
+        GetRuleResponse getRuleResponse = GetRuleResponse.builder()
+            .eventBusName(eventRuleDetail.getEventBusName())
+            .eventRuleName(eventRuleDetail.getName())
+            .description(eventRuleDetail.getDescription())
+            .filterPattern(eventRuleDetail.getFilterPattern())
+            .status(eventRuleDetail.getStatus())
+            .gmtCreate(eventRuleDetail.getGmtCreate())
+            .gmtModify(eventRuleDetail.getGmtModify())
+            .eventTargets(eventTargets)
+            .build();
+        return getRuleResponse;
+    }
+
+    @PostMapping(value = {"deleteRule"})
+    public DeleteRuleResponse deleteRule(@RequestBody DeleteRuleRequest deleteRuleRequest) {
+        eventRuleDomainService.deleteEventRuleWithDependencies(accountAPI.getResourceOwnerAccountId(),
+            deleteRuleRequest.getEventBusName(), deleteRuleRequest.getEventRuleName());
+        return new DeleteRuleResponse();
+    }
+
+    @PostMapping(value = {"updateRule"})
+    public UpdateRuleResponse updateRule(@RequestBody UpdateRuleRequest updateRuleRequest) {
+        eventRuleDomainService.updateEventRuleWithDependencies(accountAPI.getResourceOwnerAccountId(),
+            updateRuleRequest.getEventBusName(), updateRuleRequest.getEventRuleName(),
+            updateRuleRequest.getDescription(), updateRuleRequest.getFilterPattern());
+        return new UpdateRuleResponse();
+    }
+
+    @PostMapping(value = {"listRules"})
+    public ListRulesResponse listRules(@RequestBody ListRulesRequest listRulesRequest) {
+        PaginationResult<List<EventRule>> paginationResult = eventRuleService.listEventRules(
+            accountAPI.getResourceOwnerAccountId(), listRulesRequest.getEventBusName(), listRulesRequest.getNextToken(),
+            listRulesRequest.getMaxResults());
+        List<EventRuleDTO> eventRules = Lists.newArrayList();
+        paginationResult.getData()
+            .forEach(eventRule -> {
+                EventRuleDTO eventRuleDTO = EventRuleDTO.builder()
+                    .eventBusName(eventRule.getEventBusName())
+                    .eventRuleName(eventRule.getName())
+                    .description(eventRule.getDescription())
+                    .filterPattern(eventRule.getFilterPattern())
+                    .status(eventRule.getStatus())
+                    .gmtCreate(eventRule.getGmtCreate())
+                    .gmtModify(eventRule.getGmtModify())
+                    .build();
+                eventRules.add(eventRuleDTO);
+            });
+        return new ListRulesResponse(eventRules, paginationResult.getNextToken(), paginationResult.getTotal(),
+            listRulesRequest.getMaxResults());
+    }
+
+    @PostMapping(value = {"enableRule"})
+    public EnableRuleResponse enableRule(@RequestBody EnableRuleRequest enableRuleRequest) {
+        eventRuleDomainService.enableEventRuleWithDependencies(accountAPI.getResourceOwnerAccountId(),
+            enableRuleRequest.getEventBusName(), enableRuleRequest.getEventRuleName());
+        return new EnableRuleResponse();
+    }
+
+    @PostMapping(value = {"disableRule"})
+    public DisableRuleResponse disableRule(@RequestBody DisableRuleRequest disableRuleRequest) {
+        eventRuleDomainService.disableEventRuleWithDependencies(accountAPI.getResourceOwnerAccountId(),
+            disableRuleRequest.getEventBusName(), disableRuleRequest.getEventRuleName());
+        return new DisableRuleResponse();
+    }
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/controller/EventSourceController.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/controller/EventSourceController.java
new file mode 100644
index 0000000..f0ab381
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/controller/EventSourceController.java
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.controller;
+
+import java.util.List;
+
+import com.google.common.collect.Lists;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.source.CreateEventSourceRequest;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.source.CreateEventSourceResponse;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.source.DeleteEventSourceRequest;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.source.DeleteEventSourceResponse;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.source.EventSourceDTO;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.source.GetEventSourceRequest;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.source.GetEventSourceResponse;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.source.ListEventSourcesRequest;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.source.ListEventSourcesResponse;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.source.UpdateEventSourceRequest;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.source.UpdateEventSourceResponse;
+import org.apache.rocketmq.eventbridge.domain.common.enums.EventSourceTypeEnum;
+import org.apache.rocketmq.eventbridge.domain.model.PaginationResult;
+import org.apache.rocketmq.eventbridge.domain.model.source.EventSource;
+import org.apache.rocketmq.eventbridge.domain.model.source.EventSourceService;
+import org.apache.rocketmq.eventbridge.domain.model.source.EventSourceServiceFactory;
+import org.apache.rocketmq.eventbridge.domain.rpc.AccountAPI;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/source/")
+public class EventSourceController {
+
+    @Autowired
+    AccountAPI accountAPI;
+
+    @Autowired
+    EventSourceServiceFactory eventSourceServiceFactory;
+
+    @PostMapping(value = {"createEventSource"})
+    public CreateEventSourceResponse createEventSource(@RequestBody CreateEventSourceRequest createEventSourceRequest) {
+        EventSourceService eventSourceService = eventSourceServiceFactory.getEventSourceService(
+            EventSourceTypeEnum.USER_DEFINED.name(), createEventSourceRequest.getClassName());
+        eventSourceService.createEventSource(accountAPI.getResourceOwnerAccountId(),
+            createEventSourceRequest.getEventBusName(), createEventSourceRequest.getEventSourceName(),
+            createEventSourceRequest.getDescription(), createEventSourceRequest.getClassName(),
+            createEventSourceRequest.getConfig());
+        return new CreateEventSourceResponse(createEventSourceRequest.getEventSourceName());
+    }
+
+    @PostMapping(value = {"updateEventSource"})
+    public UpdateEventSourceResponse updateEventSource(@RequestBody UpdateEventSourceRequest updateEventSourceRequest) {
+        EventSourceService eventSourceService = eventSourceServiceFactory.getEventSourceService(
+            accountAPI.getResourceOwnerAccountId(), updateEventSourceRequest.getEventBusName(),
+            updateEventSourceRequest.getEventSourceName());
+        eventSourceService.updateEventSource(accountAPI.getResourceOwnerAccountId(),
+            updateEventSourceRequest.getEventBusName(), updateEventSourceRequest.getEventSourceName(),
+            updateEventSourceRequest.getDescription(), updateEventSourceRequest.getClassName(),
+            updateEventSourceRequest.getConfig());
+        return new UpdateEventSourceResponse();
+    }
+
+    @PostMapping(value = {"deleteEventSource"})
+    public DeleteEventSourceResponse deleteEventSource(@RequestBody DeleteEventSourceRequest deleteEventSourceRequest) {
+        EventSourceService eventSourceService = eventSourceServiceFactory.getEventSourceService(
+            accountAPI.getResourceOwnerAccountId(), deleteEventSourceRequest.getEventBusName(),
+            deleteEventSourceRequest.getEventSourceName());
+        eventSourceService.deleteEventSource(accountAPI.getResourceOwnerAccountId(),
+            deleteEventSourceRequest.getEventBusName(), deleteEventSourceRequest.getEventSourceName());
+        return new DeleteEventSourceResponse();
+    }
+
+    @PostMapping(value = {"getEventSource"})
+    public GetEventSourceResponse getEventSource(@RequestBody GetEventSourceRequest getEventSourceRequest) {
+        EventSourceService eventSourceService = eventSourceServiceFactory.getEventSourceService(
+            accountAPI.getResourceOwnerAccountId(), getEventSourceRequest.getEventBusName(),
+            getEventSourceRequest.getEventSourceName());
+        EventSource eventSource = eventSourceService.getEventSource(accountAPI.getResourceOwnerAccountId(),
+            getEventSourceRequest.getEventBusName(), getEventSourceRequest.getEventSourceName());
+        return new GetEventSourceResponse(eventSource.getEventBusName(), eventSource.getName(),
+            eventSource.getDescription(), eventSource.getClassName(), eventSource.getConfig());
+    }
+
+    @PostMapping(value = {"listEventSources"})
+    public ListEventSourcesResponse listEventSources(@RequestBody ListEventSourcesRequest listEventSourcesRequest) {
+        EventSourceService eventSourceService = eventSourceServiceFactory.getDefaultEventSourceService();
+        PaginationResult<List<EventSource>> paginationResult = eventSourceService.listEventSources(
+            accountAPI.getResourceOwnerAccountId(), listEventSourcesRequest.getEventBusName(),
+            listEventSourcesRequest.getNextToken(), listEventSourcesRequest.getMaxResults());
+        List<EventSourceDTO> eventSourceDTOS = Lists.newArrayList();
+        paginationResult.getData()
+            .forEach(eventSource -> {
+                EventSourceDTO eventSourceDTO = EventSourceDTO.builder()
+                    .eventBusName(eventSource.getEventBusName())
+                    .eventSourceName(eventSource.getName())
+                    .description(eventSource.getDescription())
+                    .gmtCreate(eventSource.getGmtCreate())
+                    .gmtModify(eventSource.getGmtModify())
+                    .build();
+                eventSourceDTOS.add(eventSourceDTO);
+            });
+        return new ListEventSourcesResponse(eventSourceDTOS, paginationResult.getNextToken(),
+            paginationResult.getTotal(), listEventSourcesRequest.getMaxResults());
+    }
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/controller/EventTargetController.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/controller/EventTargetController.java
new file mode 100644
index 0000000..d8607a8
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/controller/EventTargetController.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.controller;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.rocketmq.eventbridge.adapter.api.converter.EventTargetConverter;
+import org.apache.rocketmq.eventbridge.adapter.api.converter.EventTargetDTOConverter;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.target.CreateTargetsRequest;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.target.CreateTargetsResponse;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.target.DeleteTargetsRequest;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.target.DeleteTargetsResponse;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.target.EventTargetDTO;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.target.ListTargetsRequest;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.target.ListTargetsResponse;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.target.UpdateTargetsRequest;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.target.UpdateTargetsResponse;
+import org.apache.rocketmq.eventbridge.domain.model.target.EventTarget;
+import org.apache.rocketmq.eventbridge.domain.model.target.EventTargetService;
+import org.apache.rocketmq.eventbridge.domain.rpc.AccountAPI;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/target/")
+public class EventTargetController {
+
+    @Autowired
+    EventTargetService eventTargetService;
+
+    @Autowired
+    AccountAPI accountAPI;
+
+    @PostMapping(value = {"createEventTargets"})
+    public CreateTargetsResponse createTargets(@RequestBody CreateTargetsRequest createTargetsRequest) {
+        List<EventTarget> eventTargetList = EventTargetConverter.convertEventTargets(
+            accountAPI.getResourceOwnerAccountId(), createTargetsRequest.getEventBusName(),
+            createTargetsRequest.getEventRuleName(), createTargetsRequest.getEventTargets());
+        eventTargetService.createTargets(accountAPI.getResourceOwnerAccountId(), createTargetsRequest.getEventBusName(),
+            createTargetsRequest.getEventRuleName(), eventTargetList);
+        return new CreateTargetsResponse();
+    }
+
+    @PostMapping(value = {"updateEventTargets"})
+    public UpdateTargetsResponse updateTargets(@RequestBody UpdateTargetsRequest updateTargetsRequest) {
+        List<EventTarget> eventTargetList = EventTargetConverter.convertEventTargets(
+            accountAPI.getResourceOwnerAccountId(), updateTargetsRequest.getEventBusName(),
+            updateTargetsRequest.getEventRuleName(), updateTargetsRequest.getEventTargets());
+        eventTargetService.updateTargets(accountAPI.getResourceOwnerAccountId(), updateTargetsRequest.getEventBusName(),
+            updateTargetsRequest.getEventRuleName(), eventTargetList);
+        return new UpdateTargetsResponse();
+    }
+
+    @PostMapping(value = {"deleteEventTargets"})
+    public DeleteTargetsResponse deleteTargets(@RequestBody DeleteTargetsRequest deleteTargetsRequest) {
+        eventTargetService.deleteTargets(accountAPI.getResourceOwnerAccountId(), deleteTargetsRequest.getEventBusName(),
+            deleteTargetsRequest.getEventRuleName(), deleteTargetsRequest.getEventTargetNames());
+        return new DeleteTargetsResponse();
+    }
+
+    @PostMapping(value = {"listEventTargets"})
+    public ListTargetsResponse listEventTargets(@RequestBody ListTargetsRequest listTargetsRequest) {
+        List<EventTarget> eventTargetRunnerList = eventTargetService.listTargets(accountAPI.getResourceOwnerAccountId(),
+            listTargetsRequest.getEventBusName(), listTargetsRequest.getEventRuleName());
+        List<EventTargetDTO> eventTargets = eventTargetRunnerList.stream()
+            .map(entry -> EventTargetDTOConverter.convert(entry))
+            .collect(Collectors.toList());
+        ListTargetsResponse listTargetsResponse = new ListTargetsResponse();
+        listTargetsResponse.setEventBusName(listTargetsRequest.getEventBusName());
+        listTargetsResponse.setEventRuleName(listTargetsRequest.getEventRuleName());
+        listTargetsResponse.setEventTargets(eventTargets);
+        return listTargetsResponse;
+    }
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/controller/EventTypeController.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/controller/EventTypeController.java
new file mode 100644
index 0000000..4ac545e
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/controller/EventTypeController.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.rocketmq.eventbridge.adapter.api.controller;
+
+import java.util.List;
+
+import com.google.common.collect.Lists;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.type.EventTypeDTO;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.type.ListEventTypesRequest;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.type.ListEventTypesResponse;
+import org.apache.rocketmq.eventbridge.domain.model.PaginationResult;
+import org.apache.rocketmq.eventbridge.domain.model.source.EventType;
+import org.apache.rocketmq.eventbridge.domain.rpc.AccountAPI;
+import org.apache.rocketmq.eventbridge.domain.model.source.EventTypeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/type/")
+public class EventTypeController {
+
+    @Autowired
+    AccountAPI accountAPI;
+
+    @Autowired
+    EventTypeService eventTypeService;
+
+    @PostMapping(value = {"listEventTypes"})
+    public ListEventTypesResponse listEventTypes(@RequestBody ListEventTypesRequest listEventTypesRequest) {
+        PaginationResult<List<EventType>> paginationResult = eventTypeService.listEventTypes(
+            accountAPI.getResourceOwnerAccountId(), listEventTypesRequest.getEventBusName(),
+            listEventTypesRequest.getEventSourceName(), listEventTypesRequest.getNextToken(),
+            listEventTypesRequest.getMaxResults());
+
+        List<EventTypeDTO> eventTypeDTOS = Lists.newArrayList();
+        paginationResult.getData()
+            .forEach(eventType -> {
+                EventTypeDTO eventTypeDTO = EventTypeDTO.builder()
+                    .eventBusName(eventType.getEventBusName())
+                    .eventSourceName(eventType.getEventSourceName())
+                    .eventTypeName(eventType.getName())
+                    .description(eventType.getDescription())
+                    .gmtCreate(eventType.getGmtCreate())
+                    .gmtModify(eventType.getGmtModify())
+                    .build();
+                eventTypeDTOS.add(eventTypeDTO);
+            });
+        return new ListEventTypesResponse(eventTypeDTOS, paginationResult.getNextToken(), paginationResult.getTotal(),
+            listEventTypesRequest.getMaxResults());
+    }
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/CloudEventBatchedConverter.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/CloudEventBatchedConverter.java
new file mode 100644
index 0000000..9c59c22
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/CloudEventBatchedConverter.java
@@ -0,0 +1,46 @@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+
+ package org.apache.rocketmq.eventbridge.adapter.api.converter;
+
+ import java.util.List;
+ import java.util.Map;
+
+ import com.google.common.base.Strings;
+ import io.cloudevents.CloudEvent;
+ import org.apache.rocketmq.eventbridge.adapter.api.converter.format.BatchedJsonFormat;
+ import org.springframework.stereotype.Service;
+
+ import static org.apache.http.protocol.HTTP.CONTENT_TYPE;
+
+ @Service
+ public class CloudEventBatchedConverter implements EventConverter {
+
+     private static final String HTTP_BATCHED_PROTOCOL_BINDING = "application/cloudevents-batch+json";
+
+     @Override
+     public boolean hit(Map<String, String> headers) {
+         String contentType = headers.get(CONTENT_TYPE);
+         return !Strings.isNullOrEmpty(contentType) && contentType.startsWith(HTTP_BATCHED_PROTOCOL_BINDING);
+     }
+
+     @Override
+     public List<CloudEvent> toEventBridgeEvent(Map<String, String> headers, byte[] body) {
+         return new BatchedJsonFormat().deserialize(body);
+     }
+ }
+
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/CloudEventBinaryConverter.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/CloudEventBinaryConverter.java
new file mode 100644
index 0000000..7148d3a
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/CloudEventBinaryConverter.java
@@ -0,0 +1,75 @@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+
+ package org.apache.rocketmq.eventbridge.adapter.api.converter;
+
+ import java.util.List;
+ import java.util.Map;
+ import javax.ws.rs.core.MediaType;
+ import javax.ws.rs.core.MultivaluedHashMap;
+
+ import com.google.common.base.Strings;
+ import com.google.common.collect.Lists;
+ import io.cloudevents.CloudEvent;
+ import io.cloudevents.SpecVersion;
+ import io.cloudevents.http.restful.ws.impl.RestfulWSMessageFactory;
+ import io.netty.handler.codec.http.HttpHeaders;
+ import org.springframework.stereotype.Service;
+
+ import static org.apache.http.protocol.HTTP.CONTENT_TYPE;
+
+ @Service
+ public class CloudEventBinaryConverter implements EventConverter {
+
+     private static final String HTTP_BINARY_PROTOCOL_BINDING = "application/json";
+
+     @Override
+     public boolean hit(Map<String, String> headers) {
+         String contentType = headers.get(CONTENT_TYPE);
+         if (Strings.isNullOrEmpty(contentType) || !contentType.startsWith(HTTP_BINARY_PROTOCOL_BINDING)) {
+             return false;
+         }
+         String specversion = headers.get("ce-specversion");
+         if (Strings.isNullOrEmpty(specversion)) {
+             return false;
+         }
+         SpecVersion specVersion = null;
+         try {
+             specVersion = SpecVersion.parse(specversion);
+         } catch (Throwable e) {
+             // do nothing;
+         }
+         if (specVersion == null) {
+             return false;
+         } else {
+             return true;
+         }
+     }
+
+     @Override
+     public List<CloudEvent> toEventBridgeEvent(Map<String, String> headers, byte[] body) {
+         MultivaluedHashMap<String, String> headerMap = new MultivaluedHashMap();
+         headers.entrySet()
+             .stream()
+             .forEach(entry -> headerMap.add(entry.getKey(), entry.getValue()));
+         String mediaType = headers.get(CONTENT_TYPE);
+         CloudEvent cloudEvent = RestfulWSMessageFactory.create(MediaType.valueOf(mediaType), headerMap, body)
+             .toEvent();
+         return Lists.newArrayList(cloudEvent);
+     }
+ }
+
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/CloudEventStructuredConverter.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/CloudEventStructuredConverter.java
new file mode 100644
index 0000000..2c35cd3
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/CloudEventStructuredConverter.java
@@ -0,0 +1,51 @@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+
+ package org.apache.rocketmq.eventbridge.adapter.api.converter;
+
+ import java.util.List;
+ import java.util.Map;
+
+ import com.google.common.base.Strings;
+ import com.google.common.collect.Lists;
+ import io.cloudevents.CloudEvent;
+ import io.cloudevents.core.format.EventFormat;
+ import io.cloudevents.core.provider.EventFormatProvider;
+ import org.springframework.stereotype.Service;
+
+ import static org.apache.http.protocol.HTTP.CONTENT_TYPE;
+
+ @Service
+ public class CloudEventStructuredConverter implements EventConverter {
+
+     private static final String HTTP_STRUCTURED_PROTOCOL_BINDING = "application/cloudevents+json";
+
+     @Override
+     public boolean hit(Map<String, String> headers) {
+         String contentType = headers.get(CONTENT_TYPE);
+         return !Strings.isNullOrEmpty(contentType) && contentType.startsWith(HTTP_STRUCTURED_PROTOCOL_BINDING);
+     }
+
+     @Override
+     public List<CloudEvent> toEventBridgeEvent(Map<String, String> headers, byte[] body) {
+         EventFormat format = EventFormatProvider.getInstance()
+             .resolveFormat(HTTP_STRUCTURED_PROTOCOL_BINDING);
+         CloudEvent event = format.deserialize(body);
+         return Lists.newArrayList(event);
+     }
+ }
+
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/EventConverter.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/EventConverter.java
new file mode 100644
index 0000000..8a5fb4c
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/EventConverter.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.converter;
+
+import java.util.List;
+import java.util.Map;
+
+import io.cloudevents.CloudEvent;
+import io.netty.handler.codec.http.HttpHeaders;
+
+public interface EventConverter {
+    /**
+     * whether hit the current protocol
+     *
+     * @param headers
+     *
+     * @return
+     */
+    boolean hit(Map<String, String> headers);
+
+    /**
+     * extract element from body to build {@link HttpHeaders}
+     *
+     * @param headers
+     * @param body
+     *
+     * @return
+     *
+     * @throws Throwable
+     */
+    List<CloudEvent> toEventBridgeEvent(Map<String, String> headers, byte[] body);
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/EventConverterAdapter.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/EventConverterAdapter.java
new file mode 100644
index 0000000..92564c7
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/EventConverterAdapter.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rocketmq.eventbridge.adapter.api.converter;
+
+import java.util.List;
+import java.util.Map;
+import javax.annotation.PostConstruct;
+
+import com.google.common.collect.Lists;
+import com.google.gson.Gson;
+import io.cloudevents.CloudEvent;
+import io.netty.handler.codec.http.HttpHeaders;
+import org.apache.rocketmq.eventbridge.exception.EventBridgeException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import static org.apache.rocketmq.eventbridge.exception.code.EventErrorCode.EventHTTPProtocolBindingInvalid;
+
+@Service
+public class EventConverterAdapter {
+
+    @Autowired
+    private CloudEventBatchedConverter cloudEventBatchedConverter;
+    @Autowired
+    private CloudEventBinaryConverter cloudEventBinaryConverter;
+    @Autowired
+    private CloudEventStructuredConverter cloudEventStructuredConverter;
+
+    private List<EventConverter> eventConverterList = Lists.newArrayListWithCapacity(3);
+
+    @PostConstruct
+    public void init() {
+        eventConverterList.add(cloudEventBatchedConverter);
+        eventConverterList.add(cloudEventBinaryConverter);
+        eventConverterList.add(cloudEventStructuredConverter);
+    }
+
+    /**
+     * The entry function:extract the event form body and {@link HttpHeaders}
+     *
+     * @param headers
+     * @param body
+     *
+     * @return
+     *
+     * @throws Throwable
+     */
+
+    public List<CloudEvent> toEventsRequest(Map<String, String> headers, byte[] body) {
+        return getEventConverter(headers).toEventBridgeEvent(headers, body);
+    }
+
+    /**
+     * Find the {@link EventConverter} to handler request, the default strategy is "First fit"
+     *
+     * @param headers
+     *
+     * @return
+     */
+    private EventConverter getEventConverter(Map<String, String> headers) {
+        EventConverter eventConverter = eventConverterList.stream()
+            .filter(adapter -> adapter.hit(headers))
+            .findFirst()
+            .get();
+        if (eventConverter == null) {
+            throw new EventBridgeException(EventHTTPProtocolBindingInvalid, new Gson().toJson(headers));
+        }
+        return eventConverter;
+    }
+
+    public List<EventConverter> getEventConverterList() {
+        return eventConverterList;
+    }
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/EventTargetConverter.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/EventTargetConverter.java
new file mode 100644
index 0000000..673be80
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/EventTargetConverter.java
@@ -0,0 +1,145 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.converter;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.google.common.base.Strings;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.target.DeadLetterQueueDTO;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.target.EventTargetDTO;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.target.RetryStrategyDTO;
+import org.apache.rocketmq.eventbridge.domain.common.enums.ErrorToleranceEnum;
+import org.apache.rocketmq.eventbridge.domain.common.enums.PushRetryStrategyEnum;
+import org.apache.rocketmq.eventbridge.domain.model.run.DeadLetterQueue;
+import org.apache.rocketmq.eventbridge.domain.model.run.RetryStrategy;
+import org.apache.rocketmq.eventbridge.domain.model.run.RunOptions;
+import org.apache.rocketmq.eventbridge.domain.model.target.EventTarget;
+
+public class EventTargetConverter {
+
+    /**
+     * convert {@link EventTargetDTO} list to {@link EventTarget} list.
+     *
+     * @param accountId
+     * @param eventBusName
+     * @param eventRuleName
+     * @param eventTargetDTOs
+     *
+     * @return
+     */
+    public static List<EventTarget> convertEventTargets(String accountId, String eventBusName,
+        String eventRuleName, List<EventTargetDTO> eventTargetDTOs) {
+        if (eventTargetDTOs == null) {
+            return null;
+        }
+        return eventTargetDTOs.stream()
+            .map(eventTargetDTO -> convertEventTarget(accountId, eventBusName, eventRuleName, eventTargetDTO))
+            .collect(Collectors.toList());
+    }
+
+    /**
+     * convert {@link EventTargetDTO} to {@link EventTarget}.
+     *
+     * @param accountId
+     * @param eventBusName
+     * @param eventRuleName
+     * @param eventTargetDTO
+     *
+     * @return
+     */
+    public static EventTarget convertEventTarget(String accountId, String eventBusName,
+        String eventRuleName, EventTargetDTO eventTargetDTO) {
+        EventTarget eventTarget = EventTarget.builder()
+            .accountId(accountId)
+            .eventBusName(eventBusName)
+            .eventRuleName(eventRuleName)
+            .name(eventTargetDTO.getEventTargetName())
+            .className(eventTargetDTO.getClassName())
+            .config(eventTargetDTO.getConfig())
+            .build();
+
+        if (eventTargetDTO.getRunOptions() == null) {
+            return eventTarget;
+        }
+        RunOptions runOptions = RunOptions.builder()
+            .deadLetterQueue(convertDeadLetterQueue(eventTargetDTO.getRunOptions()
+                .getDeadLetterQueue()))
+            .errorsTolerance(convertErrorTolerance(eventTargetDTO.getRunOptions()
+                .getErrorsTolerance()))
+            .retryStrategy(convertRetryStrategy(eventTargetDTO.getRunOptions()
+                .getRetryStrategy()))
+            .build();
+        eventTarget.setRunOptions(runOptions);
+
+        return eventTarget;
+    }
+
+    /**
+     * convert {@link RetryStrategyDTO} to {@link RetryStrategy}.
+     *
+     * @param retryStrategyDTO
+     *
+     * @return
+     */
+    public static RetryStrategy convertRetryStrategy(RetryStrategyDTO retryStrategyDTO) {
+        RetryStrategy retryStrategy = null;
+        if (retryStrategyDTO != null) {
+            retryStrategy = RetryStrategy.builder()
+                .pushRetryStrategy(PushRetryStrategyEnum.parse(retryStrategyDTO.getPushRetryStrategy()))
+                .maximumRetryAttempts(retryStrategyDTO.getMaximumRetryAttempts())
+                .maximumEventAgeInSeconds(retryStrategyDTO.getMaximumEventAgeInSeconds())
+                .build();
+        }
+        return retryStrategy;
+    }
+
+    /**
+     * convert errorsTolerance to {@link ErrorToleranceEnum}.
+     *
+     * @param errorsTolerance
+     *
+     * @return
+     */
+    public static ErrorToleranceEnum convertErrorTolerance(String errorsTolerance) {
+        ErrorToleranceEnum errorTolerance = null;
+        if (!Strings.isNullOrEmpty(errorsTolerance)) {
+            errorTolerance = ErrorToleranceEnum.parse(errorsTolerance);
+        }
+        return errorTolerance;
+    }
+
+    /**
+     * convert {@link DeadLetterQueueDTO} to {@link DeadLetterQueue}.
+     *
+     * @param deadLetterQueueDTO
+     *
+     * @return
+     */
+    public static DeadLetterQueue convertDeadLetterQueue(DeadLetterQueueDTO deadLetterQueueDTO) {
+        DeadLetterQueue deadLetterQueue = null;
+        if (deadLetterQueueDTO != null) {
+            deadLetterQueue = DeadLetterQueue.builder()
+                .type(deadLetterQueueDTO.getType())
+                .config(deadLetterQueueDTO.getConfig())
+                .build();
+        }
+        return deadLetterQueue;
+    }
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/EventTargetDTOConverter.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/EventTargetDTOConverter.java
new file mode 100644
index 0000000..30a5392
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/EventTargetDTOConverter.java
@@ -0,0 +1,130 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.converter;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.rocketmq.eventbridge.adapter.api.dto.target.DeadLetterQueueDTO;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.target.EventTargetDTO;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.target.RetryStrategyDTO;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.target.RunOptionsDTO;
+import org.apache.rocketmq.eventbridge.domain.common.enums.ErrorToleranceEnum;
+import org.apache.rocketmq.eventbridge.domain.model.run.DeadLetterQueue;
+import org.apache.rocketmq.eventbridge.domain.model.run.RetryStrategy;
+import org.apache.rocketmq.eventbridge.domain.model.run.RunOptions;
+import org.apache.rocketmq.eventbridge.domain.model.target.EventTarget;
+
+public class EventTargetDTOConverter {
+
+    /**
+     * convert {@link EventTarget} list to {@link EventTargetDTO} list.
+     *
+     * @param eventTargets
+     *
+     * @return
+     */
+    public static List<EventTargetDTO> convert(List<EventTarget> eventTargets) {
+        return eventTargets.stream()
+            .map(eventTarget -> convert(eventTarget))
+            .collect(Collectors.toList());
+    }
+
+    /**
+     * convert {@link EventTarget} to {@link EventTargetDTO}.
+     *
+     * @param eventTarget
+     *
+     * @return
+     */
+    public static EventTargetDTO convert(EventTarget eventTarget) {
+        EventTargetDTO eventTargetDTO = new EventTargetDTO();
+        eventTargetDTO.setEventTargetName(eventTarget.getName());
+        eventTargetDTO.setClassName(eventTarget.getClassName());
+        eventTargetDTO.setConfig(eventTarget.getConfig());
+        eventTargetDTO.setRunOptions(convertRunOptionsDTO(eventTarget.getRunOptions()));
+        return eventTargetDTO;
+    }
+
+    /**
+     * convert {@link RunOptions} to {@link RunOptionsDTO}.
+     *
+     * @param runOptions
+     *
+     * @return
+     */
+    private static RunOptionsDTO convertRunOptionsDTO(RunOptions runOptions) {
+        RunOptionsDTO runOptionsDTO = new RunOptionsDTO();
+        runOptionsDTO.setRetryStrategy(convertRetryStrategyDTO(runOptions.getRetryStrategy()));
+        runOptionsDTO.setDeadLetterQueue(convertDeadLetterQueueDTO(runOptions.getDeadLetterQueue()));
+        runOptionsDTO.setErrorsTolerance(convertErrorTolerance(runOptions.getErrorsTolerance()));
+        return runOptionsDTO;
+    }
+
+    /**
+     * convert {@link ErrorToleranceEnum} to string
+     *
+     * @param errorsTolerance
+     *
+     * @return
+     */
+    private static String convertErrorTolerance(ErrorToleranceEnum errorsTolerance) {
+        if (errorsTolerance == null) {
+            return null;
+        } else {
+            return errorsTolerance.toString();
+        }
+    }
+
+    /**
+     * convert {@link DeadLetterQueue} to {@link DeadLetterQueueDTO}.
+     *
+     * @param deadLetterQueue
+     *
+     * @return
+     */
+    private static DeadLetterQueueDTO convertDeadLetterQueueDTO(DeadLetterQueue deadLetterQueue) {
+        if (deadLetterQueue == null) {
+            return null;
+        }
+        DeadLetterQueueDTO deadLetterQueueDTO = new DeadLetterQueueDTO();
+        deadLetterQueueDTO.setType(deadLetterQueue.getType());
+        deadLetterQueueDTO.setConfig(deadLetterQueue.getConfig());
+        return deadLetterQueueDTO;
+    }
+
+    /**
+     * convert {@link RetryStrategy} to {@link RetryStrategyDTO}.
+     *
+     * @param retryStrategy
+     *
+     * @return
+     */
+    private static RetryStrategyDTO convertRetryStrategyDTO(RetryStrategy retryStrategy) {
+        if (retryStrategy == null) {
+            return null;
+        }
+        RetryStrategyDTO retryStrategyDTO = new RetryStrategyDTO();
+        retryStrategyDTO.setPushRetryStrategy(
+            retryStrategy.getPushRetryStrategy() != null ? retryStrategy.getPushRetryStrategy()
+                .toString() : null);
+        retryStrategyDTO.setMaximumRetryAttempts(retryStrategy.getMaximumRetryAttempts());
+        retryStrategyDTO.setMaximumEventAgeInSeconds(retryStrategy.getMaximumEventAgeInSeconds());
+        return retryStrategyDTO;
+    }
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/format/BatchedCloudEventDeserializer.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/format/BatchedCloudEventDeserializer.java
new file mode 100644
index 0000000..1a5e764
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/format/BatchedCloudEventDeserializer.java
@@ -0,0 +1,214 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.converter.format;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+import com.fasterxml.jackson.databind.exc.MismatchedInputException;
+import com.fasterxml.jackson.databind.node.JsonNodeType;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.Lists;
+import io.cloudevents.CloudEvent;
+import io.cloudevents.CloudEventData;
+import io.cloudevents.SpecVersion;
+import io.cloudevents.core.builder.CloudEventBuilder;
+import io.cloudevents.core.data.BytesCloudEventData;
+import io.cloudevents.rw.CloudEventDataMapper;
+import io.cloudevents.rw.CloudEventRWException;
+import io.cloudevents.rw.CloudEventReader;
+import io.cloudevents.rw.CloudEventWriter;
+import io.cloudevents.rw.CloudEventWriterFactory;
+
+/**
+ * @author jingluo.sl
+ * <p>
+ * 2020-08-14 10:57
+ **/
+public class BatchedCloudEventDeserializer extends StdDeserializer<ArrayList<CloudEvent>> {
+
+    protected BatchedCloudEventDeserializer() {
+        super(new ObjectMapper().getTypeFactory()
+            .constructCollectionType(List.class, CloudEvent.class));
+    }
+
+    public static class JsonMessage implements CloudEventReader {
+
+        private final JsonParser p;
+        private final ObjectNode node;
+
+        public JsonMessage(JsonParser p, ObjectNode node) {
+            this.p = p;
+            this.node = node;
+        }
+
+        @Override
+        public <T extends CloudEventWriter<V>, V> V read(CloudEventWriterFactory<T, V> writerFactory)
+            throws CloudEventRWException, IllegalStateException {
+            try {
+                SpecVersion specVersion = SpecVersion.parse(getStringNode(this.node, this.p, "specversion"));
+                CloudEventWriter<V> visitor = writerFactory.create(specVersion);
+
+                // Read mandatory attributes
+                for (String attr : specVersion.getMandatoryAttributes()) {
+                    if (!"specversion".equals(attr)) {
+                        visitor.withContextAttribute(attr, getStringNode(this.node, this.p, attr));
+                    }
+                }
+
+                // Parse datacontenttype if any
+                String contentType = getOptionalStringNode(this.node, this.p, "datacontenttype");
+                if (contentType != null) {
+                    visitor.withContextAttribute("datacontenttype", contentType);
+                }
+
+                // Read optional attributes
+                for (String attr : specVersion.getOptionalAttributes()) {
+                    if (!"datacontentencoding".equals(attr)) { // Skip datacontentencoding, we need it later
+                        String val = getOptionalStringNode(this.node, this.p, attr);
+                        if (val != null) {
+                            visitor.withContextAttribute(attr, val);
+                        }
+                    }
+                }
+
+                byte[] data = null;
+                // Now let's handle the data
+                if (node.has("data_base64") && node.has("data")) {
+                    throw MismatchedInputException.from(p, CloudEvent.class,
+                        "CloudEvent cannot have both 'data' and 'data_base64' fields");
+                }
+                if (node.has("data_base64")) {
+                    data = node.remove("data_base64")
+                        .binaryValue();
+                } else if (node.has("data")) {
+                    if (BatchedJsonFormat.dataIsJsonContentType(contentType)) {
+                        // This solution is quite bad, but i see no alternatives now.
+                        // Hopefully in future we can improve it
+                        data = node.remove("data")
+                            .toString()
+                            .getBytes();
+                    } else {
+                        JsonNode dataNode = node.remove("data");
+                        assertNodeType(dataNode, JsonNodeType.STRING, "data",
+                            "Because content type is not a json, only a string is accepted as data");
+                        data = dataNode.asText()
+                            .getBytes();
+                    }
+                }
+
+                // Now let's process the extensions
+                node.fields()
+                    .forEachRemaining(entry -> {
+                        String extensionName = entry.getKey();
+                        JsonNode extensionValue = entry.getValue();
+
+                        switch (extensionValue.getNodeType()) {
+                            case BOOLEAN:
+                                visitor.withContextAttribute(extensionName, extensionValue.booleanValue());
+                                break;
+                            case NUMBER:
+                                visitor.withContextAttribute(extensionName, extensionValue.numberValue());
+                                break;
+                            case STRING:
+                                visitor.withContextAttribute(extensionName, extensionValue.textValue());
+                                break;
+                            default:
+                                visitor.withContextAttribute(extensionName, extensionValue.toString());
+                        }
+
+                    });
+
+                if (data != null) {
+                    return visitor.end(new BytesCloudEventData(data));
+                }
+                return visitor.end();
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            } catch (IllegalArgumentException e) {
+                throw new RuntimeException(MismatchedInputException.from(this.p, CloudEvent.class, e.getMessage()));
+            }
+        }
+
+        @Override
+        public <W extends CloudEventWriter<R>, R> R read(CloudEventWriterFactory<W, R> cloudEventWriterFactory,
+            CloudEventDataMapper<? extends CloudEventData> cloudEventDataMapper) throws CloudEventRWException {
+            return null;
+        }
+
+
+        private String getStringNode(ObjectNode objNode, JsonParser p, String attributeName)
+            throws JsonProcessingException {
+            String val = getOptionalStringNode(objNode, p, attributeName);
+            if (val == null) {
+                throw MismatchedInputException.from(p, CloudEvent.class,
+                    "Missing mandatory " + attributeName + " attribute");
+            }
+            return val;
+        }
+
+        private String getOptionalStringNode(ObjectNode objNode, JsonParser p, String attributeName)
+            throws JsonProcessingException {
+            JsonNode unparsedSpecVersion = objNode.remove(attributeName);
+            if (unparsedSpecVersion == null) {
+                return null;
+            }
+            assertNodeType(unparsedSpecVersion, JsonNodeType.STRING, attributeName, null);
+            return unparsedSpecVersion.asText();
+        }
+
+        private void assertNodeType(JsonNode node, JsonNodeType type, String attributeName, String desc)
+            throws JsonProcessingException {
+            if (node.getNodeType() != type) {
+                throw MismatchedInputException.from(p, CloudEvent.class,
+                    "Wrong type " + node.getNodeType() + " for attribute " + attributeName + ", expecting " + type + (
+                        desc != null ? ". " + desc : ""));
+            }
+        }
+    }
+
+    @Override
+    public ArrayList<CloudEvent> deserialize(JsonParser p, DeserializationContext ctxt)
+        throws IOException, JsonProcessingException {
+        JavaType javaType = new ObjectMapper().getTypeFactory()
+            .constructCollectionType(List.class, ObjectNode.class);
+        List<ObjectNode> nodeList = ctxt.readValue(p, javaType);
+        ArrayList<CloudEvent> cloudEventList = Lists.newArrayList();
+        try {
+            for (ObjectNode node : nodeList) {
+                CloudEvent cloudEvent = new JsonMessage(p, node).read(CloudEventBuilder::fromSpecVersion);
+                cloudEventList.add(cloudEvent);
+            }
+        } catch (RuntimeException e) {
+            // Yeah this is bad but it's needed to support checked exceptions...
+            if (e.getCause() instanceof IOException) {
+                throw (IOException)e.getCause();
+            }
+            throw MismatchedInputException.wrapWithPath(e, null);
+        }
+        return cloudEventList;
+    }
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/format/BatchedCloudEventSerializer.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/format/BatchedCloudEventSerializer.java
new file mode 100644
index 0000000..bdb6dd6
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/format/BatchedCloudEventSerializer.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.rocketmq.eventbridge.adapter.api.converter.format;
+
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+import javax.ws.rs.core.MediaType;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+import com.google.common.base.Strings;
+import io.cloudevents.CloudEvent;
+import io.cloudevents.core.data.BytesCloudEventData;
+import org.springframework.util.CollectionUtils;
+
+/**
+ * @author jingluo.sl
+ * <p>
+ * 2020-08-14 10:57
+ **/
+public class BatchedCloudEventSerializer extends StdSerializer<ArrayList<CloudEvent>> {
+
+    private final boolean forceDataBase64Serialization;
+    private final boolean forceStringSerialization;
+
+    protected BatchedCloudEventSerializer(boolean forceDataBase64Serialization, boolean forceStringSerialization) {
+        super(new ObjectMapper().getTypeFactory()
+            .constructCollectionType(List.class, CloudEvent.class));
+        this.forceDataBase64Serialization = forceDataBase64Serialization;
+        this.forceStringSerialization = forceStringSerialization;
+    }
+
+    private boolean shouldSerializeBase64(String contentType) {
+        if (BatchedJsonFormat.dataIsJsonContentType(contentType)) {
+            return this.forceDataBase64Serialization;
+        } else {
+            return !this.forceStringSerialization;
+        }
+    }
+
+    @Override
+    public void serialize(ArrayList<CloudEvent> events, JsonGenerator gen, SerializerProvider provider)
+        throws IOException {
+        if (CollectionUtils.isEmpty(events)) {
+            return;
+        }
+        gen.writeStartArray();
+        for (CloudEvent value : events) {
+            gen.writeStartObject();
+            // Serialize attributes
+            if (!Strings.isNullOrEmpty(value.getId())) {
+                gen.writeStringField("id", value.getId());
+            }
+            if (value.getSource() != null && value.getSource()
+                .toString()
+                .length() > 0) {
+                gen.writeStringField("source", String.valueOf(value.getSource()));
+            }
+            if (value.getSpecVersion() != null) {
+                gen.writeStringField("specversion", value.getSpecVersion()
+                    .toString());
+            }
+            if (!Strings.isNullOrEmpty(value.getType())) {
+                gen.writeStringField("type", value.getType());
+            }
+
+            if (!Strings.isNullOrEmpty(value.getDataContentType())) {
+                gen.writeStringField("datacontenttype", value.getDataContentType());
+            }
+
+            if (value.getDataSchema() != null) {
+                gen.writeStringField("dataschema", String.valueOf(value.getDataSchema()));
+            }
+
+            if (!Strings.isNullOrEmpty(value.getSubject())) {
+                gen.writeStringField("subject", value.getSubject());
+            }
+            if (value.getTime() != null) {
+                gen.writeStringField("time", value.getTime()
+                    .toString());
+            }
+
+            // Serialize extend attributes
+            for (String name : value.getExtensionNames()) {
+                gen.writeStringField(name, String.valueOf(value.getExtension(name)));
+            }
+
+            // Serialize data
+            byte[] data = ((BytesCloudEventData)(value.getData())).toBytes();
+            String contentType = value.getDataContentType();
+            if (data != null) {
+                if (shouldSerializeBase64(contentType)) {
+                    gen.writeFieldName("data_base64");
+                    gen.writeBinary(data);
+                } else if (BatchedJsonFormat.dataIsJsonContentType(contentType)) {
+                    String charsetStr = MediaType.valueOf(contentType)
+                        .getParameters()
+                        .get(MediaType.CHARSET_PARAMETER);
+                    Charset charset = Strings.isNullOrEmpty(charsetStr) ? StandardCharsets.UTF_8 : Charset.forName(
+                        charsetStr);
+                    char[] dataAsString = new String(data, charset).toCharArray();
+                    gen.writeFieldName("data");
+                    gen.writeRawValue(dataAsString, 0, dataAsString.length);
+                } else {
+                    gen.writeFieldName("data");
+                    gen.writeUTF8String(data, 0, data.length);
+                }
+            }
+            gen.writeEndObject();
+        }
+        gen.writeEndArray();
+    }
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/format/BatchedJsonFormat.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/format/BatchedJsonFormat.java
new file mode 100644
index 0000000..4c0ed37
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/converter/format/BatchedJsonFormat.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.converter.format;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import io.cloudevents.CloudEvent;
+import org.apache.rocketmq.eventbridge.exception.EventBridgeException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BatchedJsonFormat {
+
+    public static final String CONTENT_TYPE = "application/cloudevents-batch+json";
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(BatchedJsonFormat.class);
+
+    private final ObjectMapper mapper;
+    private final boolean forceDataBase64Serialization;
+    private final boolean forceStringSerialization;
+    private final JavaType type;
+
+    public BatchedJsonFormat(boolean forceDataBase64Serialization, boolean forceStringSerialization) {
+        this.mapper = new ObjectMapper();
+        this.type = mapper.getTypeFactory()
+            .constructCollectionType(ArrayList.class, CloudEvent.class);
+        this.mapper.registerModule(getCloudEventJacksonModule(forceDataBase64Serialization, forceStringSerialization));
+        this.forceDataBase64Serialization = forceDataBase64Serialization;
+        this.forceStringSerialization = forceStringSerialization;
+    }
+
+    public BatchedJsonFormat() {
+        this(false, false);
+    }
+
+    /**
+     * @return a copy of this JsonFormat that serialize events with json data with Base64 encoding
+     */
+    public BatchedJsonFormat withForceJsonDataToBase64() {
+        return new BatchedJsonFormat(true, this.forceStringSerialization);
+    }
+
+    /**
+     * @return a copy of this JsonFormat that serialize events with non-json data as string
+     */
+    public BatchedJsonFormat withForceNonJsonDataToString() {
+        return new BatchedJsonFormat(this.forceDataBase64Serialization, true);
+    }
+
+    public byte[] serialize(List<CloudEvent> event) {
+        try {
+            return mapper.writeValueAsBytes(event);
+        } catch (JsonProcessingException e) {
+            throw new EventBridgeException("serialize event failed.");
+        }
+    }
+
+    public List<CloudEvent> deserialize(byte[] bytes){
+        try {
+            return mapper.readValue(bytes, type);
+        } catch (IOException e) {
+            throw new EventBridgeException("serialize event failed.");
+        }
+    }
+
+    public String serializedContentType() {
+        return CONTENT_TYPE;
+    }
+
+    /**
+     * @return a JacksonModule with CloudEvent serializer/deserializer with default values
+     */
+    public static SimpleModule getCloudEventJacksonModule() {
+        return getCloudEventJacksonModule(false, false);
+    }
+
+    /**
+     * @return a JacksonModule with CloudEvent serializer/deserializer customizing the data serialization. Look at
+     * {@link #withForceJsonDataToBase64()} and {@link #withForceNonJsonDataToString()} for more details.
+     */
+    public static SimpleModule getCloudEventJacksonModule(boolean forceDataBase64Serialization,
+        boolean forceStringSerialization) {
+        final SimpleModule ceModule = new SimpleModule("CloudEvent");
+        ceModule.addDeserializer(ArrayList.class, new BatchedCloudEventDeserializer());
+        ceModule.addSerializer(new BatchedCloudEventSerializer(forceDataBase64Serialization, forceStringSerialization));
+        return ceModule;
+    }
+
+    protected static boolean dataIsJsonContentType(String contentType) {
+        // If content type, spec states that we should assume is json
+        return contentType == null || contentType.startsWith("application/json") || contentType.startsWith("text/json");
+    }
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/BaseDTO.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/BaseDTO.java
new file mode 100644
index 0000000..585d9b0
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/BaseDTO.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto;
+
+import java.io.Serializable;
+
+public class BaseDTO implements Serializable {
+    private static final long serialVersionUID = -1L;
+
+    public BaseDTO() {
+    }
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/BaseRequest.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/BaseRequest.java
new file mode 100644
index 0000000..cd74e06
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/BaseRequest.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto;
+
+import com.google.gson.annotations.SerializedName;
+
+public class BaseRequest extends BaseDTO {
+
+    @SerializedName("RequestId")
+    public String requestId;
+
+
+    public BaseRequest() {
+    }
+
+    public BaseRequest(String requestId, String accountId, String parentAccountId, String resourceAccountId) {
+        this.requestId = requestId;
+    }
+
+    public String getRequestId() {
+        return requestId;
+    }
+
+    public void setRequestId(String requestId) {
+        this.requestId = requestId;
+    }
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/BaseResponse.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/BaseResponse.java
new file mode 100644
index 0000000..4034a8a
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/BaseResponse.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto;
+
+import java.util.UUID;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+public @Data
+class BaseResponse extends BaseDTO {
+
+    public String requestId = UUID.randomUUID()
+        .toString();
+    public String code;
+    public String message;
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/CreateEventBusRequest.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/CreateEventBusRequest.java
new file mode 100644
index 0000000..cbba8f1
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/CreateEventBusRequest.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.bus;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseRequest;
+
+public @Data
+class CreateEventBusRequest extends BaseRequest {
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("Description")
+    private String description;
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/CreateEventBusResponse.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/CreateEventBusResponse.java
new file mode 100644
index 0000000..dcf2c75
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/CreateEventBusResponse.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.bus;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseResponse;
+
+@AllArgsConstructor
+public @Data
+class CreateEventBusResponse extends BaseResponse {
+
+    @SerializedName("EventBusName")
+    private String eventBusName;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/DeleteEventBusRequest.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/DeleteEventBusRequest.java
new file mode 100644
index 0000000..42a3363
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/DeleteEventBusRequest.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.bus;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseRequest;
+
+public @Data
+class DeleteEventBusRequest extends BaseRequest {
+    @SerializedName("EventBusName")
+    private String EventBusName;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/DeleteEventBusResponse.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/DeleteEventBusResponse.java
new file mode 100644
index 0000000..9b87dfd
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/DeleteEventBusResponse.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.bus;
+
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseResponse;
+
+public @Data
+class DeleteEventBusResponse extends BaseResponse {
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/EventBusDTO.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/EventBusDTO.java
new file mode 100644
index 0000000..e7cca12
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/EventBusDTO.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.bus;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseDTO;
+
+public @Data
+class EventBusDTO extends BaseDTO {
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("Description")
+    private String description;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/GetEventBusRequest.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/GetEventBusRequest.java
new file mode 100644
index 0000000..89ed8c2
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/GetEventBusRequest.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.bus;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseRequest;
+
+public @Data
+class GetEventBusRequest extends BaseRequest {
+    @SerializedName("EventBusName")
+    private String EventBusName;
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/GetEventBusResponse.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/GetEventBusResponse.java
new file mode 100644
index 0000000..6cf48d6
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/GetEventBusResponse.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.bus;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseResponse;
+
+@Builder
+@AllArgsConstructor
+public @Data class GetEventBusResponse extends BaseResponse {
+
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("Description")
+    private String description;
+
+    @SerializedName("CreateTimestamp")
+    private Long createTimestamp;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/ListEventBusesRequest.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/ListEventBusesRequest.java
new file mode 100644
index 0000000..2ff5ba2
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/ListEventBusesRequest.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.bus;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseRequest;
+
+public @Data
+class ListEventBusesRequest extends BaseRequest {
+
+    @SerializedName("NextToken")
+    private String nextToken;
+
+    @SerializedName("MaxResults")
+    private int maxResults;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/ListEventBusesResponse.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/ListEventBusesResponse.java
new file mode 100644
index 0000000..3aa55c6
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/bus/ListEventBusesResponse.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.bus;
+
+import java.util.List;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseResponse;
+
+@AllArgsConstructor
+public @Data
+class ListEventBusesResponse extends BaseResponse {
+    @SerializedName("EventBuses")
+    private List<EventBusDTO> eventBuses;
+
+    @SerializedName("NextToken")
+    private String nextToken;
+
+    @SerializedName("Total")
+    private Integer total;
+
+    @SerializedName("MaxResults")
+    private int maxResults;
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/data/EventDTO.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/data/EventDTO.java
new file mode 100644
index 0000000..f12c310
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/data/EventDTO.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rocketmq.eventbridge.adapter.api.dto.data;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseDTO;
+
+public @Data
+class EventDTO extends BaseDTO {
+    @SerializedName("Id")
+    private String id;
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/data/PutEventsRequest.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/data/PutEventsRequest.java
new file mode 100644
index 0000000..e3d5793
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/data/PutEventsRequest.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.data;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseRequest;
+
+public @Data
+class PutEventsRequest extends BaseRequest {
+
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("EventRuleName")
+    private String eventRuleName;
+
+    @SerializedName("Description")
+    private String description;
+
+    @SerializedName("FilterPattern")
+    private String filterPattern;
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/data/PutEventsResponse.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/data/PutEventsResponse.java
new file mode 100644
index 0000000..00d43ee
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/data/PutEventsResponse.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.rocketmq.eventbridge.adapter.api.dto.data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.google.gson.annotations.SerializedName;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseResponse;
+import org.apache.rocketmq.eventbridge.domain.model.data.PutEventsResponseEntry;
+
+public class PutEventsResponse extends BaseResponse {
+
+    @SerializedName("FailedEntryCount")
+    private int failedEntryCount;
+
+    @SerializedName("EntryList")
+    private List<PutEventsResponseEntry> entryList = new ArrayList<>();
+
+    public int getFailedEntryCount() {
+        return failedEntryCount;
+    }
+
+    public void setFailedEntryCount(int failedEntryCount) {
+        this.failedEntryCount = failedEntryCount;
+    }
+
+    public List<PutEventsResponseEntry> getEntryList() {
+        return entryList;
+    }
+
+    public void setEntryList(List<PutEventsResponseEntry> entryList) {
+        this.entryList = entryList;
+    }
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/CreateRuleRequest.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/CreateRuleRequest.java
new file mode 100644
index 0000000..923fb28
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/CreateRuleRequest.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.rule;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseRequest;
+
+public @Data
+class CreateRuleRequest extends BaseRequest {
+
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("EventRuleName")
+    private String eventRuleName;
+
+    @SerializedName("Description")
+    private String description;
+
+    @SerializedName("FilterPattern")
+    private String filterPattern;
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/CreateRuleResponse.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/CreateRuleResponse.java
new file mode 100644
index 0000000..f863591
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/CreateRuleResponse.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.rule;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseResponse;
+
+@AllArgsConstructor
+public @Data
+class CreateRuleResponse extends BaseResponse {
+
+    @SerializedName("EventRuleName")
+    private String eventRuleName;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/DeleteRuleRequest.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/DeleteRuleRequest.java
new file mode 100644
index 0000000..069d86e
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/DeleteRuleRequest.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.rule;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseRequest;
+
+public @Data
+class DeleteRuleRequest extends BaseRequest {
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("EventRuleName")
+    private String eventRuleName;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/DeleteRuleResponse.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/DeleteRuleResponse.java
new file mode 100644
index 0000000..aaead84
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/DeleteRuleResponse.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.rule;
+
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseResponse;
+
+public class DeleteRuleResponse extends BaseResponse {
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/DisableRuleRequest.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/DisableRuleRequest.java
new file mode 100644
index 0000000..27fa4da
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/DisableRuleRequest.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.rule;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseRequest;
+
+public @Data
+class DisableRuleRequest extends BaseRequest {
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("EventRuleName")
+    private String eventRuleName;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/DisableRuleResponse.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/DisableRuleResponse.java
new file mode 100644
index 0000000..ab2c8f9
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/DisableRuleResponse.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.rule;
+
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseResponse;
+
+public class DisableRuleResponse extends BaseResponse {
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/EnableRuleRequest.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/EnableRuleRequest.java
new file mode 100644
index 0000000..d5ea931
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/EnableRuleRequest.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.rule;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseRequest;
+
+public @Data
+class EnableRuleRequest extends BaseRequest {
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("EventRuleName")
+    private String eventRuleName;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/EnableRuleResponse.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/EnableRuleResponse.java
new file mode 100644
index 0000000..dd99a06
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/EnableRuleResponse.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.rule;
+
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseResponse;
+
+public class EnableRuleResponse extends BaseResponse {
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/EventRuleDTO.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/EventRuleDTO.java
new file mode 100644
index 0000000..7149901
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/EventRuleDTO.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.rocketmq.eventbridge.adapter.api.dto.rule;
+
+import java.util.Date;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Builder;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseDTO;
+
+@Builder
+public @Data
+class EventRuleDTO extends BaseDTO {
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("EventRuleName")
+    private String eventRuleName;
+
+    @SerializedName("Description")
+    private String description;
+
+    @SerializedName("FilterPattern")
+    private String filterPattern;
+
+    @SerializedName("Status")
+    private String status;
+
+    @SerializedName("GmtCreate")
+    private Date gmtCreate;
+
+    @SerializedName("GmtModify")
+    private Date gmtModify;
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/GetRuleRequest.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/GetRuleRequest.java
new file mode 100644
index 0000000..2e6095b
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/GetRuleRequest.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.rule;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseRequest;
+
+public @Data
+class GetRuleRequest extends BaseRequest {
+
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("EventRuleName")
+    private String eventRuleName;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/GetRuleResponse.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/GetRuleResponse.java
new file mode 100644
index 0000000..fa2e3b0
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/GetRuleResponse.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.rule;
+
+import java.util.Date;
+import java.util.List;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Builder;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseResponse;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.target.EventTargetDTO;
+
+@Builder
+public @Data
+class GetRuleResponse extends BaseResponse {
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("EventRuleName")
+    private String eventRuleName;
+
+    @SerializedName("Description")
+    private String description;
+
+    @SerializedName("FilterPattern")
+    private String filterPattern;
+
+    @SerializedName("Status")
+    private String status;
+
+    @SerializedName("GmtCreate")
+    private Date gmtCreate;
+
+    @SerializedName("GmtModify")
+    private Date gmtModify;
+
+    @SerializedName("EventTargets")
+    private List<EventTargetDTO> eventTargets;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/ListRulesRequest.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/ListRulesRequest.java
new file mode 100644
index 0000000..6328d48
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/ListRulesRequest.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.rule;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseRequest;
+
+public @Data
+class ListRulesRequest extends BaseRequest {
+
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("NextToken")
+    private String nextToken;
+
+    @SerializedName("MaxResults")
+    private int maxResults;
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/ListRulesResponse.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/ListRulesResponse.java
new file mode 100644
index 0000000..f0cee9e
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/ListRulesResponse.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.rule;
+
+import java.util.List;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseResponse;
+
+@AllArgsConstructor
+public @Data
+class ListRulesResponse extends BaseResponse {
+    @SerializedName("EventRules")
+    private List<EventRuleDTO> eventRules;
+
+    @SerializedName("NextToken")
+    private String nextToken;
+
+    @SerializedName("Total")
+    private Integer total;
+
+    @SerializedName("MaxResults")
+    private int maxResults;
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/UpdateRuleRequest.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/UpdateRuleRequest.java
new file mode 100644
index 0000000..3e35fcb
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/UpdateRuleRequest.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.rule;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseRequest;
+
+public @Data
+class UpdateRuleRequest extends BaseRequest {
+
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("EventRuleName")
+    private String eventRuleName;
+
+    @SerializedName("Description")
+    private String description;
+
+    @SerializedName("FilterPattern")
+    private String filterPattern;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/UpdateRuleResponse.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/UpdateRuleResponse.java
new file mode 100644
index 0000000..da0c393
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/rule/UpdateRuleResponse.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.rule;
+
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseResponse;
+
+public class UpdateRuleResponse extends BaseResponse {
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/CreateEventSourceRequest.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/CreateEventSourceRequest.java
new file mode 100644
index 0000000..e245d21
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/CreateEventSourceRequest.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.source;
+
+import java.util.Map;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseRequest;
+
+public @Data
+class CreateEventSourceRequest extends BaseRequest {
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("EventSourceName")
+    private String eventSourceName;
+
+    @SerializedName("Description")
+    private String description;
+
+    @SerializedName("ClassName")
+    private String className;
+
+    @SerializedName("Config")
+    private Map<String, Object> config;
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/CreateEventSourceResponse.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/CreateEventSourceResponse.java
new file mode 100644
index 0000000..731a1f9
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/CreateEventSourceResponse.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.source;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseResponse;
+
+@AllArgsConstructor
+public @Data
+class CreateEventSourceResponse extends BaseResponse {
+    @SerializedName("EventSourceName")
+    private String eventSourceName;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/DeleteEventSourceRequest.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/DeleteEventSourceRequest.java
new file mode 100644
index 0000000..aa6542d
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/DeleteEventSourceRequest.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.source;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseRequest;
+
+public @Data
+class DeleteEventSourceRequest extends BaseRequest {
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("EventSourceName")
+    private String eventSourceName;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/DeleteEventSourceResponse.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/DeleteEventSourceResponse.java
new file mode 100644
index 0000000..9eaac6f
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/DeleteEventSourceResponse.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.source;
+
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseResponse;
+
+public class DeleteEventSourceResponse extends BaseResponse {
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/EventSourceDTO.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/EventSourceDTO.java
new file mode 100644
index 0000000..d5166eb
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/EventSourceDTO.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rocketmq.eventbridge.adapter.api.dto.source;
+
+import java.util.Date;
+import java.util.Map;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Builder;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseDTO;
+
+@Builder
+public @Data
+class EventSourceDTO extends BaseDTO {
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("EventSourceName")
+    private String eventSourceName;
+
+    @SerializedName("Description")
+    private String description;
+
+    @SerializedName("ClassName")
+    private String className;
+
+    @SerializedName("Config")
+    private Map<String, Object> config;
+
+    @SerializedName("GmtCreate")
+    private Date gmtCreate;
+
+    @SerializedName("GmtModify")
+    private Date gmtModify;
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/GetEventSourceRequest.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/GetEventSourceRequest.java
new file mode 100644
index 0000000..94fbafe
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/GetEventSourceRequest.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.source;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseRequest;
+
+public @Data
+class GetEventSourceRequest extends BaseRequest {
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("EventSourceName")
+    private String eventSourceName;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/GetEventSourceResponse.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/GetEventSourceResponse.java
new file mode 100644
index 0000000..ce7042a
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/GetEventSourceResponse.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.source;
+
+import java.util.Map;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseResponse;
+
+@AllArgsConstructor
+public @Data
+class GetEventSourceResponse extends BaseResponse {
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("EventSourceName")
+    private String eventSourceName;
+
+    @SerializedName("Description")
+    private String description;
+
+    @SerializedName("ClassName")
+    private String className;
+
+    @SerializedName("Config")
+    private Map<String, Object> config;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/ListEventSourcesRequest.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/ListEventSourcesRequest.java
new file mode 100644
index 0000000..e4c4148
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/ListEventSourcesRequest.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.source;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseRequest;
+
+public @Data
+class ListEventSourcesRequest extends BaseRequest {
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("EventSourceType")
+    private String eventSourceType;
+
+    @SerializedName("NextToken")
+    private String nextToken;
+
+    @SerializedName("MaxResults")
+    private int maxResults;
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/ListEventSourcesResponse.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/ListEventSourcesResponse.java
new file mode 100644
index 0000000..9b907ea
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/ListEventSourcesResponse.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.source;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseResponse;
+
+@AllArgsConstructor
+public @Data
+class ListEventSourcesResponse extends BaseResponse {
+    @SerializedName("EventSources")
+    private List<EventSourceDTO> eventSources = new ArrayList<>();
+
+    @SerializedName("NextToken")
+    private String nextToken;
+
+    @SerializedName("Total")
+    private Integer total;
+
+    @SerializedName("MaxResults")
+    private int maxResults;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/UpdateEventSourceRequest.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/UpdateEventSourceRequest.java
new file mode 100644
index 0000000..2c06cdd
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/UpdateEventSourceRequest.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.source;
+
+import java.util.Map;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseRequest;
+
+public @Data
+class UpdateEventSourceRequest extends BaseRequest {
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("EventSourceName")
+    private String eventSourceName;
+
+    @SerializedName("Description")
+    private String description;
+
+    @SerializedName("ClassName")
+    private String className;
+
+    @SerializedName("Config")
+    private Map<String, Object> config;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/UpdateEventSourceResponse.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/UpdateEventSourceResponse.java
new file mode 100644
index 0000000..ce7f0e8
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/source/UpdateEventSourceResponse.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.source;
+
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseResponse;
+
+public class UpdateEventSourceResponse extends BaseResponse {}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/CreateTargetsRequest.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/CreateTargetsRequest.java
new file mode 100644
index 0000000..61da83d
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/CreateTargetsRequest.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.target;
+
+import java.util.List;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseRequest;
+
+public @Data
+class CreateTargetsRequest extends BaseRequest {
+
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("EventRuleName")
+    private String eventRuleName;
+
+    @SerializedName("EventTargets")
+    private List<EventTargetDTO> eventTargets;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/CreateTargetsResponse.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/CreateTargetsResponse.java
new file mode 100644
index 0000000..47010e7
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/CreateTargetsResponse.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.target;
+
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseResponse;
+
+public class CreateTargetsResponse extends BaseResponse {}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/DeadLetterQueueDTO.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/DeadLetterQueueDTO.java
new file mode 100644
index 0000000..136890f
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/DeadLetterQueueDTO.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.target;
+
+import java.util.Map;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+public @Data
+class DeadLetterQueueDTO {
+
+    @SerializedName("Type")
+    private String type;
+
+    @SerializedName("Config")
+    private Map<String,Object> config;
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/DeleteTargetsRequest.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/DeleteTargetsRequest.java
new file mode 100644
index 0000000..6700c11
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/DeleteTargetsRequest.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.target;
+
+import java.util.List;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseRequest;
+
+public @Data
+class DeleteTargetsRequest extends BaseRequest {
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("EventRuleName")
+    private String eventRuleName;
+
+    @SerializedName("EventTargetNames")
+    private List<String> eventTargetNames;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/DeleteTargetsResponse.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/DeleteTargetsResponse.java
new file mode 100644
index 0000000..37d5cdf
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/DeleteTargetsResponse.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.target;
+
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseResponse;
+
+public class DeleteTargetsResponse extends BaseResponse {}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/EventTargetDTO.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/EventTargetDTO.java
new file mode 100644
index 0000000..05a61f6
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/EventTargetDTO.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rocketmq.eventbridge.adapter.api.dto.target;
+
+import java.util.Map;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseDTO;
+
+public @Data
+class EventTargetDTO extends BaseDTO {
+    @SerializedName("EventTargetName")
+    private String eventTargetName;
+
+    @SerializedName("ClassName")
+    private String className;
+
+    @SerializedName("Config")
+    private Map<String, Object> config;
+
+    @SerializedName("RunOptions")
+    private RunOptionsDTO runOptions;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/ListTargetsRequest.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/ListTargetsRequest.java
new file mode 100644
index 0000000..8dfb71d
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/ListTargetsRequest.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.target;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseRequest;
+
+public @Data
+class ListTargetsRequest extends BaseRequest {
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("EventRuleName")
+    private String eventRuleName;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/ListTargetsResponse.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/ListTargetsResponse.java
new file mode 100644
index 0000000..33b0924
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/ListTargetsResponse.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.target;
+
+import java.util.List;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseResponse;
+
+public @Data
+class ListTargetsResponse extends BaseResponse {
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("EventRuleName")
+    private String eventRuleName;
+
+    @SerializedName("EventTargets")
+    private List<EventTargetDTO> eventTargets;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/RetryStrategyDTO.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/RetryStrategyDTO.java
new file mode 100644
index 0000000..72324e4
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/RetryStrategyDTO.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.target;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+public @Data
+class RetryStrategyDTO {
+
+    @SerializedName("PushRetryStrategy")
+    private String pushRetryStrategy;
+
+    @SerializedName("MaximumEventAgeInSeconds")
+    private int maximumEventAgeInSeconds;
+
+    @SerializedName("MaximumRetryAttempts")
+    private int maximumRetryAttempts;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/RunOptionsDTO.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/RunOptionsDTO.java
new file mode 100644
index 0000000..c6b7e34
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/RunOptionsDTO.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rocketmq.eventbridge.adapter.api.dto.target;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseDTO;
+
+public @Data
+class RunOptionsDTO extends BaseDTO {
+
+    @SerializedName("ErrorsTolerance")
+    private String errorsTolerance;
+
+    @SerializedName("RetryStrategy")
+    private RetryStrategyDTO retryStrategy;
+
+    @SerializedName("DeadLetterQueue")
+    private DeadLetterQueueDTO deadLetterQueue;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/UpdateTargetsRequest.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/UpdateTargetsRequest.java
new file mode 100644
index 0000000..f5042c6
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/UpdateTargetsRequest.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.target;
+
+import java.util.List;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseRequest;
+
+public @Data
+class UpdateTargetsRequest extends BaseRequest {
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("EventRuleName")
+    private String eventRuleName;
+
+    @SerializedName("EventTargets")
+    private List<EventTargetDTO> eventTargets;
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/UpdateTargetsResponse.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/UpdateTargetsResponse.java
new file mode 100644
index 0000000..a26b4bd
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/target/UpdateTargetsResponse.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.target;
+
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseResponse;
+
+public class UpdateTargetsResponse extends BaseResponse {}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/type/EventTypeDTO.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/type/EventTypeDTO.java
new file mode 100644
index 0000000..c41af3f
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/type/EventTypeDTO.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rocketmq.eventbridge.adapter.api.dto.type;
+
+import java.util.Date;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Builder;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseDTO;
+
+@Builder
+public @Data
+class EventTypeDTO extends BaseDTO {
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("EventSourceName")
+    private String eventSourceName;
+
+    @SerializedName("EventTypeName")
+    private String eventTypeName;
+
+    @SerializedName("Description")
+    private String description;
+
+    @SerializedName("GmtCreate")
+    private Date gmtCreate;
+
+    @SerializedName("GmtModify")
+    private Date gmtModify;
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/type/ListEventTypesRequest.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/type/ListEventTypesRequest.java
new file mode 100644
index 0000000..8a9c847
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/type/ListEventTypesRequest.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.type;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseRequest;
+
+public @Data
+class ListEventTypesRequest extends BaseRequest {
+    @SerializedName("EventBusName")
+    private String eventBusName;
+
+    @SerializedName("EventSourceName")
+    private String eventSourceName;
+
+    @SerializedName("NextToken")
+    private String nextToken;
+
+    @SerializedName("MaxResults")
+    private int maxResults;
+
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/type/ListEventTypesResponse.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/type/ListEventTypesResponse.java
new file mode 100644
index 0000000..0c167ab
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/dto/type/ListEventTypesResponse.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.dto.type;
+
+import java.util.List;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.BaseResponse;
+
+@AllArgsConstructor
+public @Data
+class ListEventTypesResponse extends BaseResponse {
+    @SerializedName("EventTypes")
+    private List<EventTypeDTO> eventTypes;
+
+    @SerializedName("NextToken")
+    private String nextToken;
+
+    @SerializedName("Total")
+    private Integer total;
+
+    @SerializedName("MaxResults")
+    private int maxResults;
+}
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/handler/EventDataHandler.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/handler/EventDataHandler.java
new file mode 100644
index 0000000..be2a0e9
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/handler/EventDataHandler.java
@@ -0,0 +1,57 @@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ package org.apache.rocketmq.eventbridge.adapter.api.handler;
+
+ import java.util.List;
+
+ import org.apache.rocketmq.eventbridge.adapter.api.dto.data.PutEventsResponse;
+ import org.apache.rocketmq.eventbridge.domain.model.data.EventDataService;
+ import org.apache.rocketmq.eventbridge.domain.model.data.PutEventsResponseEntry;
+ import org.apache.rocketmq.eventbridge.event.EventBridgeEvent;
+ import org.apache.rocketmq.eventbridge.exception.code.DefaultErrorCode;
+ import org.springframework.beans.factory.annotation.Autowired;
+ import org.springframework.stereotype.Component;
+ import reactor.core.publisher.Flux;
+ import reactor.core.publisher.Mono;
+
+ @Component
+ public class EventDataHandler {
+
+     @Autowired
+     EventDataService eventDataService;
+
+     public Mono<PutEventsResponse> putEvents(String accountId, List<EventBridgeEvent> eventList) {
+        return Flux.fromIterable(eventList)
+             .flatMap(event -> {
+                 Mono<PutEventsResponseEntry> result = Mono.create(monoSink -> {
+                     eventDataService.putEvent(accountId, event, new ReactorPutEventCallback(monoSink));
+                 });
+                 return result;
+             }).collectList().map(putEventsResponseEntries -> {
+                PutEventsResponse putEventsResponse = new PutEventsResponse();
+             putEventsResponse.setEntryList(putEventsResponseEntries);
+             long failedEntryCount = putEventsResponseEntries.stream()
+                 .filter(putEventsResponseEntry -> !DefaultErrorCode.Success.getCode()
+                     .equals(putEventsResponseEntry.getErrorCode()))
+                 .count();
+             putEventsResponse.setFailedEntryCount(Long.valueOf(failedEntryCount)
+                 .intValue());
+             return putEventsResponse;
+         });
+     }
+
+ }
diff --git a/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/handler/ReactorPutEventCallback.java b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/handler/ReactorPutEventCallback.java
new file mode 100644
index 0000000..3d8f4f6
--- /dev/null
+++ b/adapter/api/src/main/java/org/apache/rocketmq/eventbridge/adapter/api/handler/ReactorPutEventCallback.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.handler;
+
+import org.apache.rocketmq.eventbridge.domain.model.data.PutEventCallback;
+import org.apache.rocketmq.eventbridge.domain.model.data.PutEventsResponseEntry;
+import reactor.core.publisher.MonoSink;
+
+public class ReactorPutEventCallback implements PutEventCallback {
+
+    private MonoSink monoSink;
+
+    public ReactorPutEventCallback(MonoSink monoSink) {
+        this.monoSink = monoSink;
+    }
+
+    @Override
+    public void endProcess(PutEventsResponseEntry entry) {
+        this.monoSink.success(entry);
+    }
+}
diff --git a/adapter/api/src/test/java/org/apache/rocketmq/eventbridge/adapter/api/converter/EventConverterAdapterTest.java b/adapter/api/src/test/java/org/apache/rocketmq/eventbridge/adapter/api/converter/EventConverterAdapterTest.java
new file mode 100644
index 0000000..365f710
--- /dev/null
+++ b/adapter/api/src/test/java/org/apache/rocketmq/eventbridge/adapter/api/converter/EventConverterAdapterTest.java
@@ -0,0 +1,121 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.converter;
+
+import java.net.URI;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import com.google.common.collect.Maps;
+import com.google.gson.Gson;
+import io.cloudevents.CloudEvent;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import static org.apache.http.protocol.HTTP.CONTENT_TYPE;
+
+@RunWith(MockitoJUnitRunner.class)
+public class EventConverterAdapterTest {
+    @InjectMocks
+    private EventConverterAdapter eventConverterAdapter;
+
+    @Before
+    public void before() {
+        eventConverterAdapter.getEventConverterList()
+            .add(new CloudEventBatchedConverter());
+        eventConverterAdapter.getEventConverterList()
+            .add(new CloudEventBinaryConverter());
+        eventConverterAdapter.getEventConverterList()
+            .add(new CloudEventStructuredConverter());
+    }
+
+    @Test
+    public void toEventsRequest_Binary() {
+        Map<String, String> headers = Maps.newHashMap();
+        headers.put(CONTENT_TYPE, "application/json");
+        headers.put("ce-id", UUID.randomUUID()
+            .toString());
+        headers.put("ce-source", "demo-source");
+        headers.put("ce-type", URI.create("demo:type")
+            .toString());
+        headers.put("ce-specversion", "1.0");
+        byte[] body = new String("{\n" + "\t\"a\":1,\n" + "\t\"b\":2\n" + "}").getBytes(StandardCharsets.UTF_8);
+        List<CloudEvent> cloudEventList = eventConverterAdapter.toEventsRequest(headers, body);
+        Assert.assertEquals(1, cloudEventList.size());
+        Assert.assertEquals("demo:type", cloudEventList.get(0)
+            .getType());
+    }
+
+    @Test
+    public void toEventsRequest_Structured() {
+        Map<String, String> headers = Maps.newHashMap();
+        headers.put(CONTENT_TYPE, "application/cloudevents+json");
+
+        Map<String, Object> cloudEvent = Maps.newHashMap();
+        cloudEvent.put("id", UUID.randomUUID()
+            .toString());
+        cloudEvent.put("source", "demo-source");
+        cloudEvent.put("type", URI.create("demo:type"));
+        cloudEvent.put("specversion", "1.0");
+        cloudEvent.put("data", "{\n" + "\t\"a\":1,\n" + "\t\"b\":2\n" + "}");
+        List<CloudEvent> cloudEventList = eventConverterAdapter.toEventsRequest(headers, new Gson().toJson(cloudEvent)
+            .getBytes(StandardCharsets.UTF_8));
+
+        Assert.assertEquals(1, cloudEventList.size());
+        Assert.assertEquals("demo:type", cloudEventList.get(0)
+            .getType());
+    }
+
+    @Test
+    public void toEventsRequest_Batched() {
+        Map<String, String> headers = Maps.newHashMap();
+        headers.put(CONTENT_TYPE, "application/cloudevents-batch+json");
+
+        Map<String, Object> cloudEvent1 = Maps.newHashMap();
+        cloudEvent1.put("id", UUID.randomUUID()
+            .toString());
+        cloudEvent1.put("source", "demo-source");
+        cloudEvent1.put("type", URI.create("demo:type"));
+        cloudEvent1.put("specversion", "1.0");
+        cloudEvent1.put("data", "{\n" + "\t\"a\":1,\n" + "\t\"b\":2\n" + "}");
+
+        Map<String, Object> cloudEvent2 = Maps.newHashMap();
+        cloudEvent2.put("id", UUID.randomUUID()
+            .toString());
+        cloudEvent2.put("source", "demo-source");
+        cloudEvent2.put("type", URI.create("demo:type"));
+        cloudEvent2.put("specversion", "1.0");
+        cloudEvent2.put("data", "{\n" + "\t\"a\":1,\n" + "\t\"b\":2\n" + "}");
+
+        List<CloudEvent> cloudEventList = eventConverterAdapter.toEventsRequest(headers,
+            new Gson().toJson(Arrays.asList(cloudEvent1, cloudEvent2))
+                .getBytes(StandardCharsets.UTF_8));
+
+        Assert.assertEquals(2, cloudEventList.size());
+        Assert.assertEquals("demo:type", cloudEventList.get(0)
+            .getType());
+    }
+
+}
\ No newline at end of file
diff --git a/adapter/api/src/test/java/org/apache/rocketmq/eventbridge/adapter/api/converter/EventTargetConverterTest.java b/adapter/api/src/test/java/org/apache/rocketmq/eventbridge/adapter/api/converter/EventTargetConverterTest.java
new file mode 100644
index 0000000..ff01d68
--- /dev/null
+++ b/adapter/api/src/test/java/org/apache/rocketmq/eventbridge/adapter/api/converter/EventTargetConverterTest.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rocketmq.eventbridge.adapter.api.converter;
+
+import java.util.Map;
+
+import com.google.common.collect.Maps;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.target.DeadLetterQueueDTO;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.target.EventTargetDTO;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.target.RetryStrategyDTO;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.target.RunOptionsDTO;
+import org.apache.rocketmq.eventbridge.domain.common.enums.ErrorToleranceEnum;
+import org.apache.rocketmq.eventbridge.domain.common.enums.PushRetryStrategyEnum;
+import org.apache.rocketmq.eventbridge.domain.model.run.DeadLetterQueue;
+import org.apache.rocketmq.eventbridge.domain.model.run.RetryStrategy;
+import org.apache.rocketmq.eventbridge.domain.model.target.EventTarget;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class EventTargetConverterTest {
+
+    @Test
+    public void convertEventTargetRunners() {
+
+    }
+
+    @Test
+    public void convertEventTargetRunner() {
+        EventTargetDTO eventTargetDTO = new EventTargetDTO();
+        eventTargetDTO.setEventTargetName("targetName");
+        Map<String, Object> config = Maps.newHashMap();
+        config.put("url", "http://127.0.0.1:7001/cloudevents");
+        eventTargetDTO.setConfig(config);
+        eventTargetDTO.setClassName("http");
+
+        RunOptionsDTO runOptionsDTO = new RunOptionsDTO();
+        runOptionsDTO.setErrorsTolerance("NONE");
+        runOptionsDTO.setDeadLetterQueue(this.buildDeadLetterQueueDTO());
+        runOptionsDTO.setRetryStrategy(this.buildRetryStrategyDTO());
+        eventTargetDTO.setRunOptions(runOptionsDTO);
+
+        EventTarget eventTarget = EventTargetConverter.convertEventTarget("123456", "bus", "rule", eventTargetDTO);
+
+        Assert.assertEquals(eventTarget.getAccountId(), "123456");
+        Assert.assertEquals(eventTarget.getEventBusName(), "bus");
+        Assert.assertEquals(eventTarget.getEventRuleName(), "rule");
+        Assert.assertEquals(eventTarget.getName(), eventTargetDTO.getEventTargetName());
+        Assert.assertEquals(eventTarget.getClassName(), eventTargetDTO.getClassName());
+        Assert.assertEquals(eventTarget.getConfig(), eventTargetDTO.getConfig());
+    }
+
+    @Test
+    public void convertRetryStrategy() {
+        RetryStrategyDTO retryStrategyDTO = buildRetryStrategyDTO();
+        RetryStrategy retryStrategy = EventTargetConverter.convertRetryStrategy(retryStrategyDTO);
+
+        Assert.assertEquals(PushRetryStrategyEnum.BACKOFF_RETRY, retryStrategy.getPushRetryStrategy());
+        Assert.assertEquals(retryStrategyDTO.getMaximumRetryAttempts(), retryStrategy.getMaximumRetryAttempts());
+        Assert.assertEquals(retryStrategyDTO.getMaximumEventAgeInSeconds(),
+            retryStrategy.getMaximumEventAgeInSeconds());
+    }
+
+    @Test
+    public void convertErrorTolerance() {
+        ErrorToleranceEnum errorToleranceEnum = EventTargetConverter.convertErrorTolerance("NONE");
+        Assert.assertEquals(ErrorToleranceEnum.NONE, errorToleranceEnum);
+    }
+
+    @Test
+    public void convertDeadLetterQueue() {
+        DeadLetterQueueDTO deadLetterQueueDTO = this.buildDeadLetterQueueDTO();
+        DeadLetterQueue deadLetterQueue = EventTargetConverter.convertDeadLetterQueue(deadLetterQueueDTO);
+        Assert.assertEquals(deadLetterQueue.getType(), deadLetterQueueDTO.getType());
+        Assert.assertEquals(deadLetterQueue.getConfig(), deadLetterQueueDTO.getConfig());
+    }
+
+    private RetryStrategyDTO buildRetryStrategyDTO() {
+        RetryStrategyDTO retryStrategyDTO = new RetryStrategyDTO();
+        retryStrategyDTO.setPushRetryStrategy("BACKOFF_RETRY");
+        retryStrategyDTO.setMaximumRetryAttempts(3);
+        retryStrategyDTO.setMaximumEventAgeInSeconds(4);
+        return retryStrategyDTO;
+    }
+
+    private DeadLetterQueueDTO buildDeadLetterQueueDTO() {
+        DeadLetterQueueDTO deadLetterQueueDTO = new DeadLetterQueueDTO();
+        deadLetterQueueDTO.setType("rocketmq");
+        Map<String, Object> config = Maps.newHashMap();
+        config.put("topic", "demo");
+        config.put("nameSrv", "127.0.01:9876");
+        deadLetterQueueDTO.setConfig(config);
+        return deadLetterQueueDTO;
+    }
+}
\ No newline at end of file
diff --git a/adapter/api/src/test/java/org/apache/rocketmq/eventbridge/adapter/api/converter/EventTargetDTOConverterTest.java b/adapter/api/src/test/java/org/apache/rocketmq/eventbridge/adapter/api/converter/EventTargetDTOConverterTest.java
new file mode 100644
index 0000000..9ad2a9f
--- /dev/null
+++ b/adapter/api/src/test/java/org/apache/rocketmq/eventbridge/adapter/api/converter/EventTargetDTOConverterTest.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.converter;
+
+import java.util.Collections;
+
+import org.apache.rocketmq.eventbridge.adapter.api.dto.target.EventTargetDTO;
+import org.apache.rocketmq.eventbridge.domain.common.enums.ErrorToleranceEnum;
+import org.apache.rocketmq.eventbridge.domain.common.enums.PushRetryStrategyEnum;
+import org.apache.rocketmq.eventbridge.domain.model.run.DeadLetterQueue;
+import org.apache.rocketmq.eventbridge.domain.model.run.RetryStrategy;
+import org.apache.rocketmq.eventbridge.domain.model.run.RunOptions;
+import org.apache.rocketmq.eventbridge.domain.model.run.EventTargetRunner;
+import org.apache.rocketmq.eventbridge.domain.model.target.EventTarget;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class EventTargetDTOConverterTest {
+
+    @Test
+    public void convert() {
+        RetryStrategy retryStrategy = RetryStrategy.builder()
+            .pushRetryStrategy(PushRetryStrategyEnum.BACKOFF_RETRY)
+            .maximumRetryAttempts(3)
+            .maximumEventAgeInSeconds(4)
+            .build();
+        DeadLetterQueue deadLetterQueue = DeadLetterQueue.builder()
+            .type("rocketmq")
+            .config(Collections.singletonMap("topic", "demo"))
+            .build();
+        RunOptions runOptions = RunOptions.builder()
+            .errorsTolerance(ErrorToleranceEnum.ALL)
+            .retryStrategy(retryStrategy)
+            .deadLetterQueue(deadLetterQueue)
+            .build();
+        EventTarget eventTarget = EventTarget.builder()
+            .eventBusName("bus")
+            .eventRuleName("rule")
+            .name("target")
+            .config(Collections.singletonMap("url", "http://127.0.0.1:7002/cloudevent"))
+            .className("http")
+            .runOptions(runOptions)
+            .build();
+
+        EventTargetDTO eventTargetDTO = EventTargetDTOConverter.convert(eventTarget);
+        Assert.assertEquals(eventTarget.getName(), eventTargetDTO.getEventTargetName());
+        Assert.assertEquals(eventTarget.getClassName(), eventTargetDTO.getClassName());
+        Assert.assertEquals(eventTarget.getConfig(), eventTargetDTO.getConfig());
+
+        Assert.assertEquals(eventTarget.getRunOptions()
+            .getErrorsTolerance()
+            .toString(), eventTargetDTO.getRunOptions()
+            .getErrorsTolerance());
+
+        Assert.assertEquals(eventTarget.getRunOptions()
+            .getRetryStrategy()
+            .getPushRetryStrategy()
+            .toString(), eventTargetDTO.getRunOptions()
+            .getRetryStrategy()
+            .getPushRetryStrategy());
+        Assert.assertEquals(eventTarget.getRunOptions()
+            .getRetryStrategy()
+            .getMaximumRetryAttempts(), eventTargetDTO.getRunOptions()
+            .getRetryStrategy()
+            .getMaximumRetryAttempts());
+        Assert.assertEquals(eventTarget.getRunOptions()
+            .getRetryStrategy()
+            .getMaximumEventAgeInSeconds(), eventTargetDTO.getRunOptions()
+            .getRetryStrategy()
+            .getMaximumEventAgeInSeconds());
+
+        Assert.assertEquals(eventTarget.getRunOptions()
+            .getDeadLetterQueue()
+            .getType(), eventTargetDTO.getRunOptions()
+            .getDeadLetterQueue()
+            .getType());
+        Assert.assertEquals(eventTarget.getRunOptions()
+            .getDeadLetterQueue()
+            .getConfig(), eventTargetDTO.getRunOptions()
+            .getDeadLetterQueue()
+            .getConfig());
+    }
+}
\ No newline at end of file
diff --git a/adapter/api/src/test/java/org/apache/rocketmq/eventbridge/adapter/api/handler/EventDataHandlerTest.java b/adapter/api/src/test/java/org/apache/rocketmq/eventbridge/adapter/api/handler/EventDataHandlerTest.java
new file mode 100644
index 0000000..46063a1
--- /dev/null
+++ b/adapter/api/src/test/java/org/apache/rocketmq/eventbridge/adapter/api/handler/EventDataHandlerTest.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.api.handler;
+
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import lombok.SneakyThrows;
+import org.apache.rocketmq.eventbridge.adapter.api.dto.data.PutEventsResponse;
+import org.apache.rocketmq.eventbridge.adapter.api.handler.EventDataHandler;
+import org.apache.rocketmq.eventbridge.adapter.api.handler.ReactorPutEventCallback;
+import org.apache.rocketmq.eventbridge.domain.model.data.EventDataService;
+import org.apache.rocketmq.eventbridge.domain.model.data.PutEventCallback;
+import org.apache.rocketmq.eventbridge.domain.model.data.PutEventsResponseEntry;
+import org.apache.rocketmq.eventbridge.event.EventBridgeEvent;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.MockitoJUnitRunner;
+import reactor.core.publisher.Mono;
+
+import static org.mockito.ArgumentMatchers.any;
+
+@RunWith(MockitoJUnitRunner.class)
+public class EventDataHandlerTest {
+    @InjectMocks
+    private EventDataHandler eventDataHandler;
+
+    @Mock
+    EventDataService eventDataService;
+
+    ExecutorService executor = Executors.newFixedThreadPool(10);
+
+    @Before
+    public void before() {
+        Mockito.doAnswer((invocation) -> {
+            Object[] args = invocation.getArguments();
+            EventBridgeEvent event = (EventBridgeEvent)args[1];
+            ReactorPutEventCallback callback = (ReactorPutEventCallback)args[2];
+            executor.submit(new PutEventTestThread(event, callback));
+            return null;
+        })
+            .when(eventDataService)
+            .putEvent(any(), any(), any());
+    }
+
+    @Test
+    public void testPutEvents() {
+        Long startTime = System.currentTimeMillis();
+        List<EventBridgeEvent> eventList = IntStream.range(0, 10)
+            .mapToObj(index -> {
+                EventBridgeEvent event = new EventBridgeEvent();
+                event.setId(UUID.randomUUID()
+                    .toString());
+                return event;
+            })
+            .collect(Collectors.toList());
+        Mono<PutEventsResponse> mono = eventDataHandler.putEvents("123456", eventList);
+        PutEventsResponse putEventsResponse = mono.block();
+        Long costTime = System.currentTimeMillis() - startTime;
+        Assert.assertEquals(10, putEventsResponse.getEntryList()
+            .size());
+        System.out.println("costTime:" + costTime);
+        Assert.assertEquals(true, costTime < 4000);
+    }
+
+    class PutEventTestThread implements Runnable {
+        EventBridgeEvent event;
+        PutEventCallback putEventCallback;
+
+        public PutEventTestThread(EventBridgeEvent event, PutEventCallback putEventCallback) {
+            this.event = event;
+            this.putEventCallback = putEventCallback;
+        }
+
+        @SneakyThrows
+        @Override
+        public void run() {
+            Thread.sleep(3000L);
+            PutEventsResponseEntry putEventsResponseEntry = new PutEventsResponseEntry();
+            putEventsResponseEntry.setEventId(event.getId());
+            if (System.currentTimeMillis() % 2 == 1) {
+                putEventsResponseEntry.setErrorCode("Success");
+            } else {
+                putEventsResponseEntry.setErrorCode("Failed.");
+            }
+
+            putEventCallback.endProcess(putEventsResponseEntry);
+        }
+    }
+
+}
diff --git a/adapter/persistence/pom.xml b/adapter/persistence/pom.xml
new file mode 100644
index 0000000..4ae50e3
--- /dev/null
+++ b/adapter/persistence/pom.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>rocketmq-eventbridge-adapter</artifactId>
+        <groupId>org.apache.rocketmq</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>rocketmq-eventbridge-adapter-persistence</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+
+    <properties>
+        <mysql-connector-java.version>5.1.42</mysql-connector-java.version>
+        <rocketmq.version>4.4.1.3-SNAPSHOT</rocketmq.version>
+        <flyway.version>8.5.7</flyway.version>
+    </properties>
+    <dependencies>
+        <!-- Project Modules -->
+        <dependency>
+            <groupId>org.apache.rocketmq</groupId>
+            <artifactId>rocketmq-eventbridge-domain</artifactId>
+        </dependency>
+        <!-- Framework -->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-autoconfigure</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>${mysql-connector-java.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.rocketmq</groupId>
+            <artifactId>rocketmq-client</artifactId>
+            <version>${rocketmq.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.rocketmq</groupId>
+            <artifactId>rocketmq-tools</artifactId>
+            <version>${rocketmq.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.flywaydb</groupId>
+            <artifactId>flyway-core</artifactId>
+            <version>${flyway.version}</version>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/PersistenceConfig.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/PersistenceConfig.java
new file mode 100644
index 0000000..8b70fb9
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/PersistenceConfig.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.persistence;
+
+import lombok.SneakyThrows;
+import org.apache.rocketmq.client.producer.DefaultMQProducer;
+import org.apache.rocketmq.tools.admin.DefaultMQAdminExt;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@MapperScan(basePackages = "org.apache.rocketmq.eventbridge.adapter.persistence.*.mybatis.*")
+public class PersistenceConfig {
+
+    @SneakyThrows
+    @Bean
+    public DefaultMQProducer defaultMQProducer(@Value("${rocketmq.namesrvAddr}") String namesrvAddr) {
+        DefaultMQProducer producer = new DefaultMQProducer("EventBridge");
+        producer.setNamesrvAddr(namesrvAddr);
+        producer.setInstanceName("EventBridge");
+        producer.start();
+        return producer;
+    }
+
+    @SneakyThrows
+    @Bean
+    public DefaultMQAdminExt defaultMQAdminExt(@Value("${rocketmq.namesrvAddr}") String namesrvAddr) {
+        DefaultMQAdminExt defaultMQAdminExt = new DefaultMQAdminExt();
+        defaultMQAdminExt.setNamesrvAddr(namesrvAddr);
+        defaultMQAdminExt.setAdminExtGroup("EventBridge");
+        defaultMQAdminExt.start();
+        return defaultMQAdminExt;
+    }
+
+}
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/bus/mybatis/mapper/EventBusMapper.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/bus/mybatis/mapper/EventBusMapper.java
new file mode 100644
index 0000000..27d4d72
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/bus/mybatis/mapper/EventBusMapper.java
@@ -0,0 +1,37 @@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ package org.apache.rocketmq.eventbridge.adapter.persistence.bus.mybatis.mapper;
+
+ import java.util.List;
+
+ import org.apache.ibatis.annotations.Param;
+ import org.apache.rocketmq.eventbridge.domain.model.bus.EventBus;
+
+ public interface EventBusMapper {
+
+     Integer createEventBus(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("description") String description);
+
+     int deleteEventBus(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName);
+
+     EventBus getEventBus(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName);
+
+     int getEventBusesCount(@Param("accountId") String accountId);
+
+     List<EventBus> listEventBuses(@Param("accountId") String accountId, @Param("nextToken") int nextToken,
+         @Param("maxResults") int maxResults);
+ }
\ No newline at end of file
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/bus/mybatis/repository/MybatisEventBusRepository.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/bus/mybatis/repository/MybatisEventBusRepository.java
new file mode 100644
index 0000000..7b996d2
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/bus/mybatis/repository/MybatisEventBusRepository.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.rocketmq.eventbridge.adapter.persistence.bus.mybatis.repository;
+
+ import java.util.List;
+
+ import org.apache.rocketmq.eventbridge.adapter.persistence.bus.mybatis.mapper.EventBusMapper;
+ import org.apache.rocketmq.eventbridge.domain.model.bus.EventBus;
+ import org.apache.rocketmq.eventbridge.domain.repository.EventBusRepository;
+ import org.springframework.stereotype.Repository;
+
+ @Repository
+ public class MybatisEventBusRepository implements EventBusRepository {
+
+     private EventBusMapper eventBusMapper;
+
+     public MybatisEventBusRepository(EventBusMapper eventBusMapper) {
+         this.eventBusMapper = eventBusMapper;
+     }
+
+     @Override
+     public boolean createEventBus(String accountId, String eventBusName, String description) {
+         return eventBusMapper.createEventBus(accountId, eventBusName, description) == 1;
+     }
+
+     @Override
+     public boolean deleteEventBus(String accountId, String eventBusName) {
+         return eventBusMapper.deleteEventBus(accountId, eventBusName) == 1;
+     }
+
+     @Override
+     public EventBus getEventBus(String accountId, String eventBusName) {
+         return eventBusMapper.getEventBus(accountId, eventBusName);
+     }
+
+     @Override
+     public int getEventBusesCount(String accountId) {
+         return eventBusMapper.getEventBusesCount(accountId);
+     }
+
+     @Override
+     public List<EventBus> listEventBuses(String accountId, String nextToken, int maxResults) {
+         return eventBusMapper.listEventBuses(accountId, Integer.parseInt(nextToken), maxResults);
+     }
+
+ }
\ No newline at end of file
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/converter/EventSourceClassConverter.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/converter/EventSourceClassConverter.java
new file mode 100644
index 0000000..d9867c9
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/converter/EventSourceClassConverter.java
@@ -0,0 +1,49 @@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ package org.apache.rocketmq.eventbridge.adapter.persistence.classes.mybatis.converter;
+
+ import java.lang.reflect.Type;
+ import java.util.Map;
+
+ import com.google.common.reflect.TypeToken;
+ import com.google.gson.Gson;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.classes.mybatis.dataobject.EventSourceClassDO;
+ import org.apache.rocketmq.eventbridge.domain.model.classes.APIAttribute;
+ import org.apache.rocketmq.eventbridge.domain.model.classes.EventSourceClass;
+
+ public class EventSourceClassConverter {
+
+     public static EventSourceClass convert(EventSourceClassDO eventSourceClassDO) {
+         if (eventSourceClassDO == null) {
+             return null;
+         }
+         Type mapType = new TypeToken<Map<String, Object>>() {}.getType();
+         Map<String, APIAttribute> apiParams = new Gson().fromJson(eventSourceClassDO.getApiParams(), mapType);
+         Map<String, Object> requiredParams = new Gson().fromJson(eventSourceClassDO.getRequiredParams(), mapType);
+         Map<String, Object> transformParams = new Gson().fromJson(eventSourceClassDO.getTransform(), mapType);
+         return EventSourceClass.builder()
+             .name(eventSourceClassDO.getName())
+             .apiParams(apiParams)
+             .requiredParams(requiredParams)
+             .transform(transformParams)
+             .visualConfig(eventSourceClassDO.getVisualConfig())
+             .description(eventSourceClassDO.getDescription())
+             .gmtCreate(eventSourceClassDO.getGmtCreate())
+             .gmtModify(eventSourceClassDO.getGmtModify())
+             .build();
+     }
+ }
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/converter/EventTargetClassConverter.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/converter/EventTargetClassConverter.java
new file mode 100644
index 0000000..f5da9b6
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/converter/EventTargetClassConverter.java
@@ -0,0 +1,49 @@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ package org.apache.rocketmq.eventbridge.adapter.persistence.classes.mybatis.converter;
+
+ import java.util.Map;
+
+ import com.google.common.reflect.TypeToken;
+ import com.google.gson.Gson;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.classes.mybatis.dataobject.EventTargetClassDO;
+ import org.apache.rocketmq.eventbridge.domain.model.classes.APIAttribute;
+ import org.apache.rocketmq.eventbridge.domain.model.classes.EventTargetClass;
+
+ public class EventTargetClassConverter {
+     public static EventTargetClass convert(EventTargetClassDO eventTargetClassDO) {
+         if (eventTargetClassDO == null) {
+             return null;
+         }
+         Map<String, APIAttribute> apiParams = new Gson().fromJson(eventTargetClassDO.getApiParams(),
+             new TypeToken<Map<String, APIAttribute>>() {}.getType());
+         Map<String, Object> requiredParams = new Gson().fromJson(eventTargetClassDO.getRequiredParams(),
+             new TypeToken<Map<String, Object>>() {}.getType());
+         Map<String, String> targetTransform = new Gson().fromJson(eventTargetClassDO.getTargetTransform(),
+             new TypeToken<Map<String, String>>() {}.getType());
+         return EventTargetClass.builder()
+             .name(eventTargetClassDO.getName())
+             .apiParams(apiParams)
+             .targetTransform(targetTransform)
+             .requiredParams(requiredParams)
+             .visualConfig(eventTargetClassDO.getVisualConfig())
+             .description(eventTargetClassDO.getDescription())
+             .gmtCreate(eventTargetClassDO.getGmtCreate())
+             .gmtModify(eventTargetClassDO.getGmtModify())
+             .build();
+     }
+ }
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/dataobject/EventSourceClassDO.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/dataobject/EventSourceClassDO.java
new file mode 100644
index 0000000..86a68b9
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/dataobject/EventSourceClassDO.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.persistence.classes.mybatis.dataobject;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+
+public @Data
+class EventSourceClassDO implements Serializable {
+
+    private static final long serialVersionUID = -1L;
+    private String name;
+    private String apiParams;
+    private String requiredParams;
+    private String transform;
+    private String visualConfig;
+    private String description;
+    private Date gmtCreate;
+    private Date gmtModify;
+}
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/dataobject/EventTargetClassDO.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/dataobject/EventTargetClassDO.java
new file mode 100644
index 0000000..2b90404
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/dataobject/EventTargetClassDO.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.persistence.classes.mybatis.dataobject;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+
+public @Data
+class EventTargetClassDO implements Serializable {
+
+    private static final long serialVersionUID = -1L;
+    private String name;
+    private String apiParams;
+    private String targetTransform;
+    private String requiredParams;
+    private String visualConfig;
+    private String description;
+    private Date gmtCreate;
+    private Date gmtModify;
+}
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/mapper/EventSourceClassMapper.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/mapper/EventSourceClassMapper.java
new file mode 100644
index 0000000..d2204fd
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/mapper/EventSourceClassMapper.java
@@ -0,0 +1,25 @@
+ /*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rocketmq.eventbridge.adapter.persistence.classes.mybatis.mapper;
+
+ import org.apache.ibatis.annotations.Param;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.classes.mybatis.dataobject.EventSourceClassDO;
+
+ public interface EventSourceClassMapper {
+
+    EventSourceClassDO getEventSourceClass(@Param("name") String name);
+}
\ No newline at end of file
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/mapper/EventTargetClassMapper.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/mapper/EventTargetClassMapper.java
new file mode 100644
index 0000000..df63ef1
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/mapper/EventTargetClassMapper.java
@@ -0,0 +1,27 @@
+ /*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rocketmq.eventbridge.adapter.persistence.classes.mybatis.mapper;
+
+ import org.apache.ibatis.annotations.Param;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.classes.mybatis.dataobject.EventTargetClassDO;
+
+ public interface EventTargetClassMapper {
+
+    EventTargetClassDO getEventTargetClass(@Param("name") String name);
+
+
+}
\ No newline at end of file
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/repository/MybatisEventSourceClassRepository.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/repository/MybatisEventSourceClassRepository.java
new file mode 100644
index 0000000..b49bf0d
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/repository/MybatisEventSourceClassRepository.java
@@ -0,0 +1,40 @@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ package org.apache.rocketmq.eventbridge.adapter.persistence.classes.mybatis.repository;
+
+ import org.apache.rocketmq.eventbridge.adapter.persistence.classes.mybatis.converter.EventSourceClassConverter;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.classes.mybatis.dataobject.EventSourceClassDO;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.classes.mybatis.mapper.EventSourceClassMapper;
+ import org.apache.rocketmq.eventbridge.domain.model.classes.EventSourceClass;
+ import org.apache.rocketmq.eventbridge.domain.repository.EventSourceClassRepository;
+ import org.springframework.stereotype.Repository;
+
+ @Repository
+ public class MybatisEventSourceClassRepository implements EventSourceClassRepository {
+
+     private final EventSourceClassMapper eventSourceClassMapper;
+
+     public MybatisEventSourceClassRepository(EventSourceClassMapper eventSourceClassMapper) {
+         this.eventSourceClassMapper = eventSourceClassMapper;
+     }
+
+     @Override
+     public EventSourceClass getEventSourceClass(String name) {
+         EventSourceClassDO eventSourceClassDO = eventSourceClassMapper.getEventSourceClass(name);
+         return EventSourceClassConverter.convert(eventSourceClassDO);
+     }
+ }
\ No newline at end of file
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/repository/MybatisEventTargetClassRepository.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/repository/MybatisEventTargetClassRepository.java
new file mode 100644
index 0000000..b184377
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/classes/mybatis/repository/MybatisEventTargetClassRepository.java
@@ -0,0 +1,40 @@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ package org.apache.rocketmq.eventbridge.adapter.persistence.classes.mybatis.repository;
+
+ import org.apache.rocketmq.eventbridge.adapter.persistence.classes.mybatis.converter.EventTargetClassConverter;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.classes.mybatis.dataobject.EventTargetClassDO;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.classes.mybatis.mapper.EventTargetClassMapper;
+ import org.apache.rocketmq.eventbridge.domain.model.classes.EventTargetClass;
+ import org.apache.rocketmq.eventbridge.domain.repository.EventTargetClassRepository;
+ import org.springframework.stereotype.Repository;
+
+ @Repository
+ public class MybatisEventTargetClassRepository implements EventTargetClassRepository {
+
+     private final EventTargetClassMapper eventTargetClassMapper;
+
+     public MybatisEventTargetClassRepository(EventTargetClassMapper eventTargetClassMapper) {
+         this.eventTargetClassMapper = eventTargetClassMapper;
+     }
+
+     @Override
+     public EventTargetClass getEventTargetClass(String name) {
+         EventTargetClassDO eventTargetClassDO = eventTargetClassMapper.getEventTargetClass(name);
+         return EventTargetClassConverter.convert(eventTargetClassDO);
+     }
+ }
\ No newline at end of file
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/data/mybatis/dataobject/EventTopicDO.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/data/mybatis/dataobject/EventTopicDO.java
new file mode 100644
index 0000000..f1e2fbc
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/data/mybatis/dataobject/EventTopicDO.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.persistence.data.mybatis.dataobject;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+
+public @Data
+class EventTopicDO implements Serializable {
+
+    private static final long serialVersionUID = -1L;
+    private String accountId;
+    private String eventBusName;
+    private String name;
+    private Long msgTtl;
+    private String cluster;
+    private Integer status;
+    private Date gmtCreate;
+    private Date gmtModify;
+}
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/data/mybatis/mapper/EventTopicMapper.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/data/mybatis/mapper/EventTopicMapper.java
new file mode 100644
index 0000000..10d3d3e
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/data/mybatis/mapper/EventTopicMapper.java
@@ -0,0 +1,31 @@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ package org.apache.rocketmq.eventbridge.adapter.persistence.data.mybatis.mapper;
+
+ import org.apache.ibatis.annotations.Param;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.data.mybatis.dataobject.EventTopicDO;
+
+ public interface EventTopicMapper {
+
+     Integer createTopic(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("topicName") String topicName, @Param("clusterName") String clusterName);
+
+     void deleteTopic(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName);
+
+     EventTopicDO getTopic(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName);
+
+ }
\ No newline at end of file
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/data/rocketmq/repository/BatchSendCallback.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/data/rocketmq/repository/BatchSendCallback.java
new file mode 100644
index 0000000..b06df49
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/data/rocketmq/repository/BatchSendCallback.java
@@ -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.
+ */
+
+///*
+// * Licensed to the Apache Software Foundation (ASF) under one or more
+// * contributor license agreements.  See the NOTICE file distributed with
+// * this work for additional information regarding copyright ownership.
+// * The ASF licenses this file to You under the Apache License, Version 2.0
+// * (the "License"); you may not use this file except in compliance with
+// * the License.  You may obtain a copy of the License at
+// *
+// *     http://www.apache.org/licenses/LICENSE-2.0
+// *
+// * Unless required by applicable law or agreed to in writing, software
+// * distributed under the License is distributed on an "AS IS" BASIS,
+// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// * See the License for the specific language governing permissions and
+// * limitations under the License.
+// */
+//
+//package org.apache.rocketmq.eventbridge.adapter.persistence.data.rocketmq.repository;
+//
+//import java.util.List;
+//
+//import org.apache.rocketmq.client.producer.SendResult;
+//
+//public class BatchSendCallback {
+//
+//    void onSuccess(List<SendResult> sendResultList){
+//
+//    }
+//
+//    void onException(Throwable var1);
+//}
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/data/rocketmq/repository/DefaultSendCallback.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/data/rocketmq/repository/DefaultSendCallback.java
new file mode 100644
index 0000000..3439f0e
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/data/rocketmq/repository/DefaultSendCallback.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.persistence.data.rocketmq.repository;
+
+import org.apache.rocketmq.client.producer.SendCallback;
+import org.apache.rocketmq.client.producer.SendResult;
+import org.apache.rocketmq.eventbridge.domain.model.data.PutEventCallback;
+import org.apache.rocketmq.eventbridge.domain.model.data.PutEventsResponseEntry;
+import org.apache.rocketmq.eventbridge.exception.code.DefaultErrorCode;
+
+public class DefaultSendCallback implements SendCallback {
+
+    PutEventCallback putEventCallback;
+
+    PutEventsResponseEntry entry = new PutEventsResponseEntry();
+
+    public DefaultSendCallback(PutEventCallback putEventCallback) {
+        this.putEventCallback = putEventCallback;
+    }
+
+    @Override
+    public void onSuccess(SendResult sendResult) {
+        entry.setEventId(sendResult.getMsgId());
+        entry.setErrorCode(DefaultErrorCode.Success.getCode());
+        putEventCallback.endProcess(entry);
+    }
+
+    @Override
+    public void onException(Throwable throwable) {
+        entry.setErrorCode(DefaultErrorCode.InternalError.getCode());
+        entry.setErrorMessage(throwable.getMessage());
+        putEventCallback.endProcess(entry);
+    }
+}
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/data/rocketmq/repository/RocketMQEventDataRepository.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/data/rocketmq/repository/RocketMQEventDataRepository.java
new file mode 100644
index 0000000..5ed6ace
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/data/rocketmq/repository/RocketMQEventDataRepository.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.persistence.data.rocketmq.repository;
+
+import com.google.gson.Gson;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.rocketmq.client.producer.DefaultMQProducer;
+import org.apache.rocketmq.common.message.Message;
+import org.apache.rocketmq.eventbridge.adapter.persistence.data.mybatis.dataobject.EventTopicDO;
+import org.apache.rocketmq.eventbridge.adapter.persistence.data.mybatis.mapper.EventTopicMapper;
+import org.apache.rocketmq.eventbridge.adapter.persistence.rpc.EventDataOnRocketMQConnectAPI;
+import org.apache.rocketmq.eventbridge.config.AppConfig;
+import org.apache.rocketmq.eventbridge.domain.common.exception.EventBridgeErrorCode;
+import org.apache.rocketmq.eventbridge.domain.model.data.PutEventCallback;
+import org.apache.rocketmq.eventbridge.domain.repository.EventDataRepository;
+import org.apache.rocketmq.eventbridge.event.EventBridgeEvent;
+import org.apache.rocketmq.eventbridge.exception.EventBridgeException;
+import org.apache.rocketmq.eventbridge.exception.code.DefaultErrorCode;
+import org.apache.rocketmq.tools.admin.DefaultMQAdminExt;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Repository;
+
+@Repository
+@Slf4j
+public class RocketMQEventDataRepository implements EventDataRepository {
+
+    private final EventDataOnRocketMQConnectAPI eventDataOnRocketMQConnectAPI;
+    private final EventTopicMapper eventTopicMapper;
+    private final DefaultMQProducer producer;
+    private final DefaultMQAdminExt defaultMQAdminExt;
+
+    @Value("${rocketmq.cluster.name:}")
+    private String clusterName;
+
+    public RocketMQEventDataRepository(EventDataOnRocketMQConnectAPI eventDataOnRocketMQConnectAPI,
+        EventTopicMapper eventTopicMapper, DefaultMQProducer producer, DefaultMQAdminExt defaultMQAdminExt) {
+        this.eventDataOnRocketMQConnectAPI = eventDataOnRocketMQConnectAPI;
+        this.eventTopicMapper = eventTopicMapper;
+        this.producer = producer;
+        this.defaultMQAdminExt = defaultMQAdminExt;
+    }
+
+    @Override
+    public boolean createEventBusPersistence(String accountId, String eventBusName) {
+        String topicName = eventDataOnRocketMQConnectAPI.buildTopicName(accountId, eventBusName);
+        try {
+            eventTopicMapper.createTopic(accountId, eventBusName, topicName, clusterName);
+            defaultMQAdminExt.createTopic(clusterName, topicName, 1);
+        } catch (Throwable e) {
+            log.error("Create event bus persistence failed.", e);
+            throw new EventBridgeException(DefaultErrorCode.InternalError, e);
+        }
+        return true;
+    }
+
+    @SneakyThrows
+    @Override
+    public boolean deleteEventBusPersistence(String accountId, String eventBusName) {
+        EventTopicDO eventTopicDO = eventTopicMapper.getTopic(accountId, eventBusName);
+        defaultMQAdminExt.deleteTopic(eventTopicDO.getName(), eventTopicDO.getCluster());
+        eventTopicMapper.deleteTopic(accountId, eventBusName);
+        return true;
+    }
+
+    @Override
+    public boolean putEvent(String accountId, String eventBusName, EventBridgeEvent eventBridgeEvent,
+        PutEventCallback putEventCallback) {
+        String topicName = this.getTopicName(accountId, eventBusName);
+        Message msg = eventDataOnRocketMQConnectAPI.converter(accountId, topicName, eventBridgeEvent);
+        try {
+            producer.send(msg, new DefaultSendCallback(putEventCallback), 1000L);
+        } catch (Throwable e) {
+            throw new EventBridgeException(EventBridgeErrorCode.InternalError, e);
+        }
+        return true;
+    }
+
+    @Override
+    public String getEventBusPersistentContext(String accountId, String eventBusName) {
+        EventTopicDO eventTopicDO = eventTopicMapper.getTopic(accountId, eventBusName);
+        return new Gson().toJson(eventTopicDO);
+    }
+
+    @Cacheable(value = "topicCache")
+    public String getTopicName(String accountId, String eventBusName) {
+        String topicName = null;
+        EventTopicDO eventTopicDO = eventTopicMapper.getTopic(accountId, eventBusName);
+        if (eventTopicDO != null) {
+            topicName = eventTopicDO.getName();
+        } else {
+            topicName = eventDataOnRocketMQConnectAPI.buildTopicName(accountId, eventBusName);
+            eventTopicMapper.createTopic(accountId, eventBusName, topicName, AppConfig.getGlobalConfig()
+                .getDefaultDataPersistentClusterName());
+        }
+        return topicName;
+    }
+
+}
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/rpc/EventDataOnRocketMQConnectAPI.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/rpc/EventDataOnRocketMQConnectAPI.java
new file mode 100644
index 0000000..391d6e1
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/rpc/EventDataOnRocketMQConnectAPI.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.persistence.rpc;
+
+import org.apache.rocketmq.common.message.Message;
+import org.apache.rocketmq.eventbridge.event.EventBridgeEvent;
+
+public interface EventDataOnRocketMQConnectAPI {
+
+    Message converter(String accountId, String topicName, EventBridgeEvent eventBridgeEvent);
+
+    String buildTopicName(String accountId, String eventBusName);
+}
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/rule/mybatis/mapper/EventRuleMapper.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/rule/mybatis/mapper/EventRuleMapper.java
new file mode 100644
index 0000000..79fdd46
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/rule/mybatis/mapper/EventRuleMapper.java
@@ -0,0 +1,44 @@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ package org.apache.rocketmq.eventbridge.adapter.persistence.rule.mybatis.mapper;
+
+ import java.util.List;
+
+ import org.apache.ibatis.annotations.Param;
+ import org.apache.rocketmq.eventbridge.domain.model.rule.EventRule;
+
+ public interface EventRuleMapper {
+
+     int createEventRule(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("eventRuleName") String eventRuleName, @Param("description") String description,
+         @Param("filterPattern") String filterPattern, @Param("status") Integer status);
+
+     int deleteEventRule(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("eventRuleName") String eventRuleName);
+
+     EventRule getEventRule(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("eventRuleName") String eventRuleName);
+
+     int getEventRulesCount(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName);
+
+     List<EventRule> listEventRules(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("nextToken") int nextToken, @Param("maxResults") int maxResults);
+
+     int updateEventRule(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("eventRuleName") String eventRuleName, @Param("description") String description,
+         @Param("filterPattern") String filterPattern, @Param("status") Integer status);
+ }
\ No newline at end of file
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/rule/mybatis/repository/MybatisEventRuleRepository.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/rule/mybatis/repository/MybatisEventRuleRepository.java
new file mode 100644
index 0000000..73fb58c
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/rule/mybatis/repository/MybatisEventRuleRepository.java
@@ -0,0 +1,77 @@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ package org.apache.rocketmq.eventbridge.adapter.persistence.rule.mybatis.repository;
+
+ import java.util.List;
+
+ import org.apache.rocketmq.eventbridge.adapter.persistence.rule.mybatis.mapper.EventRuleMapper;
+ import org.apache.rocketmq.eventbridge.domain.common.enums.EventRuleStatusEnum;
+ import org.apache.rocketmq.eventbridge.domain.model.rule.EventRule;
+ import org.apache.rocketmq.eventbridge.domain.repository.EventRuleRepository;
+ import org.springframework.stereotype.Repository;
+
+ @Repository
+ public class MybatisEventRuleRepository implements EventRuleRepository {
+
+     private final EventRuleMapper eventRuleMapper;
+
+     public MybatisEventRuleRepository(EventRuleMapper eventRuleMapper) {
+         this.eventRuleMapper = eventRuleMapper;
+     }
+
+     @Override
+     public boolean createEventRule(String accountId, String eventBusName, String eventRuleName, String description,
+         String filterPattern, EventRuleStatusEnum status) {
+         return eventRuleMapper.createEventRule(accountId, eventBusName, eventRuleName, description, filterPattern,
+             status.getCode()) == 1;
+     }
+
+     @Override
+     public boolean updateEventRule(String accountId, String eventBusName, String eventRuleName, String description,
+         String filterPattern) {
+         return eventRuleMapper.updateEventRule(accountId, eventBusName, eventRuleName, description, filterPattern,
+             null) == 1;
+     }
+
+     @Override
+     public boolean updateEventRuleStatus(String accountId, String eventBusName, String eventRuleName,
+         EventRuleStatusEnum status) {
+         return eventRuleMapper.updateEventRule(accountId, eventBusName, eventRuleName, null, null, status.getCode())
+             == 1;
+     }
+
+     @Override
+     public boolean deleteEventRule(String accountId, String eventBusName, String eventRuleName) {
+         return eventRuleMapper.deleteEventRule(accountId, eventBusName, eventRuleName) == 1;
+     }
+
+     public EventRule getEventRule(String accountId, String eventBusName, String eventRuleName) {
+         return eventRuleMapper.getEventRule(accountId, eventBusName, eventRuleName);
+
+     }
+
+     @Override
+     public int getEventRulesCount(String accountId, String eventBusName) {
+         return eventRuleMapper.getEventRulesCount(accountId, eventBusName);
+     }
+
+     @Override
+     public List<EventRule> listEventRules(String accountId, String eventBusName, String nextToken, int maxResults) {
+         return eventRuleMapper.listEventRules(accountId, eventBusName, Integer.parseInt(nextToken), maxResults);
+     }
+
+ }
\ No newline at end of file
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/converter/EventSourceConverter.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/converter/EventSourceConverter.java
new file mode 100644
index 0000000..ab5c952
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/converter/EventSourceConverter.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.persistence.source.mybatis.converter;
+
+import java.util.List;
+
+import com.google.common.collect.Lists;
+import org.apache.rocketmq.eventbridge.adapter.persistence.source.mybatis.dataobject.EventSourceDO;
+import org.apache.rocketmq.eventbridge.domain.common.enums.EventSourceTypeEnum;
+import org.apache.rocketmq.eventbridge.domain.model.source.EventSource;
+
+public class EventSourceConverter {
+
+    public static EventSource convert(EventSourceDO eventSourceDO) {
+        return EventSource.builder()
+            .accountId(eventSourceDO.getAccountId())
+            .eventBusName(eventSourceDO.getEventBusName())
+            .name(eventSourceDO.getName())
+            .type(EventSourceTypeEnum.parseFromCode(eventSourceDO.getType()))
+            .description(eventSourceDO.getDescription())
+            .gmtCreate(eventSourceDO.getGmtCreate())
+            .gmtModify(eventSourceDO.getGmtModify())
+            .build();
+    }
+
+    public static List<EventSource> convert(List<EventSourceDO> eventSourceDOs) {
+        List<EventSource> eventSources = Lists.newArrayListWithCapacity(eventSourceDOs.size());
+        for (EventSourceDO eventSourceDO : eventSourceDOs) {
+            eventSources.add(convert(eventSourceDO));
+        }
+        return eventSources;
+    }
+
+}
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/converter/EventSourceRunnerConverter.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/converter/EventSourceRunnerConverter.java
new file mode 100644
index 0000000..a394bd7
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/converter/EventSourceRunnerConverter.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.persistence.source.mybatis.converter;
+
+import java.lang.reflect.Type;
+import java.util.Map;
+
+import com.google.common.reflect.TypeToken;
+import com.google.gson.Gson;
+import org.apache.rocketmq.eventbridge.adapter.persistence.source.mybatis.dataobject.EventSourceRunnerDO;
+import org.apache.rocketmq.eventbridge.domain.model.run.RunOptions;
+import org.apache.rocketmq.eventbridge.domain.model.run.EventSourceRunner;
+
+public class EventSourceRunnerConverter {
+
+    public static EventSourceRunner convert(EventSourceRunnerDO eventTargetRunnerDO) {
+        Type mapType = new TypeToken<Map<String, Object>>() {}.getType();
+        Map<String, Object> config = new Gson().fromJson(eventTargetRunnerDO.getConfig(), mapType);
+        RunOptions runOptions = new Gson().fromJson(eventTargetRunnerDO.getRunOptions(), RunOptions.class);
+        return EventSourceRunner.builder()
+            .accountId(eventTargetRunnerDO.getAccountId())
+            .eventBusName(eventTargetRunnerDO.getEventBusName())
+            .eventSourceName(eventTargetRunnerDO.getEventSourceName())
+            .className(eventTargetRunnerDO.getClassName())
+            .config(config)
+            .runOptions(runOptions)
+            .runContext(eventTargetRunnerDO.getRunContext())
+            .gmtCreate(eventTargetRunnerDO.getGmtCreate())
+            .gmtModify(eventTargetRunnerDO.getGmtModify())
+            .build();
+    }
+
+
+}
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/dataobject/EventSourceDO.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/dataobject/EventSourceDO.java
new file mode 100644
index 0000000..db236aa
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/dataobject/EventSourceDO.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.persistence.source.mybatis.dataobject;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+
+public @Data
+class EventSourceDO implements Serializable {
+
+    private static final long serialVersionUID = -1L;
+    private String accountId;
+    private String eventBusName;
+    private String name;
+    private int type;
+    private String className;
+    private String config;
+    private String description;
+    private Integer status;
+    private Date gmtCreate;
+    private Date gmtModify;
+}
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/dataobject/EventSourceRunnerDO.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/dataobject/EventSourceRunnerDO.java
new file mode 100644
index 0000000..3b684d3
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/dataobject/EventSourceRunnerDO.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.persistence.source.mybatis.dataobject;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+
+public @Data
+class EventSourceRunnerDO implements Serializable {
+
+    private static final long serialVersionUID = -1L;
+    private String accountId;
+    private String eventBusName;
+    private String eventSourceName;
+    private String className;
+    private String config;
+    private String runOptions;
+    private String runContext;
+    private Date gmtCreate;
+    private Date gmtModify;
+}
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/mapper/EventSourceMapper.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/mapper/EventSourceMapper.java
new file mode 100644
index 0000000..c339b8a
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/mapper/EventSourceMapper.java
@@ -0,0 +1,46 @@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ package org.apache.rocketmq.eventbridge.adapter.persistence.source.mybatis.mapper;
+
+ import java.util.List;
+
+ import org.apache.ibatis.annotations.Param;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.source.mybatis.dataobject.EventSourceDO;
+
+ public interface EventSourceMapper {
+
+     int createEventSource(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("eventSourceName") String eventSourceName, @Param("description") String description,
+         @Param("status") Integer status, @Param("type") Integer type, @Param("className") String className,
+         @Param("config") String config);
+
+     int deleteEventSource(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("eventSourceName") String eventSourceName);
+
+     EventSourceDO getEventSource(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("eventSourceName") String eventSourceName);
+
+     int getEventSourceCount(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName);
+
+     List<EventSourceDO> listEventSources(@Param("accountId") String accountId,
+         @Param("eventBusName") String eventBusName, @Param("nextToken") int nextToken,
+         @Param("maxResults") int maxResults);
+
+     int updateEventSource(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("eventSourceName") String eventSourceName, @Param("description") String description,
+         @Param("status") Integer status, @Param("config") String config);
+ }
\ No newline at end of file
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/mapper/EventSourceRunnerMapper.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/mapper/EventSourceRunnerMapper.java
new file mode 100644
index 0000000..0ecad8c
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/mapper/EventSourceRunnerMapper.java
@@ -0,0 +1,35 @@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ package org.apache.rocketmq.eventbridge.adapter.persistence.source.mybatis.mapper;
+
+ import org.apache.ibatis.annotations.Param;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.source.mybatis.dataobject.EventSourceRunnerDO;
+
+ public interface EventSourceRunnerMapper {
+
+     int createEventSourceRunner(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("eventSourceName") String eventSourceName, @Param("runContext") String runContext);
+
+     int deleteEventSourceRunner(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("eventSourceName") String eventSourceName);
+
+     EventSourceRunnerDO getEventSourceRunner(@Param("accountId") String accountId,
+         @Param("eventBusName") String eventBusName, @Param("eventSourceName") String eventSourceName);
+
+     int updateEventSourceRunner(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("eventSourceName") String eventSourceName, @Param("runContext") String runContext);
+ }
\ No newline at end of file
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/repository/MybatisEventSourceRepository.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/repository/MybatisEventSourceRepository.java
new file mode 100644
index 0000000..42f80d2
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/repository/MybatisEventSourceRepository.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.rocketmq.eventbridge.adapter.persistence.source.mybatis.repository;
+
+ import java.util.List;
+ import java.util.Map;
+
+ import com.google.gson.Gson;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.source.mybatis.converter.EventSourceConverter;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.source.mybatis.dataobject.EventSourceDO;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.source.mybatis.mapper.EventSourceMapper;
+ import org.apache.rocketmq.eventbridge.domain.common.enums.EventSourceStatusEnum;
+ import org.apache.rocketmq.eventbridge.domain.common.enums.EventSourceTypeEnum;
+ import org.apache.rocketmq.eventbridge.domain.model.source.EventSource;
+ import org.apache.rocketmq.eventbridge.domain.repository.EventSourceRepository;
+ import org.springframework.stereotype.Repository;
+
+ @Repository
+ public class MybatisEventSourceRepository implements EventSourceRepository {
+
+     private final EventSourceMapper eventSourceMapper;
+
+     public MybatisEventSourceRepository(EventSourceMapper eventSourceMapper) {
+         this.eventSourceMapper = eventSourceMapper;
+     }
+
+     @Override
+     public boolean createEventSource(String accountId, String eventBusName, String eventSourceName, String description,
+         EventSourceStatusEnum status, EventSourceTypeEnum type, String className, Map<String, Object> config) {
+         return eventSourceMapper.createEventSource(accountId, eventBusName, eventSourceName, description,
+             status.getCode(), type.getCode(), className, new Gson().toJson(config)) == 1;
+     }
+
+     @Override
+     public EventSource getEventSource(String accountId, String eventBusName, String eventSourceName) {
+         EventSourceDO eventSourceDO = eventSourceMapper.getEventSource(accountId, eventBusName, eventSourceName);
+         if (eventSourceDO == null) {
+             return null;
+         }
+         return EventSourceConverter.convert(eventSourceDO);
+     }
+
+     @Override
+     public int getEventSourceCount(String accountId, String eventBusName) {
+         return eventSourceMapper.getEventSourceCount(accountId, eventBusName);
+     }
+
+     @Override
+     public List<EventSource> listEventSources(String accountId, String eventBusName, String nextToken,
+         int maxResults) {
+         List<EventSourceDO> eventSourceDOS = eventSourceMapper.listEventSources(accountId, eventBusName,
+             Integer.parseInt(nextToken), maxResults);
+         return EventSourceConverter.convert(eventSourceDOS);
+     }
+
+     @Override
+     public boolean deleteEventSource(String accountId, String eventBusName, String eventSourceName) {
+         return eventSourceMapper.deleteEventSource(accountId, eventBusName, eventSourceName) == 1;
+     }
+
+     @Override
+     public boolean updateEventSource(String accountId, String eventBusName, String eventSourceName, String description,
+         Map<String, Object> config) {
+         return eventSourceMapper.updateEventSource(accountId, eventBusName, eventSourceName, description, null, null)
+             == 1;
+     }
+ }
\ No newline at end of file
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/repository/MybatisEventSourceRunnerRepository.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/repository/MybatisEventSourceRunnerRepository.java
new file mode 100644
index 0000000..dfd2963
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/source/mybatis/repository/MybatisEventSourceRunnerRepository.java
@@ -0,0 +1,63 @@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ package org.apache.rocketmq.eventbridge.adapter.persistence.source.mybatis.repository;
+
+ import org.apache.rocketmq.eventbridge.adapter.persistence.source.mybatis.converter.EventSourceRunnerConverter;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.source.mybatis.dataobject.EventSourceRunnerDO;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.source.mybatis.mapper.EventSourceRunnerMapper;
+ import org.apache.rocketmq.eventbridge.domain.model.run.EventSourceRunner;
+ import org.apache.rocketmq.eventbridge.domain.repository.EventSourceRunnerRepository;
+ import org.springframework.stereotype.Repository;
+
+ @Repository
+ public class MybatisEventSourceRunnerRepository implements EventSourceRunnerRepository {
+
+     private final EventSourceRunnerMapper eventSourceRunnerMapper;
+
+     public MybatisEventSourceRunnerRepository(EventSourceRunnerMapper eventSourceRunnerMapper) {
+         this.eventSourceRunnerMapper = eventSourceRunnerMapper;
+     }
+
+     @Override
+     public boolean createEventSourceRunner(String accountId, String eventBusName, String eventSourceName,
+         String runContext) {
+         return eventSourceRunnerMapper.createEventSourceRunner(accountId, eventBusName, eventSourceName, runContext)
+             == 1;
+     }
+
+     @Override
+     public boolean deleteEventSourceRunner(String accountId, String eventBusName, String eventSourceName) {
+         return eventSourceRunnerMapper.deleteEventSourceRunner(accountId, eventBusName, eventSourceName) == 1;
+     }
+
+     @Override
+     public boolean updateEventSourceRunner(String accountId, String eventBusName, String eventSourceName,
+         String runContext) {
+         return eventSourceRunnerMapper.updateEventSourceRunner(accountId, eventBusName, eventSourceName, runContext)
+             == 1;
+     }
+
+     @Override
+     public EventSourceRunner getEventSourceRunner(String accountId, String eventBusName, String eventSourceName) {
+         EventSourceRunnerDO eventSourceRunnerDO = eventSourceRunnerMapper.getEventSourceRunner(accountId, eventBusName,
+             eventSourceName);
+         if (eventSourceRunnerDO == null) {
+             return null;
+         }
+         return EventSourceRunnerConverter.convert(eventSourceRunnerDO);
+     }
+ }
\ No newline at end of file
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/converter/EventTargetConverter.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/converter/EventTargetConverter.java
new file mode 100644
index 0000000..71e66ba
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/converter/EventTargetConverter.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.persistence.target.mybatis.converter;
+
+import java.lang.reflect.Type;
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.collect.Lists;
+import com.google.common.reflect.TypeToken;
+import com.google.gson.Gson;
+import org.apache.rocketmq.eventbridge.adapter.persistence.target.mybatis.dataobject.EventTargetDO;
+import org.apache.rocketmq.eventbridge.domain.model.run.RunOptions;
+import org.apache.rocketmq.eventbridge.domain.model.target.EventTarget;
+
+public class EventTargetConverter {
+
+    public static List<EventTarget> convert(List<EventTargetDO> eventTargetDOS) {
+        List<EventTarget> eventTargets = Lists.newArrayListWithCapacity(eventTargetDOS.size());
+        for (EventTargetDO eventTargetDO : eventTargetDOS) {
+            eventTargets.add(convert(eventTargetDO));
+        }
+        return eventTargets;
+    }
+
+    public static EventTarget convert(EventTargetDO eventTargetRunnerDO) {
+        Type mapType = new TypeToken<Map<String, Object>>() {}.getType();
+        Map<String, Object> config = new Gson().fromJson(eventTargetRunnerDO.getConfig(), mapType);
+        RunOptions runOptions = new Gson().fromJson(eventTargetRunnerDO.getRunOptions(), RunOptions.class);
+        return EventTarget.builder()
+            .accountId(eventTargetRunnerDO.getAccountId())
+            .eventBusName(eventTargetRunnerDO.getEventBusName())
+            .eventRuleName(eventTargetRunnerDO.getEventRuleName())
+            .name(eventTargetRunnerDO.getEventTargetName())
+            .className(eventTargetRunnerDO.getClassName())
+            .config(config)
+            .runOptions(runOptions)
+            .runContext(eventTargetRunnerDO.getRunContext())
+            .gmtCreate(eventTargetRunnerDO.getGmtCreate())
+            .gmtModify(eventTargetRunnerDO.getGmtModify())
+            .build();
+    }
+}
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/converter/EventTargetRunnerConverter.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/converter/EventTargetRunnerConverter.java
new file mode 100644
index 0000000..5ddb719
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/converter/EventTargetRunnerConverter.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.persistence.target.mybatis.converter;
+
+import java.util.List;
+
+import com.google.common.collect.Lists;
+import org.apache.rocketmq.eventbridge.adapter.persistence.target.mybatis.dataobject.EventTargetRunnerDO;
+import org.apache.rocketmq.eventbridge.domain.model.run.EventTargetRunner;
+
+public class EventTargetRunnerConverter {
+
+    public static List<EventTargetRunner> convert(List<EventTargetRunnerDO> eventTargetRunnerDOS) {
+        List<EventTargetRunner> eventTargetRunners = Lists.newArrayListWithCapacity(eventTargetRunnerDOS.size());
+        for (EventTargetRunnerDO eventTargetRunnerDO : eventTargetRunnerDOS) {
+            eventTargetRunners.add(convert(eventTargetRunnerDO));
+        }
+        return eventTargetRunners;
+    }
+
+    public static EventTargetRunner convert(EventTargetRunnerDO eventTargetRunnerDO) {
+        return EventTargetRunner.builder()
+            .accountId(eventTargetRunnerDO.getAccountId())
+            .eventBusName(eventTargetRunnerDO.getEventBusName())
+            .eventRuleName(eventTargetRunnerDO.getEventRuleName())
+            .name(eventTargetRunnerDO.getEventTargetName())
+            .runContext(eventTargetRunnerDO.getRunContext())
+            .gmtCreate(eventTargetRunnerDO.getGmtCreate())
+            .gmtModify(eventTargetRunnerDO.getGmtModify())
+            .build();
+    }
+}
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/dataobject/EventTargetDO.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/dataobject/EventTargetDO.java
new file mode 100644
index 0000000..365f162
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/dataobject/EventTargetDO.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.persistence.target.mybatis.dataobject;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+
+public @Data
+class EventTargetDO implements Serializable {
+
+    private static final long serialVersionUID = -1L;
+    private String accountId;
+    private String eventBusName;
+    private String eventRuleName;
+    private String eventTargetName;
+    private String className;
+    private String config;
+    private String runOptions;
+    private String runContext;
+    private Date gmtCreate;
+    private Date gmtModify;
+}
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/dataobject/EventTargetRunnerDO.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/dataobject/EventTargetRunnerDO.java
new file mode 100644
index 0000000..950abfe
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/dataobject/EventTargetRunnerDO.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.persistence.target.mybatis.dataobject;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+
+public @Data
+class EventTargetRunnerDO implements Serializable {
+
+    private static final long serialVersionUID = -1L;
+    private String accountId;
+    private String eventBusName;
+    private String eventRuleName;
+    private String eventTargetName;
+    private String className;
+    private String config;
+    private String runOptions;
+    private String runContext;
+    private Date gmtCreate;
+    private Date gmtModify;
+}
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/mapper/EventTargetMapper.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/mapper/EventTargetMapper.java
new file mode 100644
index 0000000..6678bb1
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/mapper/EventTargetMapper.java
@@ -0,0 +1,43 @@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ package org.apache.rocketmq.eventbridge.adapter.persistence.target.mybatis.mapper;
+
+ import java.util.List;
+
+ import org.apache.ibatis.annotations.Param;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.target.mybatis.dataobject.EventTargetDO;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.target.mybatis.dataobject.EventTargetRunnerDO;
+
+ public interface EventTargetMapper {
+     int createEventTarget(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("eventRuleName") String eventRuleName, @Param("eventTargetName") String eventTargetName,
+         @Param("className") String className, @Param("config") String config, @Param("runOptions") String runOptions);
+
+     int deleteEventTarget(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("eventRuleName") String eventRuleName, @Param("eventTargetName") String eventTargetName);
+
+     EventTargetDO getEventTarget(@Param("accountId") String accountId,
+         @Param("eventBusName") String eventBusName, @Param("eventRuleName") String eventRuleName,
+         @Param("eventTargetName") String eventTargetName);
+
+     List<EventTargetDO> listEventTargets(@Param("accountId") String accountId,
+         @Param("eventBusName") String eventBusName, @Param("eventRuleName") String eventRuleName);
+
+     int updateEventTarget(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("eventRuleName") String eventRuleName, @Param("eventTargetName") String eventTargetName,
+         @Param("config") String config, @Param("runOptions") String runOptions);
+ }
\ No newline at end of file
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/mapper/EventTargetRunnerMapper.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/mapper/EventTargetRunnerMapper.java
new file mode 100644
index 0000000..1a91f92
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/mapper/EventTargetRunnerMapper.java
@@ -0,0 +1,44 @@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ package org.apache.rocketmq.eventbridge.adapter.persistence.target.mybatis.mapper;
+
+ import java.util.List;
+
+ import org.apache.ibatis.annotations.Param;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.target.mybatis.dataobject.EventTargetRunnerDO;
+
+ public interface EventTargetRunnerMapper {
+     int createEventTargetRunner(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("eventRuleName") String eventRuleName, @Param("eventTargetName") String eventTargetName,
+         @Param("className") String className, @Param("config") String config, @Param("runOptions") String runOptions,
+         @Param("runContext") String runContext);
+
+     int deleteEventTargetRunner(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("eventRuleName") String eventRuleName, @Param("eventTargetName") String eventTargetName);
+
+     EventTargetRunnerDO getEventTargetRunner(@Param("accountId") String accountId,
+         @Param("eventBusName") String eventBusName, @Param("eventRuleName") String eventRuleName,
+         @Param("eventTargetName") String eventTargetName);
+
+     List<EventTargetRunnerDO> listEventTargetRunners(@Param("accountId") String accountId,
+         @Param("eventBusName") String eventBusName, @Param("eventRuleName") String eventRuleName);
+
+     int updateEventTargetRunner(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("eventRuleName") String eventRuleName, @Param("eventTargetName") String eventTargetName,
+         @Param("config") String config, @Param("runOptions") String runOptions,
+         @Param("runContext") String runContext);
+ }
\ No newline at end of file
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/repository/MybatisEventTargetRepository.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/repository/MybatisEventTargetRepository.java
new file mode 100644
index 0000000..30ba0b4
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/repository/MybatisEventTargetRepository.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.rocketmq.eventbridge.adapter.persistence.target.mybatis.repository;
+
+ import java.util.List;
+ import java.util.Map;
+
+ import com.google.gson.Gson;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.target.mybatis.converter.EventTargetConverter;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.target.mybatis.dataobject.EventTargetDO;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.target.mybatis.mapper.EventTargetMapper;
+ import org.apache.rocketmq.eventbridge.domain.model.run.RunOptions;
+ import org.apache.rocketmq.eventbridge.domain.model.target.EventTarget;
+ import org.apache.rocketmq.eventbridge.domain.repository.EventTargetRepository;
+ import org.springframework.stereotype.Repository;
+
+ @Repository
+ public class MybatisEventTargetRepository implements EventTargetRepository {
+
+     private final EventTargetMapper eventTargetMapper;
+
+     public MybatisEventTargetRepository(EventTargetMapper eventTargetMapper) {
+         this.eventTargetMapper = eventTargetMapper;
+     }
+
+
+     @Override
+     public boolean createEventTarget(String accountId, String eventBusName, String eventRuleName, String name,
+         String className, Map<String, Object> config, RunOptions runOptions) {
+         return eventTargetMapper.createEventTarget(accountId, eventBusName, eventRuleName, name, className,
+             new Gson().toJson(config), new Gson().toJson(runOptions)) == 1;
+     }
+
+     @Override
+     public List<EventTarget> listEventTargets(String accountId, String eventBusName, String eventRuleName) {
+         List<EventTargetDO> eventTargetDOS = eventTargetMapper.listEventTargets(accountId,
+             eventBusName, eventRuleName);
+         return EventTargetConverter.convert(eventTargetDOS);
+     }
+
+     @Override
+     public boolean updateEventTarget(String accountId, String eventBusName, String eventRuleName, String name,
+         Map<String, Object> config, RunOptions runOptions) {
+         return eventTargetMapper.updateEventTarget(accountId, eventBusName, eventRuleName, name,
+             new Gson().toJson(config), new Gson().toJson(runOptions)) == 1;
+     }
+
+     @Override
+     public EventTarget getEventTarget(String accountId, String eventBusName, String eventRuleName,
+         String eventTargetName) {
+         EventTargetDO eventTargetDO = eventTargetMapper.getEventTarget(accountId, eventBusName,
+             eventRuleName, eventTargetName);
+         if (eventTargetDO == null) {
+             return null;
+         }
+         return EventTargetConverter.convert(eventTargetDO);
+     }
+
+     @Override
+     public boolean deleteEventTarget(String accountId, String eventBusName, String eventRuleName,
+         String eventTargetName) {
+         return eventTargetMapper.deleteEventTarget(accountId, eventBusName, eventRuleName, eventTargetName)
+             == 1;
+     }
+
+ }
\ No newline at end of file
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/repository/MybatisEventTargetRunnerRepository.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/repository/MybatisEventTargetRunnerRepository.java
new file mode 100644
index 0000000..7fadff2
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/target/mybatis/repository/MybatisEventTargetRunnerRepository.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.rocketmq.eventbridge.adapter.persistence.target.mybatis.repository;
+
+ import java.util.Map;
+
+ import com.google.gson.Gson;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.target.mybatis.converter.EventTargetRunnerConverter;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.target.mybatis.dataobject.EventTargetRunnerDO;
+ import org.apache.rocketmq.eventbridge.adapter.persistence.target.mybatis.mapper.EventTargetRunnerMapper;
+ import org.apache.rocketmq.eventbridge.domain.model.run.EventTargetRunner;
+ import org.apache.rocketmq.eventbridge.domain.model.run.RunOptions;
+ import org.apache.rocketmq.eventbridge.domain.repository.EventTargetRunnerRepository;
+ import org.springframework.stereotype.Repository;
+
+ @Repository
+ public class MybatisEventTargetRunnerRepository implements EventTargetRunnerRepository {
+
+     private final EventTargetRunnerMapper eventTargetRunnerMapper;
+
+     public MybatisEventTargetRunnerRepository(EventTargetRunnerMapper eventTargetRunnerMapper) {
+         this.eventTargetRunnerMapper = eventTargetRunnerMapper;
+     }
+
+     @Override
+     public boolean createTargetRunner(String accountId, String eventBusName, String eventRuleName, String name,
+         String className, Map<String, Object> config, RunOptions runOptions, String runContext) {
+         return eventTargetRunnerMapper.createEventTargetRunner(accountId, eventBusName, eventRuleName, name, className,
+             new Gson().toJson(config), new Gson().toJson(runOptions), runContext) == 1;
+     }
+
+     @Override
+     public boolean updateTargetRunner(String accountId, String eventBusName, String eventRuleName, String name,
+         Map<String, Object> config, RunOptions runOptions, String runContext) {
+         return eventTargetRunnerMapper.updateEventTargetRunner(accountId, eventBusName, eventRuleName, name,
+             new Gson().toJson(config), new Gson().toJson(runOptions), runContext) == 1;
+     }
+
+     @Override
+     public EventTargetRunner getEventTargetRunner(String accountId, String eventBusName, String eventRuleName,
+         String eventTargetName) {
+         EventTargetRunnerDO eventTargetRunnerDO = eventTargetRunnerMapper.getEventTargetRunner(accountId, eventBusName,
+             eventRuleName, eventTargetName);
+         if (eventTargetRunnerDO == null) {
+             return null;
+         }
+         return EventTargetRunnerConverter.convert(eventTargetRunnerDO);
+     }
+
+     @Override
+     public boolean deleteEventTargetRunner(String accountId, String eventBusName, String eventRuleName,
+         String eventTargetName) {
+         return eventTargetRunnerMapper.deleteEventTargetRunner(accountId, eventBusName, eventRuleName, eventTargetName)
+             == 1;
+     }
+
+ }
\ No newline at end of file
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/type/mybatis/mapper/EventTypeMapper.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/type/mybatis/mapper/EventTypeMapper.java
new file mode 100644
index 0000000..83e9cc3
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/type/mybatis/mapper/EventTypeMapper.java
@@ -0,0 +1,43 @@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ package org.apache.rocketmq.eventbridge.adapter.persistence.type.mybatis.mapper;
+
+ import java.util.List;
+
+ import org.apache.ibatis.annotations.Param;
+ import org.apache.rocketmq.eventbridge.domain.model.source.EventType;
+
+ public interface EventTypeMapper {
+
+     int createEventType(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("eventSourceName") String eventSourceName, @Param("eventTypeName") String eventTypeName,
+         @Param("description") String description);
+
+     int deleteEventType(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("eventSourceName") String eventSourceName, @Param("eventTypeName") String eventTypeName);
+
+     int getEventTypeCount(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("eventSourceName") String eventSourceName);
+
+     List<EventType> listEventTypes(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("eventSourceName") String eventSourceName, @Param("nextToken") int nextToken,
+         @Param("maxResults") int maxResults);
+
+     int updateEventType(@Param("accountId") String accountId, @Param("eventBusName") String eventBusName,
+         @Param("eventSourceName") String eventSourceName, @Param("eventTypeName") String eventTypeName,
+         @Param("description") String description);
+ }
\ No newline at end of file
diff --git a/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/type/mybatis/repository/MybatisEventTypeRepository.java b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/type/mybatis/repository/MybatisEventTypeRepository.java
new file mode 100644
index 0000000..bb71352
--- /dev/null
+++ b/adapter/persistence/src/main/java/org/apache/rocketmq/eventbridge/adapter/persistence/type/mybatis/repository/MybatisEventTypeRepository.java
@@ -0,0 +1,67 @@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ package org.apache.rocketmq.eventbridge.adapter.persistence.type.mybatis.repository;
+
+ import java.util.List;
+
+ import org.apache.rocketmq.eventbridge.adapter.persistence.type.mybatis.mapper.EventTypeMapper;
+ import org.apache.rocketmq.eventbridge.domain.model.source.EventType;
+ import org.apache.rocketmq.eventbridge.domain.repository.EventTypeRepository;
+ import org.springframework.stereotype.Repository;
+
+ @Repository
+ public class MybatisEventTypeRepository implements EventTypeRepository {
+
+     private final EventTypeMapper eventTypeMapper;
+
+     public MybatisEventTypeRepository(EventTypeMapper eventTypeMapper) {
+         this.eventTypeMapper = eventTypeMapper;
+     }
+
+     @Override
+     public boolean createEventType(String accountId, String eventBusName, String eventSourceName, String eventTypeName,
+         String description) {
+         return eventTypeMapper.createEventType(accountId, eventBusName, eventSourceName, eventTypeName, description)
+             == 1;
+     }
+
+     @Override
+     public boolean deleteEventType(String accountId, String eventBusName, String eventSourceName,
+         String eventTypeName) {
+         return eventTypeMapper.deleteEventType(accountId, eventBusName, eventSourceName, eventTypeName) == 1;
+     }
+
+     @Override
+     public int getEventTypeCount(String accountId, String eventBusName, String eventSourceName) {
+         return eventTypeMapper.getEventTypeCount(accountId, eventBusName, eventSourceName);
+     }
+
+     @Override
+     public List<EventType> listEventTypes(String accountId, String eventBusName, String eventSourceName,
+         String nextToken, int maxResults) {
+         return eventTypeMapper.listEventTypes(accountId, eventBusName, eventSourceName, Integer.parseInt(nextToken),
+             maxResults);
+     }
+
+     @Override
+     public boolean updateEventType(String accountId, String eventBusName, String eventSourceName, String eventTypeName,
+         String description) {
+         return eventTypeMapper.updateEventType(accountId, eventBusName, eventSourceName, eventTypeName, description)
+             == 1;
+     }
+
+ }
\ No newline at end of file
diff --git a/adapter/persistence/src/main/resources/db/migration/V1__baseline.sql b/adapter/persistence/src/main/resources/db/migration/V1__baseline.sql
new file mode 100644
index 0000000..85e7234
--- /dev/null
+++ b/adapter/persistence/src/main/resources/db/migration/V1__baseline.sql
@@ -0,0 +1,150 @@
+CREATE TABLE IF NOT EXISTS `event_bus` (
+  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+  `account_id` varchar(255) NOT NULL COMMENT 'bus account id',
+  `name` varchar(255) NOT NULL COMMENT 'bus name',
+  `description` varchar(256) DEFAULT NULL COMMENT 'bus description',
+  `gmt_create` datetime DEFAULT NULL COMMENT 'create time',
+  `gmt_modify` datetime DEFAULT NULL COMMENT 'modify time',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `name_uniq_key` (`account_id`,`name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8  COMMENT='event bus meta'
+;
+
+CREATE TABLE `event_topic` (
+  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `account_id` varchar(255) DEFAULT 'SYSTEM' COMMENT 'source account id',
+  `bus` varchar(255) NOT NULL COMMENT 'bus name',
+  `name` varchar(255) NOT NULL COMMENT 'topic name',
+  `msg_ttl` int(11) NOT NULL COMMENT 'msg ttl',
+  `cluster` varchar(255) NOT NULL COMMENT 'the cluster of topic',
+  `status` tinyint(4) NOT NULL COMMENT '0:disable, 1:enable',
+  `gmt_create` datetime DEFAULT NULL COMMENT 'create time',
+  `gmt_modify` datetime DEFAULT NULL COMMENT 'modify time',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `name_uniq_key` (`name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8
+;
+
+CREATE TABLE IF NOT EXISTS `event_source` (
+  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `account_id` varchar(255) DEFAULT 'SYSTEM' COMMENT 'source account id',
+  `bus` varchar(255) NOT NULL COMMENT 'bus name',
+  `name` varchar(255) NOT NULL DEFAULT '' COMMENT 'source name',
+  `status` int(11) NOT NULL DEFAULT '0' COMMENT '0:disable, 1:enable',
+  `type` int(11) NOT NULL DEFAULT '1' COMMENT 'event source type',
+  `class_name` varchar(255) COMMENT 'event source class name',
+  `config` text COMMENT 'event source runner config',
+  `description` varchar(1024) DEFAULT NULL COMMENT 'event source description',
+  `gmt_create` datetime DEFAULT NULL COMMENT 'create time',
+  `gmt_modify` datetime DEFAULT NULL COMMENT 'modify time',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `name_uniq_key` (`account_id`,`name`)
+) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='event source meta'
+;
+
+CREATE TABLE IF NOT EXISTS `event_type` (
+  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+  `account_id` varchar(255) NOT NULL COMMENT 'bus account id',
+  `bus` varchar(255) NOT NULL COMMENT 'bus name',
+  `source` varchar(255) NOT NULL DEFAULT '' COMMENT 'event source name',
+  `name` varchar(255) NOT NULL DEFAULT '' COMMENT 'event type name',
+  `description` varchar(255) DEFAULT NULL COMMENT 'a description about the event type',
+  `gmt_create` datetime DEFAULT NULL COMMENT 'create time',
+  `gmt_modify` datetime DEFAULT NULL COMMENT 'modify time',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `name_uniq_key` (`source`,`name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='event type meta'
+;
+
+CREATE TABLE IF NOT EXISTS  `event_rule` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT,
+  `account_id` varchar(255) NOT NULL COMMENT 'bus account id',
+  `bus` varchar(255) NOT NULL COMMENT 'bus name',
+  `name` varchar(255) NOT NULL COMMENT 'rule name',
+  `filter_pattern` varchar(4096) DEFAULT NULL COMMENT 'event filter pattern',
+  `status` tinyint(4) NOT NULL COMMENT '0:disable, 1:enable',
+  `description` varchar(255) DEFAULT NULL COMMENT 'a description about the event rule',
+  `gmt_create` datetime DEFAULT NULL COMMENT 'create time',
+  `gmt_modify` datetime DEFAULT NULL COMMENT 'modify time',
+  UNIQUE KEY `id` (`id`),
+  UNIQUE KEY `name_uniq_key` (`account_id`,`name`,`bus`)
+) ENGINE=InnoDB AUTO_INCREMENT=51815 DEFAULT CHARSET=utf8 COMMENT='event rule meta'
+;
+
+CREATE TABLE IF NOT EXISTS `event_source_runner` (
+  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `account_id` varchar(255) DEFAULT 'SYSTEM' COMMENT 'source account id',
+  `bus` varchar(255) NOT NULL COMMENT 'bus name',
+  `source` varchar(255) NOT NULL DEFAULT '' COMMENT 'source name',
+  `run_options` varchar(1024) DEFAULT NULL COMMENT 'event source runner options',
+  `run_context` varchar(1024) DEFAULT NULL COMMENT 'event source running context',
+  `gmt_create` datetime DEFAULT NULL COMMENT 'create time',
+  `gmt_modify` datetime DEFAULT NULL COMMENT 'modify time',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `name_uniq_key` (`account_id`,`bus`,`source`)
+) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='event source runner meta'
+;
+
+CREATE TABLE IF NOT EXISTS `event_target` (
+  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `account_id` varchar(255) DEFAULT 'SYSTEM' COMMENT 'target account id',
+  `bus` varchar(255) NOT NULL COMMENT 'bus name',
+  `rule` varchar(255) NOT NULL DEFAULT '' COMMENT 'rule name',
+  `name` varchar(255) NOT NULL DEFAULT '' COMMENT 'target name',
+  `class_name` varchar(255) NOT NULL COMMENT 'event target class name',
+  `config` text NOT NULL COMMENT 'event target runner config',
+  `run_options` varchar(1024) DEFAULT NULL COMMENT 'event target runner options',
+  `gmt_create` datetime DEFAULT NULL COMMENT 'create time',
+  `gmt_modify` datetime DEFAULT NULL COMMENT 'modify time',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `name_uniq_key` (`account_id`,`bus`,`rule`,`name`)
+) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='event target meta'
+;
+
+
+
+CREATE TABLE IF NOT EXISTS `event_target_runner` (
+  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `account_id` varchar(255) DEFAULT 'SYSTEM' COMMENT 'target account id',
+  `bus` varchar(255) NOT NULL COMMENT 'bus name',
+  `rule` varchar(255) NOT NULL DEFAULT '' COMMENT 'rule name',
+  `target` varchar(255) NOT NULL DEFAULT '' COMMENT 'target name',
+  `run_context` varchar(1024) DEFAULT NULL COMMENT 'event target running context',
+  `gmt_create` datetime DEFAULT NULL COMMENT 'create time',
+  `gmt_modify` datetime DEFAULT NULL COMMENT 'modify time',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `name_uniq_key` (`account_id`,`bus`,`rule`,`target`)
+) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='event target runner meta'
+;
+
+
+CREATE TABLE IF NOT EXISTS `event_source_class` (
+  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `name` varchar(255) NOT NULL DEFAULT '' COMMENT 'source class name',
+  `api_params` text NOT NULL COMMENT 'event source api params',
+  `required_params` text NOT NULL COMMENT 'event source required params',
+  `transform` text NOT NULL COMMENT 'transform the event source data',
+  `visual_config` text DEFAULT NULL COMMENT 'event source fore-end visual config',
+  `description` varchar(255) DEFAULT NULL COMMENT 'a description about the source class',
+  `gmt_create` datetime DEFAULT NULL COMMENT 'create time',
+  `gmt_modify` datetime DEFAULT NULL COMMENT 'modify time',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `name_uniq_key` (`name`)
+) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='event source class meta'
+;
+
+
+CREATE TABLE IF NOT EXISTS `event_target_class` (
+  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `name` varchar(255) NOT NULL DEFAULT '' COMMENT 'target class name',
+  `api_params` text NOT NULL COMMENT 'event target api params',
+  `target_transform` text NOT NULL COMMENT 'event target required data',
+  `required_params` text NOT NULL COMMENT 'event target required params',
+  `visual_config` text DEFAULT NULL COMMENT 'event target fore-end visual config',
+  `description` varchar(255) DEFAULT NULL COMMENT 'a description about the target class',
+  `gmt_create` datetime DEFAULT NULL COMMENT 'create time',
+  `gmt_modify` datetime DEFAULT NULL COMMENT 'modify time',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `name_uniq_key` (`name`)
+) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='event target class meta'
+;
diff --git a/adapter/persistence/src/main/resources/mybatis/EventBusMapper.xml b/adapter/persistence/src/main/resources/mybatis/EventBusMapper.xml
new file mode 100644
index 0000000..8ce0e6c
--- /dev/null
+++ b/adapter/persistence/src/main/resources/mybatis/EventBusMapper.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="org.apache.rocketmq.eventbridge.adapter.persistence.bus.mybatis.mapper.EventBusMapper">
+
+    <sql id="TABLE_NAME">
+        event_bus
+    </sql>
+
+    <sql id="COLUMN_LIST">
+        account_id,name,description,gmt_create,gmt_modify
+    </sql>
+    <resultMap id="resultMap" type="org.apache.rocketmq.eventbridge.domain.model.bus.EventBus">
+        <result property="accountId" column="account_id"/>
+        <result property="name" column="name"/>
+        <result property="description" column="description"/>
+        <result property="gmtCreate" column="gmt_create"/>
+        <result property="gmtModify" column="gmt_modify"/>
+    </resultMap>
+
+    <select id="listEventBuses" resultMap="resultMap">
+        SELECT
+        <include refid="COLUMN_LIST"/>
+        FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId}
+    </select>
+
+    <select id="getEventBusesCount" parameterType="java.util.Map" resultType="java.lang.Integer">
+        SELECT
+        count(1)
+        FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId}
+    </select>
+
+
+    <select id="getEventBus" parameterType="java.util.Map" resultMap="resultMap">
+        SELECT
+        <include refid="COLUMN_LIST"/>
+        FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId} AND name = #{eventBusName}
+        limit 1;
+    </select>
+
+    <insert id="createEventBus" parameterType="java.util.Map">
+        INSERT INTO
+        <include refid="TABLE_NAME"/>
+        (
+        <include refid="COLUMN_LIST"/>
+        )
+        VALUES
+        (#{accountId},#{eventBusName},#{description},now(),now())
+    </insert>
+
+    <delete id="deleteEventBus">
+        DELETE FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId} AND name = #{eventBusName}
+    </delete>
+
+    <update id="updateEventBus">
+        UPDATE
+        <include refid="TABLE_NAME"/>
+        <set>
+            gmt_modify = now()
+            <if test="description != null">
+                ,description= #{description}
+            </if>
+        </set>
+        WHERE account_id = #{accountId} AND name = #{eventBusName}
+    </update>
+
+</mapper>
\ No newline at end of file
diff --git a/adapter/persistence/src/main/resources/mybatis/EventRuleMapper.xml b/adapter/persistence/src/main/resources/mybatis/EventRuleMapper.xml
new file mode 100644
index 0000000..2664379
--- /dev/null
+++ b/adapter/persistence/src/main/resources/mybatis/EventRuleMapper.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="org.apache.rocketmq.eventbridge.adapter.persistence.rule.mybatis.mapper.EventRuleMapper">
+
+    <sql id="TABLE_NAME">
+        event_rule
+    </sql>
+
+    <sql id="COLUMN_LIST">
+        account_id,bus,name,description,filter_pattern,status,gmt_create,gmt_modify
+    </sql>
+    <resultMap id="resultMap" type="org.apache.rocketmq.eventbridge.domain.model.rule.EventRule">
+        <result property="accountId" column="account_id"/>
+        <result property="bus" column="eventBusName"/>
+        <result property="name" column="name"/>
+        <result property="description" column="description"/>
+        <result property="filterPattern" column="filter_pattern"/>
+        <result property="status" column="status"/>
+        <result property="gmtCreate" column="gmt_create"/>
+        <result property="gmtModify" column="gmt_modify"/>
+    </resultMap>
+
+
+    <insert id="createEventRule" parameterType="java.util.Map">
+        INSERT INTO
+        <include refid="TABLE_NAME"/>
+        (
+        <include refid="COLUMN_LIST"/>
+        )
+        VALUES
+        (#{accountId},#{eventBusName},#{eventRuleName},#{description},#{filterPattern},#{status},now(),now())
+    </insert>
+
+    <select id="getEventRule" parameterType="java.util.Map" resultMap="resultMap">
+        SELECT
+        <include refid="COLUMN_LIST"/>
+        FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+        AND name = #{eventRuleName}
+        LIMIT 1
+    </select>
+
+    <delete id="deleteEventRule" parameterType="java.util.Map">
+        DELETE
+        FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+        AND name = #{eventRuleName}
+    </delete>
+
+    <select id="getEventRulesCount" parameterType="java.util.Map" resultType="java.lang.Integer">
+        SELECT
+        count(1)
+        FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+    </select>
+
+    <select id="listEventRules" parameterType="java.util.Map" resultMap="resultMap">
+        SELECT
+        <include refid="COLUMN_LIST"/>
+        FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+        LIMIT #{nextToken} , #{maxResults}
+    </select>
+
+    <update id="updateEventRule" parameterType="java.util.Map">
+        UPDATE
+        <include refid="TABLE_NAME"/>
+        <set>
+            gmt_modify = now()
+            <if test="description != null">
+                ,description= #{description}
+            </if>
+            <if test="filterPattern != null">
+                ,filter_pattern= #{filterPattern}
+            </if>
+            <if test="status != null">
+                ,status= #{status}
+            </if>
+        </set>
+        WHERE account_id = #{accountId} AND name = #{eventBusName} AND name = #{eventRuleName}
+    </update>
+
+</mapper>
\ No newline at end of file
diff --git a/adapter/persistence/src/main/resources/mybatis/EventSourceClassMapper.xml b/adapter/persistence/src/main/resources/mybatis/EventSourceClassMapper.xml
new file mode 100644
index 0000000..224d244
--- /dev/null
+++ b/adapter/persistence/src/main/resources/mybatis/EventSourceClassMapper.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="org.apache.rocketmq.eventbridge.adapter.persistence.classes.mybatis.mapper.EventSourceClassMapper">
+
+    <sql id="TABLE_NAME">
+        event_source_class
+    </sql>
+
+    <sql id="COLUMN_LIST">
+        name,api_params,required_params,transform,visual_config,description,gmt_create,gmt_modify
+    </sql>
+    <resultMap id="resultMap"
+               type="org.apache.rocketmq.eventbridge.adapter.persistence.classes.mybatis.dataobject.EventSourceClassDO">
+        <result property="name" column="name"/>
+        <result property="apiParams" column="api_params"/>
+        <result property="requiredParams" column="required_params"/>
+        <result property="transform" column="transform"/>
+        <result property="visualConfig" column="visual_config"/>
+        <result property="description" column="description"/>
+        <result property="gmtCreate" column="gmt_create"/>
+        <result property="gmtModify" column="gmt_modify"/>
+    </resultMap>
+
+    <select id="getEventSourceClass" resultMap="resultMap">
+        SELECT
+        <include refid="COLUMN_LIST"/>
+        FROM
+        <include refid="TABLE_NAME"/>
+        WHERE name = #{name}
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/adapter/persistence/src/main/resources/mybatis/EventSourceMapper.xml b/adapter/persistence/src/main/resources/mybatis/EventSourceMapper.xml
new file mode 100644
index 0000000..9de32fd
--- /dev/null
+++ b/adapter/persistence/src/main/resources/mybatis/EventSourceMapper.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="org.apache.rocketmq.eventbridge.adapter.persistence.source.mybatis.mapper.EventSourceMapper">
+
+    <sql id="TABLE_NAME">
+        event_source
+    </sql>
+
+    <sql id="COLUMN_LIST">
+        account_id,bus,name,description,status,type,class_name,config,gmt_create,gmt_modify
+    </sql>
+    <resultMap id="resultMap"
+               type="org.apache.rocketmq.eventbridge.adapter.persistence.source.mybatis.dataobject.EventSourceDO">
+        <result property="accountId" column="account_id"/>
+        <result property="eventBusName" column="bus"/>
+        <result property="name" column="name"/>
+        <result property="description" column="description"/>
+        <result property="status" column="status"/>
+        <result property="type" column="type"/>
+        <result property="className" column="class_name"/>
+        <result property="config" column="config"/>
+        <result property="gmtCreate" column="gmt_create"/>
+        <result property="gmtModify" column="gmt_modify"/>
+    </resultMap>
+
+
+    <insert id="createEventSource" parameterType="java.util.Map">
+        INSERT INTO
+        <include refid="TABLE_NAME"/>
+        (
+        <include refid="COLUMN_LIST"/>
+        )
+        VALUES
+        (#{accountId},#{eventBusName},#{eventSourceName},#{description},#{status},#{type},#{className},#{config},now(),now())
+    </insert>
+
+
+    <select id="listEventSources" parameterType="java.util.Map" resultMap="resultMap">
+        SELECT
+        <include refid="COLUMN_LIST"/>
+        FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+        LIMIT #{nextToken}, #{maxResults}
+    </select>
+
+    <select id="getEventSource" parameterType="java.util.Map" resultMap="resultMap">
+        SELECT
+        <include refid="COLUMN_LIST"/>
+        FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+        AND name = #{eventSourceName}
+    </select>
+
+    <select id="getEventSourceCount" parameterType="java.util.Map" resultType="java.lang.Integer">
+        SELECT
+        count(1)
+        FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+    </select>
+
+    <delete id="deleteEventSource">
+        DELETE FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+        AND name = #{eventSourceName}
+    </delete>
+
+    <update id="updateEventSource">
+        UPDATE
+        <include refid="TABLE_NAME"/>
+        <set>
+            gmt_modify = now(),
+            <if test="description != null">
+                description= #{description}
+            </if>
+            <if test="status != null">
+                status= #{status}
+            </if>
+            <if test="config != null">
+                type= #{config}
+            </if>
+        </set>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+        AND name = #{eventSourceName}
+    </update>
+
+</mapper>
\ No newline at end of file
diff --git a/adapter/persistence/src/main/resources/mybatis/EventSourceRunnerMapper.xml b/adapter/persistence/src/main/resources/mybatis/EventSourceRunnerMapper.xml
new file mode 100644
index 0000000..2d06dde
--- /dev/null
+++ b/adapter/persistence/src/main/resources/mybatis/EventSourceRunnerMapper.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="org.apache.rocketmq.eventbridge.adapter.persistence.source.mybatis.mapper.EventSourceRunnerMapper">
+
+    <sql id="TABLE_NAME">
+        event_source_runner
+    </sql>
+
+    <sql id="COLUMN_LIST">
+        account_id,bus,source,run_context,gmt_create,gmt_modify
+    </sql>
+    <resultMap id="resultMap"
+               type="org.apache.rocketmq.eventbridge.adapter.persistence.source.mybatis.dataobject.EventSourceRunnerDO">
+        <result property="accountId" column="account_id"/>
+        <result property="bus" column="bus"/>
+        <result property="source" column="source"/>
+        <result property="runContext" column="run_context"/>
+        <result property="gmtCreate" column="gmt_create"/>
+        <result property="gmtModify" column="gmt_modify"/>
+    </resultMap>
+
+
+    <insert id="createEventSourceRunner" parameterType="java.util.Map">
+        INSERT INTO
+        <include refid="TABLE_NAME"/>
+        (
+        <include refid="COLUMN_LIST"/>
+        )
+        VALUES
+        (#{accountId},#{eventBusName},#{eventSourceName},#{runContext},now(),now())
+    </insert>
+
+    <select id="getEventSourceRunner" parameterType="java.util.Map" resultMap="resultMap">
+        SELECT
+        <include refid="COLUMN_LIST"/>
+        FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+        AND source = #{eventSourceName}
+    </select>
+
+
+    <delete id="deleteEventSourceRunner">
+        DELETE FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+        AND source = #{eventSourceName}
+    </delete>
+
+    <update id="updateEventSourceRunner">
+        UPDATE
+        <include refid="TABLE_NAME"/>
+        <set>
+            gmt_modify = now()
+            <if test="runContext != null">
+                ,run_context= #{runContext}
+            </if>
+        </set>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+        AND source = #{eventSourceName}
+    </update>
+
+</mapper>
\ No newline at end of file
diff --git a/adapter/persistence/src/main/resources/mybatis/EventTargetClassMapper.xml b/adapter/persistence/src/main/resources/mybatis/EventTargetClassMapper.xml
new file mode 100644
index 0000000..c4d3725
--- /dev/null
+++ b/adapter/persistence/src/main/resources/mybatis/EventTargetClassMapper.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="org.apache.rocketmq.eventbridge.adapter.persistence.classes.mybatis.mapper.EventTargetClassMapper">
+
+    <sql id="TABLE_NAME">
+        event_target_class
+    </sql>
+
+    <sql id="COLUMN_LIST">
+        name,api_params,target_transform,required_params,visual_config,description,gmt_create,gmt_modify
+    </sql>
+    <resultMap id="resultMap"
+               type="org.apache.rocketmq.eventbridge.adapter.persistence.classes.mybatis.dataobject.EventTargetClassDO">
+        <result property="name" column="name"/>
+        <result property="apiParams" column="api_params"/>
+        <result property="targetTransform" column="target_transform"/>
+        <result property="requiredParams" column="required_params"/>
+        <result property="visualConfig" column="visual_config"/>
+        <result property="description" column="description"/>
+        <result property="gmtCreate" column="gmt_create"/>
+        <result property="gmtModify" column="gmt_modify"/>
+    </resultMap>
+
+    <select id="getEventTargetClass" resultMap="resultMap">
+        SELECT
+        <include refid="COLUMN_LIST"/>
+        FROM
+        <include refid="TABLE_NAME"/>
+        WHERE name = #{name}
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/adapter/persistence/src/main/resources/mybatis/EventTargetMapper.xml b/adapter/persistence/src/main/resources/mybatis/EventTargetMapper.xml
new file mode 100644
index 0000000..5b9c0da
--- /dev/null
+++ b/adapter/persistence/src/main/resources/mybatis/EventTargetMapper.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="org.apache.rocketmq.eventbridge.adapter.persistence.target.mybatis.mapper.EventTargetMapper">
+
+    <sql id="TABLE_NAME">
+        event_target
+    </sql>
+
+    <sql id="COLUMN_LIST">
+        account_id,bus,rule,name,class_name,config,run_options,gmt_create,gmt_modify
+    </sql>
+    <resultMap id="resultMap"
+               type="org.apache.rocketmq.eventbridge.adapter.persistence.target.mybatis.dataobject.EventTargetDO">
+        <result property="accountId" column="account_id"/>
+        <result property="eventBusName" column="bus"/>
+        <result property="eventRuleName" column="rule"/>
+        <result property="eventTargetName" column="name"/>
+        <result property="className" column="class_name"/>
+        <result property="config" column="config"/>
+        <result property="runOptions" column="run_options"/>
+        <result property="gmtCreate" column="gmt_create"/>
+        <result property="gmtModify" column="gmt_modify"/>
+    </resultMap>
+
+
+    <insert id="createEventTarget" parameterType="java.util.Map">
+        INSERT INTO
+        <include refid="TABLE_NAME"/>
+        (
+        <include refid="COLUMN_LIST"/>
+        )
+        VALUES
+        (#{accountId},#{eventBusName},#{eventRuleName},#{eventTargetName},#{className},#{config},#{runOptions},now(),now())
+    </insert>
+
+    <select id="getEventTarget" parameterType="java.util.Map" resultMap="resultMap">
+        SELECT
+        <include refid="COLUMN_LIST"/>
+        FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+        AND rule = #{eventRuleName}
+        AND name = #{eventTargetName}
+    </select>
+
+    <select id="listEventTargets" parameterType="java.util.Map" resultMap="resultMap">
+        SELECT
+        <include refid="COLUMN_LIST"/>
+        FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+        AND rule = #{eventRuleName}
+    </select>
+
+    <delete id="deleteEventTarget">
+        DELETE FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+        AND rule = #{eventRuleName}
+        AND name = #{eventTargetName}
+    </delete>
+
+    <update id="updateEventTarget">
+        UPDATE
+        <include refid="TABLE_NAME"/>
+        <set>
+            gmt_modify = now()
+            <if test="config != null">
+                ,config= #{config}
+            </if>
+            <if test="runOptions != null">
+                ,run_options= #{runOptions}
+            </if>
+        </set>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+        AND rule = #{eventRuleName}
+        AND name = #{eventTargetName}
+    </update>
+
+</mapper>
\ No newline at end of file
diff --git a/adapter/persistence/src/main/resources/mybatis/EventTargetRunnerMapper.xml b/adapter/persistence/src/main/resources/mybatis/EventTargetRunnerMapper.xml
new file mode 100644
index 0000000..3251138
--- /dev/null
+++ b/adapter/persistence/src/main/resources/mybatis/EventTargetRunnerMapper.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="org.apache.rocketmq.eventbridge.adapter.persistence.target.mybatis.mapper.EventTargetRunnerMapper">
+
+    <sql id="TABLE_NAME">
+        event_target_runner
+    </sql>
+
+    <sql id="COLUMN_LIST">
+        account_id,bus,rule,target,run_context,gmt_create,gmt_modify
+    </sql>
+    <resultMap id="resultMap"
+               type="org.apache.rocketmq.eventbridge.adapter.persistence.target.mybatis.dataobject.EventTargetRunnerDO">
+        <result property="accountId" column="account_id"/>
+        <result property="eventBusName" column="bus"/>
+        <result property="eventRuleName" column="rule"/>
+        <result property="eventTargetName" column="target"/>
+        <result property="runContext" column="run_context"/>
+        <result property="gmtCreate" column="gmt_create"/>
+        <result property="gmtModify" column="gmt_modify"/>
+    </resultMap>
+
+
+    <insert id="createEventTargetRunner" parameterType="java.util.Map">
+        INSERT INTO
+        <include refid="TABLE_NAME"/>
+        (
+        <include refid="COLUMN_LIST"/>
+        )
+        VALUES
+        (#{accountId},#{eventBusName},#{eventRuleName},#{eventTargetName},#{runContext},now(),now())
+    </insert>
+
+    <select id="getEventTargetRunner" parameterType="java.util.Map" resultMap="resultMap">
+        SELECT
+        <include refid="COLUMN_LIST"/>
+        FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+        AND rule = #{eventRuleName}
+        AND target = #{eventTargetName}
+    </select>
+
+    <select id="listEventTargetRunners" parameterType="java.util.Map" resultMap="resultMap">
+        SELECT
+        <include refid="COLUMN_LIST"/>
+        FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+        AND rule = #{eventRuleName}
+    </select>
+
+    <delete id="deleteEventTargetRunner">
+        DELETE FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+        AND rule = #{eventRuleName}
+        AND target = #{eventTargetName}
+    </delete>
+
+    <update id="updateEventTargetRunner">
+        UPDATE
+        <include refid="TABLE_NAME"/>
+        <set>
+            gmt_modify = now()
+            <if test="runContext != null">
+                ,run_context= #{runContext}
+            </if>
+        </set>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+        AND rule = #{eventRuleName}
+        AND target = #{eventTargetName}
+    </update>
+
+</mapper>
\ No newline at end of file
diff --git a/adapter/persistence/src/main/resources/mybatis/EventTopicMapper.xml b/adapter/persistence/src/main/resources/mybatis/EventTopicMapper.xml
new file mode 100644
index 0000000..edc8522
--- /dev/null
+++ b/adapter/persistence/src/main/resources/mybatis/EventTopicMapper.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="org.apache.rocketmq.eventbridge.adapter.persistence.data.mybatis.mapper.EventTopicMapper">
+
+    <sql id="TABLE_NAME">
+        event_topic
+    </sql>
+
+    <sql id="COLUMN_LIST">
+        account_id,bus,name,msg_ttl,cluster,status,gmt_create,gmt_modify
+    </sql>
+    <resultMap id="resultMap"
+               type="org.apache.rocketmq.eventbridge.adapter.persistence.data.mybatis.dataobject.EventTopicDO">
+        <result property="accountId" column="account_id"/>
+        <result property="eventBusName" column="bus"/>
+        <result property="name" column="name"/>
+        <result property="msgTtl" column="msg_ttl"/>
+        <result property="cluster" column="cluster"/>
+        <result property="status" column="status"/>
+        <result property="gmtCreate" column="gmt_create"/>
+        <result property="gmtModify" column="gmt_modify"/>
+    </resultMap>
+
+    <insert id="createTopic" parameterType="java.util.Map">
+        INSERT INTO
+        <include refid="TABLE_NAME"/>
+        (
+        <include refid="COLUMN_LIST"/>
+        )
+        VALUES
+        (#{accountId},#{eventBusName},#{topicName},86400,#{clusterName},1,now(),now())
+    </insert>
+
+    <delete id="deleteTopic">
+        DELETE FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId} AND name = #{eventBusName}
+    </delete>
+
+    <select id="getTopic" parameterType="java.util.Map" resultMap="resultMap">
+        SELECT
+        <include refid="COLUMN_LIST"/>
+        FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId} AND bus = #{eventBusName}
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/adapter/persistence/src/main/resources/mybatis/EventTypeMapper.xml b/adapter/persistence/src/main/resources/mybatis/EventTypeMapper.xml
new file mode 100644
index 0000000..4fbe3ff
--- /dev/null
+++ b/adapter/persistence/src/main/resources/mybatis/EventTypeMapper.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="org.apache.rocketmq.eventbridge.adapter.persistence.type.mybatis.mapper.EventTypeMapper">
+
+    <sql id="TABLE_NAME">
+        event_type
+    </sql>
+
+    <sql id="COLUMN_LIST">
+        account_id,bus,source,name,description,gmt_create,gmt_modify
+    </sql>
+    <resultMap id="resultMap" type="org.apache.rocketmq.eventbridge.domain.model.source.EventType">
+        <result property="accountId" column="account_id"/>
+        <result property="bus" column="eventBusName"/>
+        <result property="source" column="eventSourceName"/>
+        <result property="name" column="eventTypeName"/>
+        <result property="description" column="description"/>
+        <result property="gmtCreate" column="gmt_create"/>
+        <result property="gmtModify" column="gmt_modify"/>
+    </resultMap>
+
+
+    <insert id="createEventType" parameterType="java.util.Map">
+        INSERT INTO
+        <include refid="TABLE_NAME"/>
+        (
+        <include refid="COLUMN_LIST"/>
+        )
+        VALUES
+        (#{accountId},#{eventBusName},#{eventSourceName},#{eventTypeName},#{description},now(),now())
+    </insert>
+
+
+    <select id="listEventTypes" parameterType="java.util.Map" resultMap="resultMap">
+        SELECT
+        <include refid="COLUMN_LIST"/>
+        FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+        AND source = #{eventSourceName}
+        LIMIT #{nextToken} #{maxResults}
+    </select>
+
+    <select id="getEventTypeCount" parameterType="java.util.Map" resultType="java.lang.Integer">
+        SELECT
+        <include refid="COLUMN_LIST"/>
+        FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+        AND source = #{eventSourceName}
+    </select>
+
+
+    <delete id="deleteEventType">
+        DELETE FROM
+        <include refid="TABLE_NAME"/>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+        AND source = #{eventSourceName}
+        AND name = #{eventTypeName}
+    </delete>
+
+    <update id="updateEventType">
+        UPDATE
+        <include refid="TABLE_NAME"/>
+        <set>
+            gmt_modify = now()
+            <if test="description != null">
+                ,description= #{description}
+            </if>
+        </set>
+        WHERE account_id = #{accountId}
+        AND bus = #{eventBusName}
+        AND source = #{eventSourceName}
+        AND name = #{eventTypeName}
+    </update>
+
+</mapper>
\ No newline at end of file
diff --git a/adapter/pom.xml b/adapter/pom.xml
new file mode 100644
index 0000000..ded0e28
--- /dev/null
+++ b/adapter/pom.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>rocketmq-eventbridge</artifactId>
+        <groupId>org.apache.rocketmq</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>rocketmq-eventbridge-adapter</artifactId>
+    <packaging>pom</packaging>
+
+    <modules>
+        <module>persistence</module>
+        <module>api</module>
+        <module>rpc</module>
+    </modules>
+
+</project>
\ No newline at end of file
diff --git a/adapter/rpc/README.md b/adapter/rpc/README.md
new file mode 100644
index 0000000..e69de29
diff --git a/adapter/rpc/pom.xml b/adapter/rpc/pom.xml
new file mode 100644
index 0000000..e055d5b
--- /dev/null
+++ b/adapter/rpc/pom.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>rocketmq-eventbridge-adapter</artifactId>
+        <groupId>org.apache.rocketmq</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>rocketmq-eventbridge-adapter-rpc</artifactId>
+
+    <properties>
+        <rocketmq.version>4.9.2</rocketmq.version>
+        <httpclient.version>4.5.12</httpclient.version>
+    </properties>
+
+    <version>1.0.0-SNAPSHOT</version>
+    <dependencies>
+        <!-- Project Modules -->
+        <dependency>
+            <groupId>org.apache.rocketmq</groupId>
+            <artifactId>rocketmq-eventbridge-adapter-persistence</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.rocketmq</groupId>
+            <artifactId>rocketmq-eventbridge-domain</artifactId>
+        </dependency>
+        <!-- Framework-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-autoconfigure</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+        </dependency>
+        <!-- Tools-->
+        <dependency>
+            <groupId>org.apache.rocketmq</groupId>
+            <artifactId>rocketmq-client</artifactId>
+            <version>${rocketmq.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>${httpclient.version}</version>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/config/RpcConfiguration.java b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/config/RpcConfiguration.java
new file mode 100644
index 0000000..837332d
--- /dev/null
+++ b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/config/RpcConfiguration.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.rpc.config;
+
+public class RpcConfiguration {
+
+}
diff --git a/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/AccountAPIImpl.java b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/AccountAPIImpl.java
new file mode 100644
index 0000000..b3a4fac
--- /dev/null
+++ b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/AccountAPIImpl.java
@@ -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.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.rpc.impl;
+
+import org.apache.rocketmq.eventbridge.domain.rpc.AccountAPI;
+import org.springframework.stereotype.Component;
+
+@Component
+public class AccountAPIImpl implements AccountAPI {
+    public static final String HEADER_KEY_LOGIN_ACCOUNT_ID = "loginAccountId";
+    public static final String HEADER_KEY_PARENT_ACCOUNT_ID = "parentAccountId";
+    public static final String HEADER_KEY_RESOURCE_OWNER_ACCOUNT_ID = "resourceOwnerAccountId";
+
+    @Override
+    public String getLoginAccountId() {
+        return null;
+    }
+
+    @Override
+    public String getParentAccountId() {
+        return null;
+    }
+
+    @Override
+    public String getResourceOwnerAccountId() {
+        return "1439989007797786";
+    }
+
+    @Override
+    public boolean isParentAccount() {
+        return false;
+    }
+}
diff --git a/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/AppConfigAPIImpl.java b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/AppConfigAPIImpl.java
new file mode 100644
index 0000000..4852e15
--- /dev/null
+++ b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/AppConfigAPIImpl.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.rpc.impl;
+
+import java.util.Set;
+
+import com.google.common.collect.Sets;
+import org.apache.rocketmq.eventbridge.config.AppConfig;
+import org.apache.rocketmq.eventbridge.config.GlobalConfig;
+import org.springframework.stereotype.Component;
+
+@Component
+public class AppConfigAPIImpl {
+
+    public AppConfigAPIImpl() {
+        GlobalConfig globalConfig = new GlobalConfig();
+        globalConfig.setGetEventBusExtensionKey("aliyuneventbusname");
+
+        Set<String> extensionKeys = Sets.newHashSet();
+        extensionKeys.add("aliyuneventbusname");
+        globalConfig.setEventExtensionKeys(extensionKeys);
+        AppConfig.refresh(globalConfig);
+    }
+}
diff --git a/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/RocketMQEventDataAPIImpl.java b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/RocketMQEventDataAPIImpl.java
new file mode 100644
index 0000000..981c20f
--- /dev/null
+++ b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/RocketMQEventDataAPIImpl.java
@@ -0,0 +1,149 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.rpc.impl;
+
+import java.net.URI;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import com.google.common.collect.Maps;
+import com.google.gson.Gson;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.rocketmq.common.message.Message;
+import org.apache.rocketmq.eventbridge.adapter.persistence.rpc.EventDataOnRocketMQConnectAPI;
+import org.apache.rocketmq.eventbridge.config.AppConfig;
+import org.apache.rocketmq.eventbridge.event.EventBridgeEvent;
+import org.apache.rocketmq.eventbridge.exception.EventBridgeException;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import static org.apache.rocketmq.eventbridge.exception.code.EventErrorCode.EventSizeExceed;
+
+@Component
+public class RocketMQEventDataAPIImpl implements EventDataOnRocketMQConnectAPI {
+
+    public static final String PROPERTY_ATTRIBUTE_EVENT_ID = "id";
+    public static final String PROPERTY_ATTRIBUTE_EVENT_SOURCE = "source";
+    public static final String PROPERTY_ATTRIBUTE_EVENT_TYPE = "type";
+    public static final String PROPERTY_ATTRIBUTE_EVENT_SUBJECT = "subject";
+    public static final String PROPERTY_ATTRIBUTE_EVENT_SPECVERSION = "specversion";
+    public static final String PROPERTY_ATTRIBUTE_EVENT_DATACONTENTTYPE = "datacontenttype";
+    public static final String PROPERTY_ATTRIBUTE_EVENT_DATASCHEMA = "dataschema";
+    public static final String PROPERTY_ATTRIBUTE_EVENT_TIME = "time";
+    public static final String PROPERTY_USEREXT_KEY = "USEREXT_KEY";
+
+    @Override
+    public Message converter(String accountId, String topicName, EventBridgeEvent eventBridgeEvent) {
+
+        Message rocketMQMsg = new Message();
+        rocketMQMsg.setTopic(topicName);
+        rocketMQMsg.setKeys(eventBridgeEvent.getId());
+
+        int size = fillEvent(rocketMQMsg, eventBridgeEvent);
+
+        if (size > AppConfig.getGlobalConfig()
+            .getEventSizeUpLimit()) {
+            throw new EventBridgeException(EventSizeExceed, size, AppConfig.getGlobalConfig()
+                .getEventSizeUpLimit());
+        }
+        return rocketMQMsg;
+    }
+
+    public static int fillEvent(Message rocketMQMsg, EventBridgeEvent eventBridgeEvent) {
+        int size = 0;
+        if (eventBridgeEvent.getData() != null) {
+            rocketMQMsg.setBody(eventBridgeEvent.getData());
+            size += rocketMQMsg.getBody().length;
+        }
+        size += fillEventAttribues(rocketMQMsg, eventBridgeEvent);
+        size += fillExtension(rocketMQMsg, eventBridgeEvent.getExtensions());
+        return size;
+    }
+
+    public static int fillEventAttribues(Message rocketMQMsg, EventBridgeEvent eventBridgeEvent) {
+        int totalLength = 0;
+        totalLength += putIfPresent(PROPERTY_ATTRIBUTE_EVENT_ID, eventBridgeEvent.getId(), rocketMQMsg);
+        totalLength += putIfPresent(PROPERTY_ATTRIBUTE_EVENT_SOURCE, eventBridgeEvent.getSource(), rocketMQMsg);
+        totalLength += putIfPresent(PROPERTY_ATTRIBUTE_EVENT_TYPE, eventBridgeEvent.getType(), rocketMQMsg);
+        totalLength += putIfPresent(PROPERTY_ATTRIBUTE_EVENT_SUBJECT, eventBridgeEvent.getSubject(), rocketMQMsg);
+        totalLength += putIfPresent(PROPERTY_ATTRIBUTE_EVENT_SPECVERSION, eventBridgeEvent.getSpecversion(),
+            rocketMQMsg);
+        totalLength += putIfPresent(PROPERTY_ATTRIBUTE_EVENT_DATACONTENTTYPE, eventBridgeEvent.getDatacontenttype(),
+            rocketMQMsg);
+        totalLength += putIfPresent(PROPERTY_ATTRIBUTE_EVENT_DATASCHEMA, eventBridgeEvent.getDataschema(), rocketMQMsg);
+        totalLength += putIfPresent(PROPERTY_ATTRIBUTE_EVENT_TIME, eventBridgeEvent.getTime(), rocketMQMsg);
+        return totalLength;
+    }
+
+    private static int putIfPresent(String key, Object value, Message rocketMQMsg) {
+        int len = 0;
+        if (value instanceof String && StringUtils.isNotEmpty((String)value)) {
+            rocketMQMsg.putUserProperty(key, (String)value);
+            len = key.length() + ((String)value).length() + 2;
+        } else if (value instanceof Number) {
+            String str = String.valueOf(value);
+            rocketMQMsg.putUserProperty(key, str);
+            len = key.length() + str.length() + 2;
+        } else if (value instanceof URI) {
+            String str = value.toString();
+            rocketMQMsg.putUserProperty(key, str);
+            len = key.length() + str.length() + 2;
+        } else if (value instanceof ZonedDateTime) {
+            String str = ((ZonedDateTime)value).format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
+            rocketMQMsg.putUserProperty(key, str);
+            len = key.length() + str.length() + 2;
+        }
+        return len;
+    }
+
+    private static int fillExtension(Message rocketMQMsg, Map<String, ?> extensions) {
+        AtomicInteger totalLength = new AtomicInteger();
+        if (CollectionUtils.isEmpty(extensions)) {
+            return totalLength.get();
+        }
+        Map<String, Object> userExtension = Maps.newHashMap();
+        extensions.entrySet()
+            .stream()
+            .forEach(entry -> {
+                if (AppConfig.getGlobalConfig()
+                    .getEventExtensionKeys()
+                    .contains(entry.getKey())) {
+                    totalLength.addAndGet(putIfPresent(entry.getKey(), entry.getValue(), rocketMQMsg));
+                } else {
+                    userExtension.put(entry.getKey(), entry.getValue());
+                }
+            });
+        totalLength.addAndGet(putIfPresent(PROPERTY_USEREXT_KEY, new Gson().toJson(userExtension), rocketMQMsg));
+        return totalLength.get();
+    }
+
+    /**
+     * 1184866284240688%default_acs.arms_1603954493994
+     *
+     * @param accountId
+     * @param eventBusName
+     *
+     * @return
+     */
+    @Override
+    public String buildTopicName(String accountId, String eventBusName) {
+        return "eventbridge%" + accountId + "%" + eventBusName + "_" + System.currentTimeMillis();
+    }
+}
diff --git a/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/RocketMQConnectClient.java b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/RocketMQConnectClient.java
new file mode 100644
index 0000000..1d41d92
--- /dev/null
+++ b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/RocketMQConnectClient.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect;
+
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
+
+import com.google.gson.Gson;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.client.HttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.dto.ConnectStatusResponseEnum;
+import org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.dto.CreateSinkConnectorRequest;
+import org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.dto.CreateSourceConnectorRequest;
+import org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.dto.DeleteConnectorRequest;
+import org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.dto.GetConnectorStatusRequest;
+import org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.dto.StartConnectorRequest;
+import org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.dto.StopConnectorRequest;
+import org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.dto.TransformRequest;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+@Component
+@Slf4j
+public class RocketMQConnectClient {
+
+    private RestTemplate template = null;
+
+    @Value("${rocketmq.connect.endpoint:}")
+    private String rocketMQConnectEndpoint;
+
+    public RocketMQConnectClient() {
+        HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
+        httpRequestFactory.setConnectTimeout(1000);
+        httpRequestFactory.setReadTimeout(2000);
+        HttpClient httpClient = HttpClientBuilder.create()
+            .setMaxConnTotal(100)
+            .setMaxConnPerRoute(10)
+            .build();
+        httpRequestFactory.setHttpClient(httpClient);
+        template = new RestTemplate(httpRequestFactory);
+    }
+
+    @SneakyThrows
+    public String createSourceConnector(String name, String topicName, String sourceClass,
+        Map<String, Object> sourceConfig, List<TransformRequest> transforms) {
+        CreateSourceConnectorRequest request = new CreateSourceConnectorRequest(rocketMQConnectEndpoint);
+        request.setName(name);
+        request.setTopicName(topicName);
+        request.setConnectorClass(sourceClass);
+        request.setConnectorConfig(sourceConfig);
+        request.setTransforms(transforms);
+        log.info("CreateSourceConnector config:{}", new Gson().toJson(request.getRequestObject()));
+        template.postForObject(request.getURI(), request.getRequestObject(), String.class);
+        return name;
+    }
+
+    @SneakyThrows
+    public String createSinkConnector(String name, String topicName, String sinkClass, Map<String, Object> sinkConfig,
+        List<TransformRequest> transforms) {
+        CreateSinkConnectorRequest request = new CreateSinkConnectorRequest(rocketMQConnectEndpoint);
+        request.setName(name);
+        request.setTopicName(topicName);
+        request.setConnectorClass(sinkClass);
+        request.setConnectorConfig(sinkConfig);
+        request.setTransforms(transforms);
+        log.info("CreateSinkConnector config:{}", new Gson().toJson(request.getRequestObject()));
+        template.postForObject(request.getURI(), request.getRequestObject(), String.class);
+        return name;
+    }
+
+    @SneakyThrows
+    public String getConnectorStatus(String connectorName) {
+        GetConnectorStatusRequest request = new GetConnectorStatusRequest(rocketMQConnectEndpoint);
+        request.setName(connectorName);
+        String status = template.getForObject(new URI(request.toString()), String.class);
+        return status;
+    }
+
+    @SneakyThrows
+    public boolean stop(String connectorName) {
+        StopConnectorRequest request = new StopConnectorRequest(rocketMQConnectEndpoint);
+        request.setName(connectorName);
+        String status = template.getForObject(new URI(request.toString()), String.class);
+        return ConnectStatusResponseEnum.valueOf(status)
+            .isStatus();
+    }
+
+    @SneakyThrows
+    public boolean start(String connectorName) {
+        StartConnectorRequest request = new StartConnectorRequest(rocketMQConnectEndpoint);
+        request.setName(connectorName);
+        String status = template.getForObject(new URI(request.toString()), String.class);
+        return ConnectStatusResponseEnum.valueOf(status)
+            .isStatus();
+    }
+}
diff --git a/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/RocketMQConnectSourceRunnerAPIImpl.java b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/RocketMQConnectSourceRunnerAPIImpl.java
new file mode 100644
index 0000000..143f2c6
--- /dev/null
+++ b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/RocketMQConnectSourceRunnerAPIImpl.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect;
+
+import java.util.Map;
+
+import com.google.common.collect.Lists;
+import com.google.gson.Gson;
+import org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.context.RocketMQConnectTargetRunnerContext;
+import org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.dto.TransformRequest;
+import org.apache.rocketmq.eventbridge.domain.common.enums.EventSourceStatusEnum;
+import org.apache.rocketmq.eventbridge.domain.model.Component;
+import org.apache.rocketmq.eventbridge.domain.model.run.RunOptions;
+import org.apache.rocketmq.eventbridge.domain.repository.EventDataRepository;
+import org.apache.rocketmq.eventbridge.domain.rpc.SourceRunnerAPI;
+import org.springframework.stereotype.Service;
+
+@Service
+public class RocketMQConnectSourceRunnerAPIImpl extends RocketMQConverter implements SourceRunnerAPI {
+
+    private final RocketMQConnectClient rocketMQConnectClient;
+
+    public RocketMQConnectSourceRunnerAPIImpl(EventDataRepository eventDataRepository,
+        RocketMQConnectClient rocketMQConnectClient) {
+        super(eventDataRepository);
+        this.rocketMQConnectClient = rocketMQConnectClient;
+    }
+
+    @Override
+    public String createAndStartEventSourceRunner(String accountId, String name, Component source,
+        Map<String, Object> transformPattern, Component target, RunOptions runOptions) {
+        String topicName = parseTopicName(target);
+        String sourceClass = super.parseConnectorClass(source);
+        Map<String, Object> sourceConfig = super.parseConnectorConfig(source);
+        TransformRequest cloudEventTransform = this.buildCloudEventTransform(transformPattern);
+        String connectorName = rocketMQConnectClient.createSourceConnector(name, topicName, sourceClass, sourceConfig,
+            Lists.newArrayList(cloudEventTransform));
+        RocketMQConnectTargetRunnerContext context = new RocketMQConnectTargetRunnerContext(connectorName);
+        return new Gson().toJson(context);
+    }
+
+    @Override
+    public EventSourceStatusEnum getEventSourceRunnerStatus(String accountId, String runContext) {
+        RocketMQConnectTargetRunnerContext context = new Gson().fromJson(runContext,
+            RocketMQConnectTargetRunnerContext.class);
+        String status = rocketMQConnectClient.getConnectorStatus(context.getConnectorName());
+        return EventSourceStatusEnum.valueOf(status);
+    }
+
+    @Override
+    public boolean delete(String accountId, String runContext) {
+        RocketMQConnectTargetRunnerContext context = new Gson().fromJson(runContext,
+            RocketMQConnectTargetRunnerContext.class);
+        return rocketMQConnectClient.stop(context.getConnectorName());
+    }
+
+    @Override
+    public boolean pause(String accountId, String runContext) {
+        RocketMQConnectTargetRunnerContext context = new Gson().fromJson(runContext,
+            RocketMQConnectTargetRunnerContext.class);
+        return rocketMQConnectClient.stop(context.getConnectorName());
+    }
+
+    @Override
+    public boolean start(String accountId, String runContext) {
+        RocketMQConnectTargetRunnerContext context = new Gson().fromJson(runContext,
+            RocketMQConnectTargetRunnerContext.class);
+        return rocketMQConnectClient.start(context.getConnectorName());
+    }
+
+    @Override
+    public String updateEventSourceRunner(String accountId, Component source, Map<String, Object> transformPattern,
+        Component target, RunOptions runOptions, String runContext) {
+        return null;
+    }
+
+}
diff --git a/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/RocketMQConnectTargetRunnerAPIImpl.java b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/RocketMQConnectTargetRunnerAPIImpl.java
new file mode 100644
index 0000000..4de3c17
--- /dev/null
+++ b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/RocketMQConnectTargetRunnerAPIImpl.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect;
+
+import java.util.Map;
+
+import com.google.common.collect.Lists;
+import com.google.gson.Gson;
+import lombok.SneakyThrows;
+import org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.context.RocketMQConnectSourceRunnerContext;
+import org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.context.RocketMQConnectTargetRunnerContext;
+import org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.dto.ActionStatusResponseEnum;
+import org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.dto.TransformRequest;
+import org.apache.rocketmq.eventbridge.domain.common.enums.EventTargetStatusEnum;
+import org.apache.rocketmq.eventbridge.domain.model.Component;
+import org.apache.rocketmq.eventbridge.domain.model.run.RunOptions;
+import org.apache.rocketmq.eventbridge.domain.repository.EventDataRepository;
+import org.apache.rocketmq.eventbridge.domain.rpc.TargetRunnerAPI;
+import org.apache.rocketmq.eventbridge.tools.transform.TransformParam;
+
+@org.springframework.stereotype.Component
+public class RocketMQConnectTargetRunnerAPIImpl extends RocketMQConverter implements TargetRunnerAPI {
+
+    private final RocketMQConnectClient rocketMQConnectClient;
+
+    public RocketMQConnectTargetRunnerAPIImpl(EventDataRepository eventDataRepository,
+        RocketMQConnectClient rocketMQConnectClient) {
+        super(eventDataRepository);
+        this.rocketMQConnectClient = rocketMQConnectClient;
+    }
+
+    @SneakyThrows
+    @Override
+    public String createAndStartEventTargetRunner(String accountId, String name, Component source, Component target,
+        String filterPattern, Map<String, TransformParam> targetTransform, RunOptions runOptions) {
+        String topicName = this.parseTopicName(source);
+        String sinkConnectorClass = this.parseConnectorClass(target);
+        Map<String, Object> sinkConnectorConfig = this.parseConnectorConfig(target);
+        TransformRequest filterTransform = this.buildEventBridgeFilterTransform(filterPattern);
+        TransformRequest eventBridgeTransform = this.buildEventBridgeTransform(targetTransform);
+        String connectorName = rocketMQConnectClient.createSinkConnector(name, topicName, sinkConnectorClass,
+            sinkConnectorConfig, Lists.newArrayList(filterTransform, eventBridgeTransform));
+        RocketMQConnectTargetRunnerContext context = new RocketMQConnectTargetRunnerContext(connectorName);
+        return new Gson().toJson(context);
+
+    }
+
+    @Override
+    public String updateEventTargetRunner(String accountId, String name, Component source, Component target,
+        String filterPattern, Map<String, TransformParam> targetTransform, RunOptions runOptions, String runContext) {
+        String topicName = this.parseTopicName(source);
+        String sinkConnectorClass = this.parseConnectorClass(target);
+        Map<String, Object> sinkConnectorConfig = this.parseConnectorConfig(target);
+        TransformRequest filterTransform = this.buildEventBridgeFilterTransform(filterPattern);
+        TransformRequest eventBridgeTransform = this.buildEventBridgeTransform(targetTransform);
+        //stop
+        this.delete(runContext);
+        //create
+        String connectorName = rocketMQConnectClient.createSinkConnector(name, topicName, sinkConnectorClass,
+            sinkConnectorConfig, Lists.newArrayList(filterTransform, eventBridgeTransform));
+        RocketMQConnectTargetRunnerContext context = new RocketMQConnectTargetRunnerContext(connectorName);
+        return new Gson().toJson(context);
+    }
+
+    @Override
+    public EventTargetStatusEnum getEventTargetRunnerStatus(String runContext) {
+        RocketMQConnectSourceRunnerContext context = new Gson().fromJson(runContext,
+            RocketMQConnectSourceRunnerContext.class);
+        String status = rocketMQConnectClient.getConnectorStatus(context.getConnectorName());
+        return ActionStatusResponseEnum.parseEventTargetStatusEnum(status);
+    }
+
+    @Override
+    public boolean delete(String runContext) {
+        RocketMQConnectSourceRunnerContext context = new Gson().fromJson(runContext,
+            RocketMQConnectSourceRunnerContext.class);
+        return rocketMQConnectClient.stop(context.getConnectorName());
+    }
+
+    @Override
+    public boolean pause(String runContext) {
+        RocketMQConnectSourceRunnerContext context = new Gson().fromJson(runContext,
+            RocketMQConnectSourceRunnerContext.class);
+        return rocketMQConnectClient.stop(context.getConnectorName());
+    }
+
+    @Override
+    public boolean start(String runContext) {
+        RocketMQConnectSourceRunnerContext context = new Gson().fromJson(runContext,
+            RocketMQConnectSourceRunnerContext.class);
+        return rocketMQConnectClient.start(context.getConnectorName());
+    }
+}
diff --git a/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/RocketMQConverter.java b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/RocketMQConverter.java
new file mode 100644
index 0000000..3e262f7
--- /dev/null
+++ b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/RocketMQConverter.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect;
+
+import java.util.Map;
+
+import com.google.common.collect.Maps;
+import com.google.gson.Gson;
+import org.apache.rocketmq.eventbridge.adapter.persistence.data.mybatis.dataobject.EventTopicDO;
+import org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.dto.TransformRequest;
+import org.apache.rocketmq.eventbridge.domain.model.Component;
+import org.apache.rocketmq.eventbridge.domain.repository.EventDataRepository;
+import org.apache.rocketmq.eventbridge.tools.transform.TransformParam;
+
+import static org.apache.rocketmq.eventbridge.config.EventBridgeConstants.ACCOUNT_ID_KEY;
+import static org.apache.rocketmq.eventbridge.config.EventBridgeConstants.EVENT_BUS_NAME_KEY;
+
+public class RocketMQConverter {
+
+    //CloudEvent transform
+    public static final String CLOUD_EVENT_TRANSFORM_NAME = "cloudEvent";
+
+    //Filter transform
+    public static final String FILTER_TRANSFORM_NAME = "filter";
+    public static final String FILTER_TRANSFORM_NAME_KEY = "filterPattern";
+    public static final String FILTER_TRANSFORM_CLASS
+        = "org.apache.rocketmq.connect.transform.eventbridge.EventBridgeFilterTransform";
+
+    //EventBridge transform
+    public static final String EB_TRANSFORM_NAME = "transform";
+    public static final String EB_TRANSFORM_CLASS
+        = "org.apache.rocketmq.connect.transform.eventbridge.EventBridgeTransform";
+
+    public static final String EB_CLOUD_EVENTTRANSFORM_CLASS
+        = "org.apache.rocketmq.connect.transform.eventbridge.CloudEventTransform";
+
+    public static final String KEY_CLASS = "class";
+
+    private final EventDataRepository eventDataRepository;
+
+    public RocketMQConverter(EventDataRepository eventDataRepository) {
+        this.eventDataRepository = eventDataRepository;
+    }
+
+    protected TransformRequest buildEventBridgeTransform(Map<String, TransformParam> targetTransform) {
+        Map<String, Object> config = Maps.newHashMap();
+        targetTransform.entrySet()
+            .forEach(entry -> {
+                config.put(entry.getKey(), new Gson().toJson(entry.getValue()));
+            });
+        config.put(KEY_CLASS, EB_TRANSFORM_CLASS);
+        return new TransformRequest(EB_TRANSFORM_NAME, config);
+    }
+
+    protected TransformRequest buildEventBridgeFilterTransform(String filterPattern) {
+        Map<String, Object> config = Maps.newHashMap();
+        config.put(FILTER_TRANSFORM_NAME_KEY, filterPattern);
+        config.put(KEY_CLASS, FILTER_TRANSFORM_CLASS);
+        return new TransformRequest(FILTER_TRANSFORM_NAME, config);
+    }
+
+    protected TransformRequest buildCloudEventTransform(Map<String, Object> transformPattern) {
+        transformPattern.put(KEY_CLASS, EB_CLOUD_EVENTTRANSFORM_CLASS);
+        return new TransformRequest(CLOUD_EVENT_TRANSFORM_NAME, transformPattern);
+    }
+
+    protected Map<String, Object> parseConnectorConfig(Component component) {
+        return component.getConfig();
+    }
+
+    protected String parseConnectorClass(Component component) {
+        return (String)component.getConfig()
+            .get(KEY_CLASS);
+    }
+
+    protected String parseTopicName(Component source) {
+        String eventBusName = (String)(source.getConfig()
+            .get(EVENT_BUS_NAME_KEY));
+        String accountId = (String)(source.getConfig()
+            .get(ACCOUNT_ID_KEY));
+        String persistentContext = eventDataRepository.getEventBusPersistentContext(accountId, eventBusName);
+        EventTopicDO eventTopicDO = new Gson().fromJson(persistentContext, EventTopicDO.class);
+        return eventTopicDO.getName();
+    }
+
+}
diff --git a/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/context/RocketMQConnectSourceRunnerContext.java b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/context/RocketMQConnectSourceRunnerContext.java
new file mode 100644
index 0000000..92fb3f7
--- /dev/null
+++ b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/context/RocketMQConnectSourceRunnerContext.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.context;
+
+import lombok.Data;
+
+public @Data
+class RocketMQConnectSourceRunnerContext {
+
+    private String connectorName;
+
+}
diff --git a/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/context/RocketMQConnectTargetRunnerContext.java b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/context/RocketMQConnectTargetRunnerContext.java
new file mode 100644
index 0000000..eaf5b6c
--- /dev/null
+++ b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/context/RocketMQConnectTargetRunnerContext.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.context;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@AllArgsConstructor
+public @Data class RocketMQConnectTargetRunnerContext {
+
+    private String connectorName;
+
+}
diff --git a/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/ActionStatusResponseEnum.java b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/ActionStatusResponseEnum.java
new file mode 100644
index 0000000..f378976
--- /dev/null
+++ b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/ActionStatusResponseEnum.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.dto;
+
+import com.google.common.base.Strings;
+import org.apache.rocketmq.eventbridge.domain.common.enums.EventSourceStatusEnum;
+import org.apache.rocketmq.eventbridge.domain.common.enums.EventTargetStatusEnum;
+
+public enum ActionStatusResponseEnum {
+    RUNNING("running", EventSourceStatusEnum.ACTIVATED, EventTargetStatusEnum.RUNNING),
+    FAILED("not running", EventSourceStatusEnum.FROZEN, EventTargetStatusEnum.FAILED);
+
+    private String code;
+
+    private EventSourceStatusEnum eventSourceStatusEnum;
+
+    private EventTargetStatusEnum eventTargetStatusEnum;
+
+    ActionStatusResponseEnum(String code, EventSourceStatusEnum eventSourceStatusEnum,
+        EventTargetStatusEnum eventTargetStatusEnum) {
+        this.code = code;
+        this.eventSourceStatusEnum = eventSourceStatusEnum;
+        this.eventTargetStatusEnum = eventTargetStatusEnum;
+    }
+
+    public static ActionStatusResponseEnum parseConnectStatusEnum(String code) {
+        if (Strings.isNullOrEmpty(code)) {
+            return null;
+        }
+        for (ActionStatusResponseEnum connectStatusResponseEnum : ActionStatusResponseEnum.values()) {
+            if (connectStatusResponseEnum.getCode()
+                .equals(code)) {
+                return connectStatusResponseEnum;
+            }
+        }
+        return null;
+    }
+
+    public static EventTargetStatusEnum parseEventTargetStatusEnum(String code) {
+        ActionStatusResponseEnum connectStatusResponseEnum = parseConnectStatusEnum(code);
+        if (connectStatusResponseEnum != null) {
+            return connectStatusResponseEnum.getEventTargetStatusEnum();
+        } else {
+            return null;
+        }
+    }
+
+    public static EventSourceStatusEnum parseEventSourceStatusEnum(String code) {
+        ActionStatusResponseEnum connectStatusResponseEnum = parseConnectStatusEnum(code);
+        if (connectStatusResponseEnum != null) {
+            return connectStatusResponseEnum.getEventSourceStatusEnum();
+        } else {
+            return null;
+        }
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public EventSourceStatusEnum getEventSourceStatusEnum() {
+        return eventSourceStatusEnum;
+    }
+
+    public EventTargetStatusEnum getEventTargetStatusEnum() {
+        return eventTargetStatusEnum;
+    }
+}
diff --git a/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/BaseConnectorRequest.java b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/BaseConnectorRequest.java
new file mode 100644
index 0000000..2099d56
--- /dev/null
+++ b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/BaseConnectorRequest.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.dto;
+
+import lombok.AllArgsConstructor;
+
+@AllArgsConstructor
+public class BaseConnectorRequest {
+    protected String endpoint;
+}
diff --git a/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/ConnectStatusResponseEnum.java b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/ConnectStatusResponseEnum.java
new file mode 100644
index 0000000..c6f45f0
--- /dev/null
+++ b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/ConnectStatusResponseEnum.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.dto;
+
+public enum ConnectStatusResponseEnum {
+    success(true),
+    failed(false);
+
+    private boolean status;
+
+    ConnectStatusResponseEnum(boolean status) {
+        this.status = status;
+    }
+
+    public boolean isStatus() {
+        return status;
+    }
+}
diff --git a/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/CreateSinkConnectorRequest.java b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/CreateSinkConnectorRequest.java
new file mode 100644
index 0000000..78fe6d3
--- /dev/null
+++ b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/CreateSinkConnectorRequest.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.rocketmq.eventbridge.adapter.rpc.impl.connect.dto;
+
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import com.google.common.collect.Maps;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.SneakyThrows;
+
+@Setter
+@Getter
+public class CreateSinkConnectorRequest extends BaseConnectorRequest {
+
+    private String path = "/connectors/%s";
+
+    private String name;
+
+    private String topicName;
+
+    private String connectorClass;
+
+    private List<TransformRequest> transforms;
+
+    private Map<String, Object> connectorConfig;
+
+    public CreateSinkConnectorRequest(String endpoint) {
+        super(endpoint);
+    }
+
+    @SneakyThrows
+    public URI getURI() {
+        return new URI(String.format(endpoint + path, name));
+    }
+
+    public Map<String, Object> getRequestObject() {
+        Map<String, Object> config = Maps.newHashMap();
+        config.put("connector-class", connectorClass);
+        config.put("connect-topicname", topicName);
+        config.put("transforms", String.join(",", transforms.stream()
+            .map(TransformRequest::getName)
+            .collect(Collectors.toList())));
+        transforms.forEach(transform -> {
+            transform.getConfig()
+                .entrySet()
+                .forEach(entry -> {
+                    config.put("transforms" + "-" + transform.getName() + "-" + entry.getKey(), entry.getValue());
+                });
+        });
+        config.putAll(connectorConfig);
+        return config;
+    }
+
+}
diff --git a/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/CreateSourceConnectorRequest.java b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/CreateSourceConnectorRequest.java
new file mode 100644
index 0000000..947b1db
--- /dev/null
+++ b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/CreateSourceConnectorRequest.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.dto;
+
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import com.google.common.collect.Maps;
+import com.google.gson.Gson;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.SneakyThrows;
+
+@Setter
+@Getter
+public class CreateSourceConnectorRequest extends BaseConnectorRequest {
+
+    private String path = "/connectors/%s";
+
+    private String name;
+
+    private String topicName;
+
+    private String connectorClass;
+
+    private List<TransformRequest> transforms;
+
+    private Map<String, Object> connectorConfig;
+
+    public CreateSourceConnectorRequest(String endpoint) {
+        super(endpoint);
+    }
+
+    @SneakyThrows
+    public URI getURI() {
+        return new URI(String.format(endpoint + path, name));
+    }
+
+    public Map<String, Object> getRequestObject() {
+        Map<String, Object> config = Maps.newHashMap();
+        config.put("connector-class", connectorClass);
+        config.put("connect-topicname", topicName);
+        config.put("transforms", String.join(",", transforms.stream()
+            .map(TransformRequest::getName)
+            .collect(Collectors.toList())));
+        transforms.forEach(transform -> {
+            transform.getConfig()
+                .entrySet()
+                .forEach(entry -> {
+                    config.put("transforms" + "-" + transform.getName() + "-" + entry.getKey(), entry.getValue());
+                });
+        });
+        config.putAll(connectorConfig);
+        return config;
+    }
+
+}
diff --git a/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/DeleteConnectorRequest.java b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/DeleteConnectorRequest.java
new file mode 100644
index 0000000..d0c5365
--- /dev/null
+++ b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/DeleteConnectorRequest.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class DeleteConnectorRequest extends BaseConnectorRequest {
+
+    private String path = "/connectors/%s/stop";
+
+    private String name;
+
+    public DeleteConnectorRequest(String endpoint) {
+        super(endpoint);
+    }
+
+    public String toString() {
+        return String.format(endpoint + path, name);
+    }
+}
diff --git a/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/GetConnectorStatusRequest.java b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/GetConnectorStatusRequest.java
new file mode 100644
index 0000000..9a590e5
--- /dev/null
+++ b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/GetConnectorStatusRequest.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class GetConnectorStatusRequest extends BaseConnectorRequest {
+
+    private String path = "/connectors/%s/status";
+
+    private String name;
+
+    public GetConnectorStatusRequest(String endpoint) {
+        super(endpoint);
+    }
+
+    public String toString() {
+        return String.format(endpoint + path, name);
+    }
+}
diff --git a/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/StartConnectorRequest.java b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/StartConnectorRequest.java
new file mode 100644
index 0000000..e73a279
--- /dev/null
+++ b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/StartConnectorRequest.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class StartConnectorRequest extends BaseConnectorRequest {
+
+    private String path = "/connectors/%s/start";
+
+    private String name;
+
+    public StartConnectorRequest(String endpoint) {
+        super(endpoint);
+    }
+
+    public String toString() {
+        return String.format(endpoint + path, name);
+    }
+}
diff --git a/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/StopConnectorRequest.java b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/StopConnectorRequest.java
new file mode 100644
index 0000000..ad99450
--- /dev/null
+++ b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/StopConnectorRequest.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class StopConnectorRequest extends BaseConnectorRequest {
+
+    private String path = "/connectors/%s/stop";
+
+    private String name;
+
+    public StopConnectorRequest(String endpoint) {
+        super(endpoint);
+    }
+
+    public String toString() {
+        return String.format(endpoint + path, name);
+    }
+}
diff --git a/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/TransformRequest.java b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/TransformRequest.java
new file mode 100644
index 0000000..5e1b894
--- /dev/null
+++ b/adapter/rpc/src/main/java/org/apache/rocketmq/eventbridge/adapter/rpc/impl/connect/dto/TransformRequest.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.adapter.rpc.impl.connect.dto;
+
+import java.util.Map;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@AllArgsConstructor
+public @Data  class TransformRequest {
+    private String name;
+    private Map<String, Object> config;
+
+
+}
diff --git a/application/README-CN.md b/application/README-CN.md
new file mode 100644
index 0000000..544e7bc
--- /dev/null
+++ b/application/README-CN.md
@@ -0,0 +1,4 @@
+###  模块职责
+用于存放开源与内部API交互需求不同的部分,相同部分则放在domain核心层。
+* 从原先的链路: api -> domain 
+* 升级为:api -> application -> domain
\ No newline at end of file
diff --git a/application/pom.xml b/application/pom.xml
new file mode 100644
index 0000000..6859714
--- /dev/null
+++ b/application/pom.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>rocketmq-eventbridge</artifactId>
+        <groupId>org.apache.rocketmq</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>rocketmq-eventbridge-application</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
+</project>
\ No newline at end of file
diff --git a/common/README.md b/common/README.md
new file mode 100644
index 0000000..e69de29
diff --git a/common/pom.xml b/common/pom.xml
new file mode 100644
index 0000000..d15e3e2
--- /dev/null
+++ b/common/pom.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>rocketmq-eventbridge</artifactId>
+        <groupId>org.apache.rocketmq</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>rocketmq-eventbridge-common</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-net</groupId>
+            <artifactId>commons-net</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.jayway.jsonpath</groupId>
+            <artifactId>json-path</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.cloudevents</groupId>
+            <artifactId>cloudevents-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.cloudevents</groupId>
+            <artifactId>cloudevents-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-text</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/common/src/main/java/org/apache/rocketmq/eventbridge/config/AppConfig.java b/common/src/main/java/org/apache/rocketmq/eventbridge/config/AppConfig.java
new file mode 100644
index 0000000..f047cec
--- /dev/null
+++ b/common/src/main/java/org/apache/rocketmq/eventbridge/config/AppConfig.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rocketmq.eventbridge.config;
+
+public abstract class AppConfig {
+
+    protected static GlobalConfig globalConfig = new GlobalConfig();
+
+    public static GlobalConfig getGlobalConfig() {
+        return globalConfig;
+    }
+
+    public static void refresh(GlobalConfig globalConfig) {
+        AppConfig.globalConfig = globalConfig;
+    }
+
+}
diff --git a/common/src/main/java/org/apache/rocketmq/eventbridge/config/EventBridgeConstants.java b/common/src/main/java/org/apache/rocketmq/eventbridge/config/EventBridgeConstants.java
new file mode 100644
index 0000000..7cdb5cb
--- /dev/null
+++ b/common/src/main/java/org/apache/rocketmq/eventbridge/config/EventBridgeConstants.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.rocketmq.eventbridge.config;
+
+public class EventBridgeConstants {
+    public static final String EVENT_BUS_NAME_KEY = "eventBusName";
+    public static final String ACCOUNT_ID_KEY = "accountId";
+}
diff --git a/common/src/main/java/org/apache/rocketmq/eventbridge/config/GlobalConfig.java b/common/src/main/java/org/apache/rocketmq/eventbridge/config/GlobalConfig.java
new file mode 100644
index 0000000..67efd06
--- /dev/null
+++ b/common/src/main/java/org/apache/rocketmq/eventbridge/config/GlobalConfig.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rocketmq.eventbridge.config;
+
+import java.util.Set;
+
+import lombok.Data;
+
+public @Data
+class GlobalConfig {
+
+    private Set<String> eventExtensionKeys;
+
+    private String getEventBusExtensionKey;
+
+    private String defaultDataPersistentClusterName;
+
+    private int eventSizeUpLimit = (2 ^ 10) * 64;
+
+
+}
diff --git a/common/src/main/java/org/apache/rocketmq/eventbridge/config/LocalConfig.java b/common/src/main/java/org/apache/rocketmq/eventbridge/config/LocalConfig.java
new file mode 100644
index 0000000..7f5d39a
--- /dev/null
+++ b/common/src/main/java/org/apache/rocketmq/eventbridge/config/LocalConfig.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rocketmq.eventbridge.config;
+
+import lombok.Data;
+
+public @Data
+class LocalConfig {
+
+}
diff --git a/common/src/main/java/org/apache/rocketmq/eventbridge/event/EventBridgeEvent.java b/common/src/main/java/org/apache/rocketmq/eventbridge/event/EventBridgeEvent.java
new file mode 100644
index 0000000..5113b1a
--- /dev/null
+++ b/common/src/main/java/org/apache/rocketmq/eventbridge/event/EventBridgeEvent.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.rocketmq.eventbridge.event;
+
+import java.net.URI;
+import java.time.OffsetDateTime;
+import java.util.Map;
+import java.util.Set;
+
+import com.google.common.collect.Maps;
+import io.cloudevents.SpecVersion;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public @Data
+class EventBridgeEvent {
+
+    private String id;
+    private URI source;
+    private String type;
+    private String datacontenttype;
+    private URI dataschema;
+    private String subject;
+    private OffsetDateTime time;
+    private byte[] data;
+    private String specversion;
+    private Map<String, Object> extensions;
+
+    public static Set<String> getAttributeKeys() {
+        return SpecVersion.V1.getAllAttributes();
+    }
+
+    public Object getExtension(String extensionKey) {
+        if (extensions == null || extensions.isEmpty()) {
+            return null;
+        } else {
+            return extensions.get(extensionKey);
+        }
+    }
+
+    public void addExtension(String extensionKey, Object extensionValue) {
+        if (extensions == null) {
+            extensions = Maps.newHashMap();
+        }
+        extensions.put(extensionKey, extensionValue);
+    }
+
+}
diff --git a/common/src/main/java/org/apache/rocketmq/eventbridge/exception/EventBridgeException.java b/common/src/main/java/org/apache/rocketmq/eventbridge/exception/EventBridgeException.java
new file mode 100644
index 0000000..18007e1
--- /dev/null
+++ b/common/src/main/java/org/apache/rocketmq/eventbridge/exception/EventBridgeException.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.rocketmq.eventbridge.exception;
+
+import java.text.MessageFormat;
+
+import org.apache.rocketmq.eventbridge.exception.code.BaseErrorCode;
+import org.apache.rocketmq.eventbridge.exception.code.DefaultErrorCode;
+
+public class EventBridgeException extends RuntimeException {
+
+    private int httpCode;
+    private String code;
+
+    public EventBridgeException(String msg) {
+        super(MessageFormat.format(DefaultErrorCode.InternalError.getMsg(), msg));
+        this.code = DefaultErrorCode.InternalError.getCode();
+    }
+
+    public EventBridgeException(String msg, Throwable throwable) {
+        super(MessageFormat.format(DefaultErrorCode.InternalError.getMsg(), msg), throwable);
+        this.code = DefaultErrorCode.InternalError.getCode();
+    }
+
+    public EventBridgeException(Throwable throwable) {
+        super(throwable);
+        this.code = DefaultErrorCode.InternalError.getCode();
+    }
+
+    public EventBridgeException(BaseErrorCode errorCode, Throwable throwable, Object... args) {
+        super(MessageFormat.format(errorCode.getMsg(), args), throwable);
+        this.code = errorCode.getCode();
+    }
+
+    public EventBridgeException(BaseErrorCode errorCode, Object... args) {
+        super(MessageFormat.format(errorCode.getMsg(), args));
+        this.code = errorCode.getCode();
+    }
+
+    public String getCode() {
+        return code;
... 12197 lines suppressed ...