[{"data":1,"prerenderedAt":1005},["ShallowReactive",2],{"Categories":3,"NavIndexCategoriesCountFooter":203,"content-\u002F2022\u002F12\u002F01\u002Fkafka-java-to-kotlin\u002F":204},[4,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,68,70,71,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202],{"category":5},"System Administration",{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":27},"Software Development",{"category":5},{"category":5},{"category":5},{"category":5},{"category":27},{"category":27},{"category":5},{"category":5},{"category":5},{"category":27},{"category":5},{"category":5},{"category":5},{"category":27},{"category":27},{"category":27},{"category":27},{"category":5},{"category":5},{"category":5},{"category":27},{"category":27},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":27},{"category":5},{"category":5},{"category":27},{"category":27},{"category":27},{"category":27},{"category":5},{"category":27},{"category":27},{"category":67},"Drones & RC",{"category":69},"DIY Projects",{"category":67},{"category":72},"Photography",{"category":69},{"category":69},{"category":69},{"category":67},{"category":69},{"category":69},{"category":69},{"category":69},{"category":69},{"category":69},{"category":69},{"category":69},{"category":69},{"category":69},{"category":69},{"category":69},{"category":69},{"category":69},{"category":67},{"category":69},{"category":69},{"category":67},{"category":67},{"category":72},{"category":72},{"category":72},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":5},{"category":5},{"category":72},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":5},{"category":67},{"category":67},{"category":72},{"category":72},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":72},{"category":67},{"category":138},"3D Printing - Laser Cutting - CNC",{"category":138},{"category":138},{"category":138},{"category":138},{"category":138},{"category":138},{"category":138},{"category":138},{"category":138},{"category":138},{"category":138},{"category":5},{"category":138},{"category":27},{"category":27},{"category":138},{"category":138},{"category":72},{"category":158},"Photography,3D Printing - Laser Cutting - CNC",{"category":27},{"category":27},{"category":69},{"category":27},{"category":27},{"category":27},{"category":27},{"category":5},{"category":67},{"category":5},{"category":5},{"category":27},{"category":27},{"category":27},{"category":27},{"category":27},{"category":69},{"category":27},{"category":27},{"category":27},{"category":27},{"category":181},"Home Assistant",{"category":181},{"category":72},{"category":27},{"category":27},{"category":72},{"category":138},{"category":5},{"category":72},{"category":72},{"category":138},{"category":27},{"category":181},{"category":181},{"category":72},{"category":72},{"category":72},{"category":72},{"category":72},{"category":72},{"category":72},{"category":72},191,{"id":205,"title":206,"body":207,"category":27,"date":991,"description":992,"embedImage":993,"extension":994,"image":993,"intro":995,"meta":996,"navigation":291,"path":997,"seo":998,"series":993,"sitemap":999,"stem":1000,"tags":1001,"__hash__":1004},"content\u002F2022\u002F12\u002F01\u002Fkafka-java-to-kotlin.md","Kafka - java to kotlin",{"type":208,"value":209,"toc":986},"minimark",[210,220,223,226,231,234,239,473,477,614,617,621,624,627,806,809,960,962,966,969,972,982],[211,212,213,214,219],"p",{},"Some time back I wrote about ",[215,216,218],"a",{"href":217},"\u002Fseries\u002Fkafka-java-to-scala\u002F","Kafka - java to scala",".",[211,221,222],{},"I just wondered how similar the equivalent kotlin code would be.",[211,224,225],{},"This is based around the over-simple procducer\u002Fconsumer example used in that series of posts - but this time embedded in a spring boot setup. However - it ignores all the spring boot kafka support etc - it's just being used to provide simple config loading and logging.",[227,228,230],"h3",{"id":229},"producer","Producer",[211,232,233],{},"In the scala code we built up the config as a Properties instance - in kotlin - a map. Apart from that - pretty similar:",[235,236,238],"h4",{"id":237},"scala","Scala",[240,241,245],"pre",{"className":242,"code":243,"language":237,"meta":244,"style":244},"language-scala shiki shiki-themes github-dark","val producer = new KafkaProducer[String, String](settings)\n\nval topic = \"scala-v1-basic-topic\"\n\nfor (i \u003C- 1 to 5) {\n    val key = \"key-\" + i\n    val value = \"value-\" + i\n\n    println(s\"### Sending ${i} ###\")\n\n    producer.send(new ProducerRecord[String, String](topic, key, value))\n}\n\nproducer.close(Duration.ofMillis(100))\n\nprintln(\"### Stopping Basic Producer ###\")\n","",[246,247,248,286,293,307,312,337,357,374,379,400,405,428,434,439,457,462],"code",{"__ignoreMap":244},[249,250,253,257,261,264,267,271,275,278,281,283],"span",{"class":251,"line":252},"line",1,[249,254,256],{"class":255},"snl16","val",[249,258,260],{"class":259},"s9osk"," producer",[249,262,263],{"class":255}," =",[249,265,266],{"class":255}," new",[249,268,270],{"class":269},"svObZ"," KafkaProducer",[249,272,274],{"class":273},"s95oV","[",[249,276,277],{"class":269},"String",[249,279,280],{"class":273},", ",[249,282,277],{"class":269},[249,284,285],{"class":273},"](settings)\n",[249,287,289],{"class":251,"line":288},2,[249,290,292],{"emptyLinePlaceholder":291},true,"\n",[249,294,296,298,301,303],{"class":251,"line":295},3,[249,297,256],{"class":255},[249,299,300],{"class":259}," topic",[249,302,263],{"class":255},[249,304,306],{"class":305},"sU2Wk"," \"scala-v1-basic-topic\"\n",[249,308,310],{"class":251,"line":309},4,[249,311,292],{"emptyLinePlaceholder":291},[249,313,315,318,321,324,328,331,334],{"class":251,"line":314},5,[249,316,317],{"class":255},"for",[249,319,320],{"class":273}," (i ",[249,322,323],{"class":255},"\u003C-",[249,325,327],{"class":326},"sDLfK"," 1",[249,329,330],{"class":273}," to ",[249,332,333],{"class":326},"5",[249,335,336],{"class":273},") {\n",[249,338,340,343,346,348,351,354],{"class":251,"line":339},6,[249,341,342],{"class":255},"    val",[249,344,345],{"class":259}," key",[249,347,263],{"class":255},[249,349,350],{"class":305}," \"key-\"",[249,352,353],{"class":255}," +",[249,355,356],{"class":273}," i\n",[249,358,360,362,365,367,370,372],{"class":251,"line":359},7,[249,361,342],{"class":255},[249,363,364],{"class":259}," value",[249,366,263],{"class":255},[249,368,369],{"class":305}," \"value-\"",[249,371,353],{"class":255},[249,373,356],{"class":273},[249,375,377],{"class":251,"line":376},8,[249,378,292],{"emptyLinePlaceholder":291},[249,380,382,385,388,391,394,397],{"class":251,"line":381},9,[249,383,384],{"class":273},"    println(",[249,386,387],{"class":255},"s",[249,389,390],{"class":305},"\"### Sending ",[249,392,393],{"class":273},"${i}",[249,395,396],{"class":305}," ###\"",[249,398,399],{"class":273},")\n",[249,401,403],{"class":251,"line":402},10,[249,404,292],{"emptyLinePlaceholder":291},[249,406,408,411,414,417,419,421,423,425],{"class":251,"line":407},11,[249,409,410],{"class":273},"    producer.send(",[249,412,413],{"class":255},"new",[249,415,416],{"class":269}," ProducerRecord",[249,418,274],{"class":273},[249,420,277],{"class":269},[249,422,280],{"class":273},[249,424,277],{"class":269},[249,426,427],{"class":273},"](topic, key, value))\n",[249,429,431],{"class":251,"line":430},12,[249,432,433],{"class":273},"}\n",[249,435,437],{"class":251,"line":436},13,[249,438,292],{"emptyLinePlaceholder":291},[249,440,442,445,448,451,454],{"class":251,"line":441},14,[249,443,444],{"class":273},"producer.close(",[249,446,447],{"class":269},"Duration",[249,449,450],{"class":273},".ofMillis(",[249,452,453],{"class":326},"100",[249,455,456],{"class":273},"))\n",[249,458,460],{"class":251,"line":459},15,[249,461,292],{"emptyLinePlaceholder":291},[249,463,465,468,471],{"class":251,"line":464},16,[249,466,467],{"class":273},"println(",[249,469,470],{"class":305},"\"### Stopping Basic Producer ###\"",[249,472,399],{"class":273},[235,474,476],{"id":475},"kotlin","Kotlin",[240,478,481],{"className":479,"code":480,"language":475,"meta":244,"style":244},"language-kotlin shiki shiki-themes github-dark","val producer = KafkaProducer\u003CString, String>(kafkaConfig.configMap())\n\n(1..5).forEach {\n        logger.info { \"### Sending $it ###\" }\n        producer.send(ProducerRecord(kafkaConfig.topic, \"key-$it\", \"value-$it\"))\n}\n\nproducer.close()\n",[246,482,483,513,517,539,560,595,599,603],{"__ignoreMap":244},[249,484,485,487,490,493,495,498,500,502,504,507,510],{"class":251,"line":252},[249,486,256],{"class":255},[249,488,489],{"class":273}," producer ",[249,491,492],{"class":255},"=",[249,494,270],{"class":269},[249,496,497],{"class":273},"\u003C",[249,499,277],{"class":269},[249,501,280],{"class":273},[249,503,277],{"class":269},[249,505,506],{"class":273},">(kafkaConfig.",[249,508,509],{"class":269},"configMap",[249,511,512],{"class":273},"())\n",[249,514,515],{"class":251,"line":288},[249,516,292],{"emptyLinePlaceholder":291},[249,518,519,522,525,528,530,533,536],{"class":251,"line":295},[249,520,521],{"class":273},"(",[249,523,524],{"class":326},"1",[249,526,527],{"class":255},"..",[249,529,333],{"class":326},[249,531,532],{"class":273},").",[249,534,535],{"class":269},"forEach",[249,537,538],{"class":273}," {\n",[249,540,541,544,547,550,552,555,557],{"class":251,"line":309},[249,542,543],{"class":273},"        logger.",[249,545,546],{"class":269},"info",[249,548,549],{"class":273}," { ",[249,551,390],{"class":305},[249,553,554],{"class":326},"$it",[249,556,396],{"class":305},[249,558,559],{"class":273}," }\n",[249,561,562,565,568,570,573,576,579,581,584,586,589,591,593],{"class":251,"line":314},[249,563,564],{"class":273},"        producer.",[249,566,567],{"class":269},"send",[249,569,521],{"class":273},[249,571,572],{"class":269},"ProducerRecord",[249,574,575],{"class":273},"(kafkaConfig.topic, ",[249,577,578],{"class":305},"\"key-",[249,580,554],{"class":326},[249,582,583],{"class":305},"\"",[249,585,280],{"class":273},[249,587,588],{"class":305},"\"value-",[249,590,554],{"class":326},[249,592,583],{"class":305},[249,594,456],{"class":273},[249,596,597],{"class":251,"line":339},[249,598,433],{"class":273},[249,600,601],{"class":251,"line":359},[249,602,292],{"emptyLinePlaceholder":291},[249,604,605,608,611],{"class":251,"line":376},[249,606,607],{"class":273},"producer.",[249,609,610],{"class":269},"close",[249,612,613],{"class":273},"()\n",[615,616],"hr",{},[227,618,620],{"id":619},"consumer","Consumer",[211,622,623],{},"In the scala code we again build up the config as a Properties instance - in kotlin - a map. Apart from that - pretty similar. Uses the kotlin.use to provide the try\u002Ffinally construct.",[235,625,238],{"id":626},"scala-1",[240,628,630],{"className":242,"code":629,"language":237,"meta":244,"style":244},"val consumer = new KafkaConsumer[String, String](settings)\n\nval topic = \"scala-v1-basic-topic\"\n\ntry {\n    consumer.subscribe(List(topic).asJava)\n\n    while (true) {\n        val records = consumer.poll(Duration.ofMillis(100))\n\n        for (record \u003C- records.asScala) {\n            println(s\"offset = ${record.offset}, key = ${record.key}, value = ${record.value}\")\n        }\n    }\n} finally {\n    consumer.close()\n}\n",[246,631,632,656,660,670,674,681,692,696,709,730,734,747,776,781,786,796,801],{"__ignoreMap":244},[249,633,634,636,639,641,643,646,648,650,652,654],{"class":251,"line":252},[249,635,256],{"class":255},[249,637,638],{"class":259}," consumer",[249,640,263],{"class":255},[249,642,266],{"class":255},[249,644,645],{"class":269}," KafkaConsumer",[249,647,274],{"class":273},[249,649,277],{"class":269},[249,651,280],{"class":273},[249,653,277],{"class":269},[249,655,285],{"class":273},[249,657,658],{"class":251,"line":288},[249,659,292],{"emptyLinePlaceholder":291},[249,661,662,664,666,668],{"class":251,"line":295},[249,663,256],{"class":255},[249,665,300],{"class":259},[249,667,263],{"class":255},[249,669,306],{"class":305},[249,671,672],{"class":251,"line":309},[249,673,292],{"emptyLinePlaceholder":291},[249,675,676,679],{"class":251,"line":314},[249,677,678],{"class":255},"try",[249,680,538],{"class":273},[249,682,683,686,689],{"class":251,"line":339},[249,684,685],{"class":273},"    consumer.subscribe(",[249,687,688],{"class":269},"List",[249,690,691],{"class":273},"(topic).asJava)\n",[249,693,694],{"class":251,"line":359},[249,695,292],{"emptyLinePlaceholder":291},[249,697,698,701,704,707],{"class":251,"line":376},[249,699,700],{"class":255},"    while",[249,702,703],{"class":273}," (",[249,705,706],{"class":326},"true",[249,708,336],{"class":273},[249,710,711,714,717,719,722,724,726,728],{"class":251,"line":381},[249,712,713],{"class":255},"        val",[249,715,716],{"class":259}," records",[249,718,263],{"class":255},[249,720,721],{"class":273}," consumer.poll(",[249,723,447],{"class":269},[249,725,450],{"class":273},[249,727,453],{"class":326},[249,729,456],{"class":273},[249,731,732],{"class":251,"line":402},[249,733,292],{"emptyLinePlaceholder":291},[249,735,736,739,742,744],{"class":251,"line":407},[249,737,738],{"class":255},"        for",[249,740,741],{"class":273}," (record ",[249,743,323],{"class":255},[249,745,746],{"class":273}," records.asScala) {\n",[249,748,749,752,754,757,760,763,766,769,772,774],{"class":251,"line":430},[249,750,751],{"class":273},"            println(",[249,753,387],{"class":255},[249,755,756],{"class":305},"\"offset = ",[249,758,759],{"class":273},"${record.offset}",[249,761,762],{"class":305},", key = ",[249,764,765],{"class":273},"${record.key}",[249,767,768],{"class":305},", value = ",[249,770,771],{"class":273},"${record.value}",[249,773,583],{"class":305},[249,775,399],{"class":273},[249,777,778],{"class":251,"line":436},[249,779,780],{"class":273},"        }\n",[249,782,783],{"class":251,"line":441},[249,784,785],{"class":273},"    }\n",[249,787,788,791,794],{"class":251,"line":459},[249,789,790],{"class":273},"} ",[249,792,793],{"class":255},"finally",[249,795,538],{"class":273},[249,797,798],{"class":251,"line":464},[249,799,800],{"class":273},"    consumer.close()\n",[249,802,804],{"class":251,"line":803},17,[249,805,433],{"class":273},[235,807,476],{"id":808},"kotlin-1",[240,810,812],{"className":479,"code":811,"language":475,"meta":244,"style":244},"KafkaConsumer\u003CString, String>(kafkaConfig.configMap()).use { consumer ->\n    consumer.subscribe(listOf(kafkaConfig.topic))\n\n    while (true) {\n        val records = consumer.poll(Duration.ofMillis(100))\n\n        records.forEach { record ->\n            logger.info { \"offset = ${record.offset()}, key = ${record.key()}, value = ${record.value()}\" }\n        }\n    }\n}\n",[246,813,814,843,859,863,873,900,904,916,948,952,956],{"__ignoreMap":244},[249,815,816,819,821,823,825,827,829,831,834,837,840],{"class":251,"line":252},[249,817,818],{"class":269},"KafkaConsumer",[249,820,497],{"class":273},[249,822,277],{"class":269},[249,824,280],{"class":273},[249,826,277],{"class":269},[249,828,506],{"class":273},[249,830,509],{"class":269},[249,832,833],{"class":273},"()).",[249,835,836],{"class":269},"use",[249,838,839],{"class":273}," { consumer ",[249,841,842],{"class":255},"->\n",[249,844,845,848,851,853,856],{"class":251,"line":288},[249,846,847],{"class":273},"    consumer.",[249,849,850],{"class":269},"subscribe",[249,852,521],{"class":273},[249,854,855],{"class":269},"listOf",[249,857,858],{"class":273},"(kafkaConfig.topic))\n",[249,860,861],{"class":251,"line":295},[249,862,292],{"emptyLinePlaceholder":291},[249,864,865,867,869,871],{"class":251,"line":309},[249,866,700],{"class":255},[249,868,703],{"class":273},[249,870,706],{"class":326},[249,872,336],{"class":273},[249,874,875,877,880,882,885,888,891,894,896,898],{"class":251,"line":314},[249,876,713],{"class":255},[249,878,879],{"class":273}," records ",[249,881,492],{"class":255},[249,883,884],{"class":273}," consumer.",[249,886,887],{"class":269},"poll",[249,889,890],{"class":273},"(Duration.",[249,892,893],{"class":269},"ofMillis",[249,895,521],{"class":273},[249,897,453],{"class":326},[249,899,456],{"class":273},[249,901,902],{"class":251,"line":339},[249,903,292],{"emptyLinePlaceholder":291},[249,905,906,909,911,914],{"class":251,"line":359},[249,907,908],{"class":273},"        records.",[249,910,535],{"class":269},[249,912,913],{"class":273}," { record ",[249,915,842],{"class":255},[249,917,918,921,923,925,928,931,934,937,940,943,946],{"class":251,"line":376},[249,919,920],{"class":273},"            logger.",[249,922,546],{"class":269},[249,924,549],{"class":273},[249,926,927],{"class":305},"\"offset = ${record.",[249,929,930],{"class":269},"offset",[249,932,933],{"class":305},"()}, key = ${record.",[249,935,936],{"class":269},"key",[249,938,939],{"class":305},"()}, value = ${record.",[249,941,942],{"class":269},"value",[249,944,945],{"class":305},"()}\"",[249,947,559],{"class":273},[249,949,950],{"class":251,"line":381},[249,951,780],{"class":273},[249,953,954],{"class":251,"line":402},[249,955,785],{"class":273},[249,957,958],{"class":251,"line":407},[249,959,433],{"class":273},[615,961],{},[227,963,965],{"id":964},"summary","Summary",[211,967,968],{},"Are they similar? Yes - extremely. Am I surprised? No :)",[211,970,971],{},"This was mostly a \"just-for-fun\" exercise - and as always - the code is on github:",[211,973,974],{},[215,975,976],{"href":976,"rel":977,"target":981},"https:\u002F\u002Fgithub.com\u002Fchrissearle\u002Fkafka-java-to-scala",[978,979,980],"nofollow","noopener","noreferer","_blank",[983,984,985],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":244,"searchDepth":288,"depth":288,"links":987},[988,989,990],{"id":229,"depth":295,"text":230},{"id":619,"depth":295,"text":620},{"id":964,"depth":295,"text":965},"2022-12-01 13:38 +0100","Some time back I wrote about Kafka - java to scala.",null,"md","Some time back I wrote about converting a simple java kafka project to scala. This is a just for fun look at how similar the kotlin code is.",{},"\u002F2022\u002F12\u002F01\u002Fkafka-java-to-kotlin",{"title":206,"description":992},{"loc":997},"2022\u002F12\u002F01\u002Fkafka-java-to-kotlin",[1002,1003,237,475],"kafka","java","VG1z-jONG1J-JYDdgnyyYCWJuyJDKoPSXA72S9Q-bAg",1775293005957]