Setup a simple RedisClientCloudEndpoint, a wire graph and a redis-server.
In this tutorial we will set up a simple RedisClientCloudEndpoint
that connects to a running Redis server without authentication. We will set up a RedisClientPublisher
that publishes data in json format on a test topic and a RedisClientSubscriber
that receives data on the same topic. In order to watch the data flow we will use a Wire Graph.
Install the com.eurotech.framework.redis.client.feature
Install the com.eurotech.framework.redis.client.feature package
from the Eclipse Marketplace using the Packages section in the ESF Web UI. For the purpose of this tutorial we will also install the package com.eurotech.wire.script.filter
to leverage on the Javascript Filter for data generation.
Create a RedisClientCloudEndpoint
Create a RedisClientCloudEndpoint
from the Cloud Connections section in the ESF Web UI changing the following properties as described:
- In
RedisClientCloudEndpoint-PREFIX
change the Payload Encoding to Simple JSON - In
RedisClientDataService-PREFIX
change the Connect Auto-on-startup to true and Connect Retry-interval to 10 - In
RedisClientDataTransport-PREFIX
change the Server URIs toredis://<redis-server-ip>:<redis-server-port>
where redis-server-ip need to be the host where Redis is running and redis-server-port the port where the server is listening for connection (e.g.redis://localhost:6379
). Change the Authentication Method to No Authentication.
After selecting the new created RedisClientCloudEndpoint
, create a new RedisClientPublisher
using the New Pub/Sub button on top menu. Configure the publisher with the following properties:
- Producer topic: test
- Publish metrics: true
Create a new RedisClientSubscriber
using test
as Subscriber topic.
You can use the following partial snapshot to re-create the above configuration paying attention to replacing the Server URIs in the RedisClientDataTransport-1
with the right one:
<esf:configuration pid="com.eurotech.framework.redis.client.cloudconnection.RedisClientCloudEndpoint-1">
<esf:properties>
<esf:property array="false" encrypted="false" name="encode.gzip" type="Boolean">
<esf:value>false</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="DataService.target" type="String">
<esf:value>(kura.service.pid=com.eurotech.framework.redis.client.cloudconnection.RedisClientDataService-1)</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="payload.encoding" type="String">
<esf:value>simple-json</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="cloud.connection.factory.pid" type="String">
<esf:value>com.eurotech.framework.redis.client.cloudconnection.RedisClientCloudConnectionFactory</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="service.factoryPid" type="String">
<esf:value>com.eurotech.framework.redis.client.cloudconnection.RedisClientCloudEndpoint</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="kura.service.pid" type="String">
<esf:value>com.eurotech.framework.redis.client.cloudconnection.RedisClientCloudEndpoint-1</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="service.pid" type="String">
<esf:value>com.eurotech.framework.redis.client.cloudconnection.RedisClientCloudEndpoint-1671006773951-0</esf:value>
</esf:property>
</esf:properties>
</esf:configuration>
<esf:configuration pid="com.eurotech.framework.redis.client.cloudconnection.RedisClientDataService-1">
<esf:properties>
<esf:property array="false" encrypted="false" name="store.purge-age" type="Integer">
<esf:value>60</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="in-flight-messages.congestion-timeout" type="Integer">
<esf:value>0</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="enable.rate.limit" type="Boolean">
<esf:value>true</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="in-flight-messages.max-number" type="Integer">
<esf:value>9</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="service.factoryPid" type="String">
<esf:value>org.eclipse.kura.data.DataService</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="connection.recovery.max.failures" type="Integer">
<esf:value>10</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="disconnect.quiesce-timeout" type="Integer">
<esf:value>10</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="kura.service.pid" type="String">
<esf:value>com.eurotech.framework.redis.client.cloudconnection.RedisClientDataService-1</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="service.pid" type="String">
<esf:value>org.eclipse.kura.data.DataService-1671006774160-18</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="store.housekeeper-interval" type="Integer">
<esf:value>900</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="connect.auto-on-startup" type="Boolean">
<esf:value>true</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="rate.limit.time.unit" type="String">
<esf:value>SECONDS</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="rate.limit.average" type="Integer">
<esf:value>1</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="store.db.service.pid" type="String">
<esf:value>org.eclipse.kura.db.H2DbService</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="DataTransportService.target" type="String">
<esf:value>(kura.service.pid=com.eurotech.framework.redis.client.cloudconnection.transport.RedisClientDataTransport-1)</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="connect.retry-interval" type="Integer">
<esf:value>10</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="enable.recovery.on.connection.failure" type="Boolean">
<esf:value>false</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="rate.limit.burst.size" type="Integer">
<esf:value>1</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="in-flight-messages.republish-on-new-session" type="Boolean">
<esf:value>true</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="store.capacity" type="Integer">
<esf:value>10000</esf:value>
</esf:property>
</esf:properties>
</esf:configuration>
<esf:configuration pid="com.eurotech.framework.redis.client.cloudconnection.transport.RedisClientDataTransport-1">
<esf:properties>
<esf:property array="false" encrypted="false" name="authentication.method" type="String">
<esf:value>NO-AUTH</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="enable.hostname.verification" type="Boolean">
<esf:value>false</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="servers" type="String">
<esf:value>redis://localhost:6379 </esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="authentication.username" type="String">
<esf:value/>
</esf:property>
<esf:property array="false" encrypted="false" name="database-number" type="Integer">
<esf:value>0</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="connection-mode" type="String">
<esf:value>SIMPLE</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="KeystoreService.target" type="String">
<esf:value>(kura.service.pid=SSLKeystore)</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="service.factoryPid" type="String">
<esf:value>com.eurotech.framework.redis.client.cloudconnection.transport.RedisClientDataTransport</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="cloud.endpoint.service.pid" type="String">
<esf:value>com.eurotech.framework.redis.client.cloudconnection.RedisClientCloudEndpoint-1</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="client.id" type="String">
<esf:value/>
</esf:property>
<esf:property array="false" encrypted="false" name="kura.service.pid" type="String">
<esf:value>com.eurotech.framework.redis.client.cloudconnection.transport.RedisClientDataTransport-1</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="service.pid" type="String">
<esf:value>com.eurotech.framework.redis.client.cloudconnection.transport.RedisClientDataTransport-1671006774172-19</esf:value>
</esf:property>
</esf:properties>
</esf:configuration>
<esf:configuration pid="pub">
<esf:properties>
<esf:property array="false" encrypted="false" name="publish.metrics" type="Boolean">
<esf:value>true</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="topic" type="String">
<esf:value>test</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="priority" type="Integer">
<esf:value>7</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="publish.position" type="Boolean">
<esf:value>false</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="service.factoryPid" type="String">
<esf:value>com.eurotech.framework.redis.client.cloudconnection.publisher.RedisClientPublisher</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="cloud.endpoint.service.pid" type="String">
<esf:value>com.eurotech.framework.redis.client.cloudconnection.RedisClientCloudEndpoint-1</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="kura.service.pid" type="String">
<esf:value>pub</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="service.pid" type="String">
<esf:value>com.eurotech.framework.redis.client.cloudconnection.publisher.RedisClientPublisher-1671008631675-22</esf:value>
</esf:property>
</esf:properties>
</esf:configuration>
<esf:configuration pid="sub">
<esf:properties>
<esf:property array="false" encrypted="false" name="topic" type="String">
<esf:value>test</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="service.factoryPid" type="String">
<esf:value>com.eurotech.framework.redis.client.cloudconnection.subscriber.RedisClientSubscriber</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="cloud.endpoint.service.pid" type="String">
<esf:value>com.eurotech.framework.redis.client.cloudconnection.RedisClientCloudEndpoint-1</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="kura.service.pid" type="String">
<esf:value>sub</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="service.pid" type="String">
<esf:value>com.eurotech.framework.redis.client.cloudconnection.subscriber.RedisClientSubscriber-1671008950439-31</esf:value>
</esf:property>
</esf:properties>
</esf:configuration>
Setup a simple Redis server
Install the redis-server
package following the instructions here
Disable the default service on Linux system
On Linux system redis package is shipped with a default running service. Stop and disable it with the following commands:
Create a file named redis-no-auth.conf
with the following line protected-mode no
to allows the Redis server to be accessed by external hosts and start the server with the following command:
Now the Redis server is running in foreground.
Create a simple wire graph
Now we will create a simple wire graph that push some data every second, generated through the Javascript Filter
wire component, to the Redis server using the RedisClientPublisher
. The wire graph will also retrieve the data using a RedisClientSubscriber
and display them to the log console.
You can use the following snapshot to load a the graph
<?xml version="1.0" encoding="UTF-8"?><esf:configurations xmlns:esf="http://eurotech.com/esf/2.0" xmlns:ocd="http://www.osgi.org/xmlns/metatype/v1.2.0">
<esf:configuration pid="t1">
<esf:properties>
<esf:property array="false" encrypted="false" name="factoryPid" type="String">
<esf:value>org.eclipse.kura.wire.Timer</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="componentId" type="String">
<esf:value>t1</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="factoryComponent" type="Boolean">
<esf:value>false</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="simple.first.tick.policy" type="String">
<esf:value>DEFAULT</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="componentDescription" type="String">
<esf:value>A wire component that fires a ticking event on every configured interval</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="simple.interval" type="Integer">
<esf:value>5</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="simple.time.unit" type="String">
<esf:value>SECONDS</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="type" type="String">
<esf:value>SIMPLE</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="service.factoryPid" type="String">
<esf:value>org.eclipse.kura.wire.Timer</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="cron.interval" type="String">
<esf:value>0/10 * * * * ?</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="kura.service.pid" type="String">
<esf:value>t1</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="service.pid" type="String">
<esf:value>org.eclipse.kura.wire.Timer-1671008653729-23</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="emitter.port.count" type="Integer">
<esf:value>1</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="receiver.port.count" type="Integer">
<esf:value>0</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="componentName" type="String">
<esf:value>Timer</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="simple.custom.first.tick.interval" type="Integer">
<esf:value>0</esf:value>
</esf:property>
</esf:properties>
</esf:configuration>
<esf:configuration pid="p1">
<esf:properties>
<esf:property array="false" encrypted="false" name="factoryPid" type="String">
<esf:value>org.eclipse.kura.wire.CloudPublisher</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="componentId" type="String">
<esf:value>p1</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="factoryComponent" type="Boolean">
<esf:value>false</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="componentDescription" type="String">
<esf:value>A wire component which publishes data to the cloud platform</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="CloudPublisher.target" type="String">
<esf:value>(kura.service.pid=pub)</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="service.factoryPid" type="String">
<esf:value>org.eclipse.kura.wire.CloudPublisher</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="kura.service.pid" type="String">
<esf:value>p1</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="service.pid" type="String">
<esf:value>org.eclipse.kura.wire.CloudPublisher-1671008683216-24</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="emitter.port.count" type="Integer">
<esf:value>0</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="receiver.port.count" type="Integer">
<esf:value>1</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="set.body.from.property" type="String">
<esf:value/>
</esf:property>
<esf:property array="false" encrypted="false" name="componentName" type="String">
<esf:value>Publisher</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="publish.position" type="String">
<esf:value>none</esf:value>
</esf:property>
</esf:properties>
</esf:configuration>
<esf:configuration pid="j1">
<esf:properties>
<esf:property array="false" encrypted="false" name="factoryPid" type="String">
<esf:value>org.eclipse.kura.wire.ScriptFilter</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="componentId" type="String">
<esf:value>j1</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="factoryComponent" type="Boolean">
<esf:value>false</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="componentDescription" type="String">
<esf:value>A wire component that provides scripting functionalities in JavaScript.</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="service.factoryPid" type="String">
<esf:value>org.eclipse.kura.wire.ScriptFilter</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="script" type="String">
<esf:value>var record= newWireRecord()
record.a= newIntegerValue(1)
record.b= newIntegerValue(2)
record.c= newIntegerValue(3)
record.d= newIntegerValue(4)
record.e= newIntegerValue(5)
record.f= newIntegerValue(6)
output.add(record)</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="kura.service.pid" type="String">
<esf:value>j1</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="service.pid" type="String">
<esf:value>org.eclipse.kura.wire.ScriptFilter-1671008840387-26</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="emitter.port.count" type="Integer">
<esf:value>1</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="receiver.port.count" type="Integer">
<esf:value>1</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="componentName" type="String">
<esf:value>Javascript Filter</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="script.context.drop" type="Boolean">
<esf:value>false</esf:value>
</esf:property>
</esf:properties>
</esf:configuration>
<esf:configuration pid="s1">
<esf:properties>
<esf:property array="false" encrypted="false" name="factoryPid" type="String">
<esf:value>org.eclipse.kura.wire.CloudSubscriber</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="CloudSubscriber.target" type="String">
<esf:value>(kura.service.pid=sub)</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="componentId" type="String">
<esf:value>s1</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="factoryComponent" type="Boolean">
<esf:value>false</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="componentDescription" type="String">
<esf:value>A wire component which subscribes data from the cloud platform</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="service.factoryPid" type="String">
<esf:value>org.eclipse.kura.wire.CloudSubscriber</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="kura.service.pid" type="String">
<esf:value>s1</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="service.pid" type="String">
<esf:value>org.eclipse.kura.wire.CloudSubscriber-1671009016399-32</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="emitter.port.count" type="Integer">
<esf:value>1</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="body.property.type" type="String">
<esf:value>BYTE_ARRAY</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="set.property.from.body" type="String">
<esf:value/>
</esf:property>
<esf:property array="false" encrypted="false" name="receiver.port.count" type="Integer">
<esf:value>0</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="componentName" type="String">
<esf:value>Subscriber</esf:value>
</esf:property>
</esf:properties>
</esf:configuration>
<esf:configuration pid="l2">
<esf:properties>
<esf:property array="false" encrypted="false" name="emitter.port.count" type="Integer">
<esf:value>0</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="factoryPid" type="String">
<esf:value>org.eclipse.kura.wire.Logger</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="componentId" type="String">
<esf:value>l2</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="receiver.port.count" type="Integer">
<esf:value>1</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="factoryComponent" type="Boolean">
<esf:value>false</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="componentDescription" type="String">
<esf:value>A wire component which logs data as received from upstream connected Wire Components</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="log.verbosity" type="String">
<esf:value>VERBOSE</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="componentName" type="String">
<esf:value>Logger</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="service.factoryPid" type="String">
<esf:value>org.eclipse.kura.wire.Logger</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="kura.service.pid" type="String">
<esf:value>l2</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="service.pid" type="String">
<esf:value>org.eclipse.kura.wire.Logger-1671009016412-33</esf:value>
</esf:property>
</esf:properties>
</esf:configuration>
<esf:configuration pid="org.eclipse.kura.wire.graph.WireGraphService">
<esf:properties>
<esf:property array="false" encrypted="false" name="WireGraph" type="String">
<esf:value>{"components":[{"pid":"t1","inputPortCount":0,"outputPortCount":1,"renderingProperties":{"position":{"x":-1220,"y":-100},"inputPortNames":{},"outputPortNames":{}}},{"pid":"p1","inputPortCount":1,"outputPortCount":0,"renderingProperties":{"position":{"x":-760,"y":-100},"inputPortNames":{},"outputPortNames":{}}},{"pid":"j1","inputPortCount":1,"outputPortCount":1,"renderingProperties":{"position":{"x":-960,"y":-100},"inputPortNames":{},"outputPortNames":{}}},{"pid":"s1","inputPortCount":0,"outputPortCount":1,"renderingProperties":{"position":{"x":-1220,"y":0},"inputPortNames":{},"outputPortNames":{}}},{"pid":"l2","inputPortCount":1,"outputPortCount":0,"renderingProperties":{"position":{"x":-960,"y":0},"inputPortNames":{},"outputPortNames":{}}}],"wires":[{"emitter":"t1","emitterPort":0,"receiver":"j1","receiverPort":0},{"emitter":"j1","emitterPort":0,"receiver":"p1","receiverPort":0},{"emitter":"s1","emitterPort":0,"receiver":"l2","receiverPort":0}]}</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="kura.service.pid" type="String">
<esf:value>org.eclipse.kura.wire.graph.WireGraphService</esf:value>
</esf:property>
<esf:property array="false" encrypted="false" name="service.pid" type="String">
<esf:value>org.eclipse.kura.wire.graph.WireGraphService</esf:value>
</esf:property>
</esf:properties>
</esf:configuration>
</esf:configurations>
After performed the graph import, if the RedisCloudConnector
is configured in the proper way, you should be able to see the data flow in the ESF log console.
2022-12-15 09:58:25 2022-12-15T08:58:25,666 [lettuce-nioEventLoop-27-12] INFO o.e.k.i.w.l.Logger - Received WireEnvelope from org.eclipse.kura.wire.CloudSubscriber-1671009016399-32
2022-12-15 09:58:25 2022-12-15T08:58:25,666 [lettuce-nioEventLoop-27-12] INFO o.e.k.i.w.l.Logger - Record List content:
2022-12-15 09:58:25 2022-12-15T08:58:25,666 [lettuce-nioEventLoop-27-12] INFO o.e.k.i.w.l.Logger - Record content:
2022-12-15 09:58:25 2022-12-15T08:58:25,666 [lettuce-nioEventLoop-27-12] INFO o.e.k.i.w.l.Logger - a : 1
2022-12-15 09:58:25 2022-12-15T08:58:25,666 [lettuce-nioEventLoop-27-12] INFO o.e.k.i.w.l.Logger - b : 2
2022-12-15 09:58:25 2022-12-15T08:58:25,666 [lettuce-nioEventLoop-27-12] INFO o.e.k.i.w.l.Logger - c : 3
2022-12-15 09:58:25 2022-12-15T08:58:25,666 [lettuce-nioEventLoop-27-12] INFO o.e.k.i.w.l.Logger - d : 4
2022-12-15 09:58:25 2022-12-15T08:58:25,666 [lettuce-nioEventLoop-27-12] INFO o.e.k.i.w.l.Logger - e : 5
2022-12-15 09:58:25 2022-12-15T08:58:25,666 [lettuce-nioEventLoop-27-12] INFO o.e.k.i.w.l.Logger - f : 6
2022-12-15 09:58:25 2022-12-15T08:58:25,666 [lettuce-nioEventLoop-27-12] INFO o.e.k.i.w.l.Logger -