@@ -43,8 +43,16 @@ import io.floodplain.replication.api.ReplicationMessage
43
43
import io.floodplain.streams.api.Topic
44
44
import io.floodplain.streams.api.TopologyContext
45
45
import io.floodplain.streams.remotejoin.TopologyConstructor
46
+ import org.apache.kafka.connect.sink.SinkConnector
47
+ import org.apache.kafka.connect.sink.SinkRecord
48
+ import org.apache.kafka.connect.sink.SinkTask
49
+ import java.lang.RuntimeException
46
50
import java.time.Duration
47
51
import java.util.Optional
52
+ import java.util.concurrent.atomic.AtomicLong
53
+ import kotlin.system.measureTimeMillis
54
+
55
+ private val logger = mu.KotlinLogging .logger {}
48
56
49
57
/* *
50
58
* Super (wrapper) class for all components (source, transformer or sink)
@@ -78,10 +86,28 @@ interface SourceConfig : Config {
78
86
79
87
interface SinkConfig : Config {
80
88
fun sinkTask (): Any?
81
- fun instantiateSinkElements ()
89
+ fun instantiateSinkElements (): List < Map < String , String >>
82
90
fun sinkElements (): Map <Topic , List <FloodplainSink >>
83
91
}
84
92
93
+ abstract class AbstractSinkConfig : SinkConfig {
94
+ // var instantiatedSinkElements: Map<Topic, List<FloodplainSink>>? = null
95
+ var sinkTask: SinkTask ? = null
96
+ var floodplainSink: FloodplainSink ? = null
97
+ var connector: SinkConnector ? = null
98
+ override fun instantiateSinkElements (): List <Map <String , String >> {
99
+ val configs = materializeConnectorConfig()
100
+ if (configs.size > 1 ) {
101
+ throw RuntimeException (" Multiple configs not supported for now" )
102
+ }
103
+ return configs.map {
104
+ it.settings
105
+ }.toList()
106
+
107
+ }
108
+ }
109
+
110
+
85
111
class MaterializedConfig (val name : String , val topics : List <Topic >, val settings : Map <String , String >)
86
112
87
113
interface SourceTopic {
@@ -197,7 +223,6 @@ fun PartialStream.joinAttributes(withTopic: String, nameAttribute: String, value
197
223
scan(
198
224
keyExtract,
199
225
{
200
- _ ->
201
226
empty()
202
227
},
203
228
{
@@ -552,3 +577,38 @@ class Block(rootTopology: Stream, override val topologyContext: TopologyContext)
552
577
// throw UnsupportedOperationException("Blocks shouldn't add sources")
553
578
// }
554
579
}
580
+
581
+
582
+ class AbstractFloodplainSink (private val task : SinkTask , private val config : SinkConfig ) : FloodplainSink {
583
+ private val offsetCounter = AtomicLong (System .currentTimeMillis())
584
+
585
+ override fun send (topic : Topic , elements : List <Pair <String , Map <String , Any >? >>) {
586
+ val list = elements.map { (key, value) ->
587
+ SinkRecord (topic.qualifiedString(), 0 , null , key, null , value, offsetCounter.incrementAndGet())
588
+ }.toList()
589
+ val insertTime = measureTimeMillis {
590
+ try {
591
+ task.put(list)
592
+ } catch (e: Throwable ) {
593
+ e.printStackTrace()
594
+ }
595
+ }
596
+ logger.info(" Inserting into mongodb size: ${list.size} duration: $insertTime " )
597
+ }
598
+
599
+ override fun config (): SinkConfig {
600
+ return config
601
+ }
602
+
603
+ override fun flush () {
604
+ task.flush(emptyMap())
605
+ }
606
+
607
+ override fun close () {
608
+ task.close(emptyList())
609
+ }
610
+
611
+ override fun taskObject (): Any? {
612
+ TODO (" Not yet implemented" )
613
+ }
614
+ }
0 commit comments