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

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


The following commit(s) were added to refs/heads/master by this push:
     new 19dd2b1d5 [Feature #4032] Fix redis codec (#4301)
19dd2b1d5 is described below

commit 19dd2b1d5cc7abd327b808a3707ca4aaafce8b31
Author: Fabian Bao <[email protected]>
AuthorDate: Thu Aug 3 09:20:32 2023 +0800

    [Feature #4032] Fix redis codec (#4301)
    
    * fix: add cloudEventCodec for redis connector.
    
    * fix: add cloudEventCodec for redis connector.
    
    * fix import order.
    
    * fix: add doc.
    
    * fix: adjust cloudevent encode and decode.
---
 .../eventmesh-connector-redis/build.gradle         |  2 ++
 .../redis/cloudevent/CloudEventCodec.java          |  6 ++--
 .../redis/sink/connector/RedisSinkConnector.java   | 39 ++++++++++++++++++++--
 .../source/connector/RedisSourceConnector.java     | 29 ++++++++++++----
 .../src/main/resources/sink-config.yml             |  2 +-
 .../src/main/resources/source-config.yml           |  2 +-
 .../storage/redis/cloudevent/CloudEventCodec.java  |  1 -
 7 files changed, 68 insertions(+), 13 deletions(-)

diff --git a/eventmesh-connectors/eventmesh-connector-redis/build.gradle 
b/eventmesh-connectors/eventmesh-connector-redis/build.gradle
index 8b92940aa..42d3d4ced 100644
--- a/eventmesh-connectors/eventmesh-connector-redis/build.gradle
+++ b/eventmesh-connectors/eventmesh-connector-redis/build.gradle
@@ -20,6 +20,8 @@ dependencies {
 
     implementation 'org.redisson:redisson:3.17.3'
 
+    api 'io.cloudevents:cloudevents-json-jackson'
+
     compileOnly 'org.projectlombok:lombok'
     annotationProcessor 'org.projectlombok:lombok'
 }
\ No newline at end of file
diff --git 
a/eventmesh-storage-plugin/eventmesh-storage-redis/src/main/java/org/apache/eventmesh/storage/redis/cloudevent/CloudEventCodec.java
 
b/eventmesh-connectors/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/cloudevent/CloudEventCodec.java
similarity index 93%
copy from 
eventmesh-storage-plugin/eventmesh-storage-redis/src/main/java/org/apache/eventmesh/storage/redis/cloudevent/CloudEventCodec.java
copy to 
eventmesh-connectors/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/cloudevent/CloudEventCodec.java
index 9db3c43dc..8fb347354 100644
--- 
a/eventmesh-storage-plugin/eventmesh-storage-redis/src/main/java/org/apache/eventmesh/storage/redis/cloudevent/CloudEventCodec.java
+++ 
b/eventmesh-connectors/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/cloudevent/CloudEventCodec.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.storage.redis.cloudevent;
+package org.apache.eventmesh.connector.redis.cloudevent;
 
 import org.redisson.client.codec.BaseCodec;
 import org.redisson.client.protocol.Decoder;
@@ -26,7 +26,9 @@ import io.cloudevents.jackson.JsonFormat;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
 
-
+/**
+ * TODO: Duplicate with 
org.apache.eventmesh.storage.redis.cloudevent.CloudEventCodec
+ */
 public class CloudEventCodec extends BaseCodec {
 
     private static final CloudEventCodec INSTANCE = new CloudEventCodec();
diff --git 
a/eventmesh-connectors/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/sink/connector/RedisSinkConnector.java
 
b/eventmesh-connectors/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/sink/connector/RedisSinkConnector.java
index 58466cc97..1193c0477 100644
--- 
a/eventmesh-connectors/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/sink/connector/RedisSinkConnector.java
+++ 
b/eventmesh-connectors/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/sink/connector/RedisSinkConnector.java
@@ -17,19 +17,24 @@
 
 package org.apache.eventmesh.connector.redis.sink.connector;
 
+import org.apache.eventmesh.connector.redis.cloudevent.CloudEventCodec;
 import org.apache.eventmesh.connector.redis.sink.config.RedisSinkConfig;
 import org.apache.eventmesh.openconnect.api.config.Config;
 import org.apache.eventmesh.openconnect.api.data.ConnectRecord;
 import org.apache.eventmesh.openconnect.api.sink.Sink;
 
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.util.List;
 
 import org.redisson.Redisson;
 import org.redisson.api.RTopic;
 import org.redisson.api.RedissonClient;
 
-import lombok.extern.slf4j.Slf4j;
+import io.cloudevents.CloudEvent;
+import io.cloudevents.core.builder.CloudEventBuilder;
 
+import lombok.extern.slf4j.Slf4j;
 
 @Slf4j
 public class RedisSinkConnector implements Sink {
@@ -50,6 +55,7 @@ public class RedisSinkConnector implements Sink {
         this.sinkConfig = (RedisSinkConfig) config;
         org.redisson.config.Config redisConfig = new 
org.redisson.config.Config();
         
redisConfig.useSingleServer().setAddress(sinkConfig.connectorConfig.getServer());
+        redisConfig.setCodec(CloudEventCodec.getInstance());
         this.redissonClient = Redisson.create(redisConfig);
     }
 
@@ -76,11 +82,40 @@ public class RedisSinkConnector implements Sink {
     @Override
     public void put(List<ConnectRecord> sinkRecords) {
         for (ConnectRecord connectRecord : sinkRecords) {
+            CloudEvent event = convertRecordToEvent(connectRecord);
             try {
-                long publish = topic.publish(connectRecord);
+                long publish = topic.publish(event);
             } catch (Exception e) {
                 log.error("[RedisSinkConnector] sendResult has error : ", e);
             }
         }
     }
+
+    public CloudEvent convertRecordToEvent(ConnectRecord connectRecord) {
+        CloudEventBuilder cloudEventBuilder = CloudEventBuilder.v1()
+                .withData((byte[]) connectRecord.getData());
+        connectRecord.getExtensions().keySet().forEach(s -> {
+            switch (s) {
+                case "id":
+                    cloudEventBuilder.withId(connectRecord.getExtension(s));
+                    break;
+                case "topic":
+                    
cloudEventBuilder.withSubject(connectRecord.getExtension(s));
+                    break;
+                case "source":
+                    try {
+                        cloudEventBuilder.withSource(new 
URI(connectRecord.getExtension(s)));
+                    } catch (URISyntaxException e) {
+                        throw new RuntimeException(e);
+                    }
+                    break;
+                case "type":
+                    cloudEventBuilder.withType(connectRecord.getExtension(s));
+                    break;
+                default:
+                    cloudEventBuilder.withExtension(s, 
connectRecord.getExtension(s));
+            }
+        });
+        return cloudEventBuilder.build();
+    }
 }
diff --git 
a/eventmesh-connectors/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/source/connector/RedisSourceConnector.java
 
b/eventmesh-connectors/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/source/connector/RedisSourceConnector.java
index eca1c23c3..ae0824e16 100644
--- 
a/eventmesh-connectors/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/source/connector/RedisSourceConnector.java
+++ 
b/eventmesh-connectors/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/source/connector/RedisSourceConnector.java
@@ -17,6 +17,7 @@
 
 package org.apache.eventmesh.connector.redis.source.connector;
 
+import org.apache.eventmesh.connector.redis.cloudevent.CloudEventCodec;
 import org.apache.eventmesh.connector.redis.source.config.RedisSourceConfig;
 import org.apache.eventmesh.openconnect.api.config.Config;
 import org.apache.eventmesh.openconnect.api.data.ConnectRecord;
@@ -24,6 +25,7 @@ import org.apache.eventmesh.openconnect.api.source.Source;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
@@ -32,7 +34,7 @@ import org.redisson.Redisson;
 import org.redisson.api.RTopic;
 import org.redisson.api.RedissonClient;
 
-
+import io.cloudevents.CloudEvent;
 
 public class RedisSourceConnector implements Source {
 
@@ -44,7 +46,7 @@ public class RedisSourceConnector implements Source {
 
     private RedissonClient redissonClient;
 
-    private BlockingQueue<ConnectRecord> queue;
+    private BlockingQueue<CloudEvent> queue;
 
     @Override
     public Class<? extends Config> configClass() {
@@ -56,6 +58,7 @@ public class RedisSourceConnector implements Source {
         this.sourceConfig = (RedisSourceConfig) config;
         org.redisson.config.Config redisConfig = new 
org.redisson.config.Config();
         
redisConfig.useSingleServer().setAddress(sourceConfig.connectorConfig.getServer());
+        redisConfig.setCodec(CloudEventCodec.getInstance());
         this.redissonClient = Redisson.create(redisConfig);
         this.queue = new LinkedBlockingQueue<>(1000);
     }
@@ -63,7 +66,7 @@ public class RedisSourceConnector implements Source {
     @Override
     public void start() throws Exception {
         this.topic = 
redissonClient.getTopic(sourceConfig.connectorConfig.getTopic());
-        this.topic.addListener(ConnectRecord.class, (channel, msg) -> {
+        this.topic.addListener(CloudEvent.class, (channel, msg) -> {
             queue.add(msg);
         });
     }
@@ -89,15 +92,29 @@ public class RedisSourceConnector implements Source {
         List<ConnectRecord> connectRecords = new 
ArrayList<>(DEFAULT_BATCH_SIZE);
         for (int count = 0; count < DEFAULT_BATCH_SIZE; ++count) {
             try {
-                ConnectRecord connectRecord = queue.poll(3, TimeUnit.SECONDS);
-                if (connectRecord == null) {
+                CloudEvent event = queue.poll(3, TimeUnit.SECONDS);
+                if (event == null) {
                     break;
                 }
-                connectRecords.add(connectRecord);
+
+                connectRecords.add(convertEventToRecord(event));
             } catch (InterruptedException e) {
                 break;
             }
         }
         return connectRecords;
     }
+
+    public ConnectRecord convertEventToRecord(CloudEvent event) {
+        byte[] body = Objects.requireNonNull(event.getData()).toBytes();
+        ConnectRecord connectRecord = new ConnectRecord(null, null, 
System.currentTimeMillis(), body);
+        for (String extensionName : event.getExtensionNames()) {
+            connectRecord.addExtension(extensionName, 
Objects.requireNonNull(event.getExtension(extensionName)).toString());
+        }
+        connectRecord.addExtension("id", event.getId());
+        connectRecord.addExtension("topic", event.getSubject());
+        connectRecord.addExtension("source", event.getSource().toString());
+        connectRecord.addExtension("type", event.getType());
+        return connectRecord;
+    }
 }
diff --git 
a/eventmesh-connectors/eventmesh-connector-redis/src/main/resources/sink-config.yml
 
b/eventmesh-connectors/eventmesh-connector-redis/src/main/resources/sink-config.yml
index 920f92e22..596006a2a 100644
--- 
a/eventmesh-connectors/eventmesh-connector-redis/src/main/resources/sink-config.yml
+++ 
b/eventmesh-connectors/eventmesh-connector-redis/src/main/resources/sink-config.yml
@@ -27,5 +27,5 @@ pubSubConfig:
 connectorConfig:
     connectorName: redisSink
     server: redis://127.0.0.1:6379
-    topic: TopicTest
+    topic: SinkTopic
 
diff --git 
a/eventmesh-connectors/eventmesh-connector-redis/src/main/resources/source-config.yml
 
b/eventmesh-connectors/eventmesh-connector-redis/src/main/resources/source-config.yml
index 1f08068db..5d31ad0fc 100644
--- 
a/eventmesh-connectors/eventmesh-connector-redis/src/main/resources/source-config.yml
+++ 
b/eventmesh-connectors/eventmesh-connector-redis/src/main/resources/source-config.yml
@@ -27,4 +27,4 @@ pubSubConfig:
 connectorConfig:
     connectorName: redisSource
     server: redis://127.0.0.1:6379
-    topic: TopicTest
+    topic: SourceTopic
diff --git 
a/eventmesh-storage-plugin/eventmesh-storage-redis/src/main/java/org/apache/eventmesh/storage/redis/cloudevent/CloudEventCodec.java
 
b/eventmesh-storage-plugin/eventmesh-storage-redis/src/main/java/org/apache/eventmesh/storage/redis/cloudevent/CloudEventCodec.java
index 9db3c43dc..e05903d46 100644
--- 
a/eventmesh-storage-plugin/eventmesh-storage-redis/src/main/java/org/apache/eventmesh/storage/redis/cloudevent/CloudEventCodec.java
+++ 
b/eventmesh-storage-plugin/eventmesh-storage-redis/src/main/java/org/apache/eventmesh/storage/redis/cloudevent/CloudEventCodec.java
@@ -26,7 +26,6 @@ import io.cloudevents.jackson.JsonFormat;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
 
-
 public class CloudEventCodec extends BaseCodec {
 
     private static final CloudEventCodec INSTANCE = new CloudEventCodec();


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to