[{"data":1,"prerenderedAt":1743},["ShallowReactive",2],{"Categories":3,"NavIndexCategoriesCountFooter":203,"content-\u002F2019\u002F04\u002F30\u002Fkafka-java-to-scala-scala-v1\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":1731,"description":213,"embedImage":1732,"extension":1733,"image":1732,"intro":216,"meta":1734,"navigation":337,"path":1736,"seo":1737,"series":1738,"sitemap":1739,"stem":1740,"tags":1741,"__hash__":1742},"content\u002F2019\u002F04\u002F30\u002Fkafka-java-to-scala-scala-v1.md","Kafka - java to scala - scala v1 - basic",{"type":208,"value":209,"toc":1719},"minimark",[210,214,217,222,227,230,233,239,242,247,253,256,259,266,269,428,432,438,441,449,453,456,460,463,466,1026,1029,1032,1047,1050,1062,1065,1071,1075,1078,1081,1084,1087,1102,1105,1110,1113,1117,1120,1638,1641,1643,1653,1656,1666,1669,1675,1679,1682,1685,1688,1692,1715],[211,212,213],"p",{},"This series goes through conversion of some basic java kafka clients to scala - step by step. It is important to understand that it is written from my viewpoint - someone who has played with scala, likes it, but has never really had time to get into it.",[211,215,216],{},"In the previous step we created a basic producer and consumer in java. Let's try for a direct conversion (almost line by line) to scala as a first step.",[218,219,221],"h2",{"id":220},"producer","Producer",[223,224,226],"h3",{"id":225},"project-structure","Project Structure",[211,228,229],{},"Scala uses sbt as its build tool.",[211,231,232],{},"First we create the project structure. We'll use the sbt function that uses a giter8 template to create the project.",[211,234,235],{},[236,237,238],"code",{},"sbt new scala\u002Fscala-seed.g8 --name=BasicProducer",[211,240,241],{},"This will download a bunch of stuff then create a structure in .\u002Fbasicproducer.",[243,244,246],"h4",{"id":245},"buildsbt","build.sbt",[211,248,249,250,252],{},"Now - let's get ",[236,251,246],{}," updated. We need to customize the file so that it works for us.",[211,254,255],{},"Firstly - at the time of writing the latest scala was 2.13 - but some dependencies in kafka we'll be using are expecting a 2.12.x - so we'll set the scalaVersion.",[211,257,258],{},"I've also updated the organization and dumped the organizationName params.",[211,260,261,262,265],{},"Finally - we'll drop the Dependencies object (we can delete the file ",[236,263,264],{},"project\u002FDependencies.scala",") - we have such a simple project we don't need a complex dependency setup.",[211,267,268],{},"This gives be the following file:",[270,271,276],"pre",{"className":272,"code":273,"language":274,"meta":275,"style":275},"language-scala shiki shiki-themes github-dark","ThisBuild \u002F scalaVersion     := \"2.12.10\"\nThisBuild \u002F version          := \"0.1.0-SNAPSHOT\"\nThisBuild \u002F organization     := \"net.chrissearle\"\n\nlazy val root = (project in file(\".\"))\n  .settings(\n    name := \"BasicProducer\",\n    libraryDependencies ++= Seq(\n      \"org.apache.kafka\" % \"kafka-clients\" % \"2.3.0\"\n    )\n  )\n\n","scala","",[236,277,278,302,317,332,339,364,370,384,399,416,422],{"__ignoreMap":275},[279,280,283,287,291,295,298],"span",{"class":281,"line":282},"line",1,[279,284,286],{"class":285},"svObZ","ThisBuild",[279,288,290],{"class":289},"snl16"," \u002F",[279,292,294],{"class":293},"s95oV"," scalaVersion     ",[279,296,297],{"class":289},":=",[279,299,301],{"class":300},"sU2Wk"," \"2.12.10\"\n",[279,303,305,307,309,312,314],{"class":281,"line":304},2,[279,306,286],{"class":285},[279,308,290],{"class":289},[279,310,311],{"class":293}," version          ",[279,313,297],{"class":289},[279,315,316],{"class":300}," \"0.1.0-SNAPSHOT\"\n",[279,318,320,322,324,327,329],{"class":281,"line":319},3,[279,321,286],{"class":285},[279,323,290],{"class":289},[279,325,326],{"class":293}," organization     ",[279,328,297],{"class":289},[279,330,331],{"class":300}," \"net.chrissearle\"\n",[279,333,335],{"class":281,"line":334},4,[279,336,338],{"emptyLinePlaceholder":337},true,"\n",[279,340,342,345,348,352,355,358,361],{"class":281,"line":341},5,[279,343,344],{"class":289},"lazy",[279,346,347],{"class":289}," val",[279,349,351],{"class":350},"s9osk"," root",[279,353,354],{"class":289}," =",[279,356,357],{"class":293}," (project in file(",[279,359,360],{"class":300},"\".\"",[279,362,363],{"class":293},"))\n",[279,365,367],{"class":281,"line":366},6,[279,368,369],{"class":293},"  .settings(\n",[279,371,373,376,378,381],{"class":281,"line":372},7,[279,374,375],{"class":293},"    name ",[279,377,297],{"class":289},[279,379,380],{"class":300}," \"BasicProducer\"",[279,382,383],{"class":293},",\n",[279,385,387,390,393,396],{"class":281,"line":386},8,[279,388,389],{"class":293},"    libraryDependencies ",[279,391,392],{"class":289},"++=",[279,394,395],{"class":285}," Seq",[279,397,398],{"class":293},"(\n",[279,400,402,405,408,411,413],{"class":281,"line":401},9,[279,403,404],{"class":300},"      \"org.apache.kafka\"",[279,406,407],{"class":289}," %",[279,409,410],{"class":300}," \"kafka-clients\"",[279,412,407],{"class":289},[279,414,415],{"class":300}," \"2.3.0\"\n",[279,417,419],{"class":281,"line":418},10,[279,420,421],{"class":293},"    )\n",[279,423,425],{"class":281,"line":424},11,[279,426,427],{"class":293},"  )\n",[243,429,431],{"id":430},"projectbuildproperties","project\u002Fbuild.properties",[211,433,434,435,437],{},"We configure which sbt version we want in the file ",[236,436,431],{},".",[211,439,440],{},"The generated version is fine:",[270,442,447],{"className":443,"code":445,"language":446},[444],"language-text","sbt.version=1.3.2\n","text",[236,448,445],{"__ignoreMap":275},[223,450,452],{"id":451},"project-code","Project Code",[211,454,455],{},"The template created the directory structure we want under src\u002Fmain. Let's remove the src\u002Fmain\u002Fscala\u002Fexample\u002FHello.scala file - we don't need that. For now we'll also remove the src\u002Ftest directory - naughty I know - but there are plenty of other scala testing tutorials out there.",[243,457,459],{"id":458},"scala-producer","Scala producer",[211,461,462],{},"Now for the actual scala code.",[211,464,465],{},"We'll create BasicProducer.scala in the src\u002Fmain\u002Fscala directory.",[270,467,469],{"className":272,"code":468,"language":274,"meta":275,"style":275},"import java.time.Duration\nimport java.util.Properties\n\nimport org.apache.kafka.clients.producer.ProducerConfig.{BOOTSTRAP_SERVERS_CONFIG, CLIENT_ID_CONFIG, KEY_SERIALIZER_CLASS_CONFIG, VALUE_SERIALIZER_CLASS_CONFIG}\nimport org.apache.kafka.clients.producer.{KafkaProducer, ProducerRecord}\nimport org.apache.kafka.common.serialization.StringSerializer\n\nobject BasicProducer {\n\n  def main(args: Array[String]): Unit = {\n\n    println(\"*** Starting Basic Producer ***\")\n\n    val settings = new Properties()\n\n    settings.put(CLIENT_ID_CONFIG, \"basic-producer\")\n    settings.put(BOOTSTRAP_SERVERS_CONFIG, \"localhost:29092\")\n    settings.put(KEY_SERIALIZER_CLASS_CONFIG, classOf[StringSerializer].getCanonicalName)\n    settings.put(VALUE_SERIALIZER_CLASS_CONFIG, classOf[StringSerializer].getCanonicalName)\n\n    val producer = new KafkaProducer[String, String](settings)\n\n    val topic = \"scala-v1-basic-topic\"\n\n    for (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\n    producer.close(Duration.ofMillis(100))\n\n    println(\"### Stopping Basic Producer ###\")\n\n  }\n}\n",[236,470,471,489,505,509,565,599,628,632,643,647,686,690,702,707,727,732,747,761,782,799,804,830,835,848,853,877,897,914,919,939,944,967,973,978,995,1000,1010,1015,1021],{"__ignoreMap":275},[279,472,473,476,479,481,484,486],{"class":281,"line":282},[279,474,475],{"class":289},"import",[279,477,478],{"class":285}," java",[279,480,437],{"class":293},[279,482,483],{"class":285},"time",[279,485,437],{"class":293},[279,487,488],{"class":285},"Duration\n",[279,490,491,493,495,497,500,502],{"class":281,"line":304},[279,492,475],{"class":289},[279,494,478],{"class":285},[279,496,437],{"class":293},[279,498,499],{"class":285},"util",[279,501,437],{"class":293},[279,503,504],{"class":285},"Properties\n",[279,506,507],{"class":281,"line":319},[279,508,338],{"emptyLinePlaceholder":337},[279,510,511,513,516,518,521,523,526,528,531,533,535,537,540,543,546,549,552,554,557,559,562],{"class":281,"line":334},[279,512,475],{"class":289},[279,514,515],{"class":285}," org",[279,517,437],{"class":293},[279,519,520],{"class":285},"apache",[279,522,437],{"class":293},[279,524,525],{"class":285},"kafka",[279,527,437],{"class":293},[279,529,530],{"class":285},"clients",[279,532,437],{"class":293},[279,534,220],{"class":285},[279,536,437],{"class":293},[279,538,539],{"class":285},"ProducerConfig",[279,541,542],{"class":293},".{",[279,544,545],{"class":285},"BOOTSTRAP_SERVERS_CONFIG",[279,547,548],{"class":293},", ",[279,550,551],{"class":285},"CLIENT_ID_CONFIG",[279,553,548],{"class":293},[279,555,556],{"class":285},"KEY_SERIALIZER_CLASS_CONFIG",[279,558,548],{"class":293},[279,560,561],{"class":285},"VALUE_SERIALIZER_CLASS_CONFIG",[279,563,564],{"class":293},"}\n",[279,566,567,569,571,573,575,577,579,581,583,585,587,589,592,594,597],{"class":281,"line":341},[279,568,475],{"class":289},[279,570,515],{"class":285},[279,572,437],{"class":293},[279,574,520],{"class":285},[279,576,437],{"class":293},[279,578,525],{"class":285},[279,580,437],{"class":293},[279,582,530],{"class":285},[279,584,437],{"class":293},[279,586,220],{"class":285},[279,588,542],{"class":293},[279,590,591],{"class":285},"KafkaProducer",[279,593,548],{"class":293},[279,595,596],{"class":285},"ProducerRecord",[279,598,564],{"class":293},[279,600,601,603,605,607,609,611,613,615,618,620,623,625],{"class":281,"line":366},[279,602,475],{"class":289},[279,604,515],{"class":285},[279,606,437],{"class":293},[279,608,520],{"class":285},[279,610,437],{"class":293},[279,612,525],{"class":285},[279,614,437],{"class":293},[279,616,617],{"class":285},"common",[279,619,437],{"class":293},[279,621,622],{"class":285},"serialization",[279,624,437],{"class":293},[279,626,627],{"class":285},"StringSerializer\n",[279,629,630],{"class":281,"line":372},[279,631,338],{"emptyLinePlaceholder":337},[279,633,634,637,640],{"class":281,"line":386},[279,635,636],{"class":289},"object",[279,638,639],{"class":285}," BasicProducer",[279,641,642],{"class":293}," {\n",[279,644,645],{"class":281,"line":401},[279,646,338],{"emptyLinePlaceholder":337},[279,648,649,652,655,658,661,664,667,670,673,676,679,682,684],{"class":281,"line":418},[279,650,651],{"class":289},"  def",[279,653,654],{"class":285}," main",[279,656,657],{"class":293},"(",[279,659,660],{"class":350},"args",[279,662,663],{"class":293},": ",[279,665,666],{"class":285},"Array",[279,668,669],{"class":293},"[",[279,671,672],{"class":285},"String",[279,674,675],{"class":293},"])",[279,677,678],{"class":289},":",[279,680,681],{"class":285}," Unit",[279,683,354],{"class":289},[279,685,642],{"class":293},[279,687,688],{"class":281,"line":424},[279,689,338],{"emptyLinePlaceholder":337},[279,691,693,696,699],{"class":281,"line":692},12,[279,694,695],{"class":293},"    println(",[279,697,698],{"class":300},"\"*** Starting Basic Producer ***\"",[279,700,701],{"class":293},")\n",[279,703,705],{"class":281,"line":704},13,[279,706,338],{"emptyLinePlaceholder":337},[279,708,710,713,716,718,721,724],{"class":281,"line":709},14,[279,711,712],{"class":289},"    val",[279,714,715],{"class":350}," settings",[279,717,354],{"class":289},[279,719,720],{"class":289}," new",[279,722,723],{"class":285}," Properties",[279,725,726],{"class":293},"()\n",[279,728,730],{"class":281,"line":729},15,[279,731,338],{"emptyLinePlaceholder":337},[279,733,735,738,740,742,745],{"class":281,"line":734},16,[279,736,737],{"class":293},"    settings.put(",[279,739,551],{"class":285},[279,741,548],{"class":293},[279,743,744],{"class":300},"\"basic-producer\"",[279,746,701],{"class":293},[279,748,750,752,754,756,759],{"class":281,"line":749},17,[279,751,737],{"class":293},[279,753,545],{"class":285},[279,755,548],{"class":293},[279,757,758],{"class":300},"\"localhost:29092\"",[279,760,701],{"class":293},[279,762,764,766,768,770,774,776,779],{"class":281,"line":763},18,[279,765,737],{"class":293},[279,767,556],{"class":285},[279,769,548],{"class":293},[279,771,773],{"class":772},"sDLfK","classOf",[279,775,669],{"class":293},[279,777,778],{"class":285},"StringSerializer",[279,780,781],{"class":293},"].getCanonicalName)\n",[279,783,785,787,789,791,793,795,797],{"class":281,"line":784},19,[279,786,737],{"class":293},[279,788,561],{"class":285},[279,790,548],{"class":293},[279,792,773],{"class":772},[279,794,669],{"class":293},[279,796,778],{"class":285},[279,798,781],{"class":293},[279,800,802],{"class":281,"line":801},20,[279,803,338],{"emptyLinePlaceholder":337},[279,805,807,809,812,814,816,819,821,823,825,827],{"class":281,"line":806},21,[279,808,712],{"class":289},[279,810,811],{"class":350}," producer",[279,813,354],{"class":289},[279,815,720],{"class":289},[279,817,818],{"class":285}," KafkaProducer",[279,820,669],{"class":293},[279,822,672],{"class":285},[279,824,548],{"class":293},[279,826,672],{"class":285},[279,828,829],{"class":293},"](settings)\n",[279,831,833],{"class":281,"line":832},22,[279,834,338],{"emptyLinePlaceholder":337},[279,836,838,840,843,845],{"class":281,"line":837},23,[279,839,712],{"class":289},[279,841,842],{"class":350}," topic",[279,844,354],{"class":289},[279,846,847],{"class":300}," \"scala-v1-basic-topic\"\n",[279,849,851],{"class":281,"line":850},24,[279,852,338],{"emptyLinePlaceholder":337},[279,854,856,859,862,865,868,871,874],{"class":281,"line":855},25,[279,857,858],{"class":289},"    for",[279,860,861],{"class":293}," (i ",[279,863,864],{"class":289},"\u003C-",[279,866,867],{"class":772}," 1",[279,869,870],{"class":293}," to ",[279,872,873],{"class":772},"5",[279,875,876],{"class":293},") {\n",[279,878,880,883,886,888,891,894],{"class":281,"line":879},26,[279,881,882],{"class":289},"      val",[279,884,885],{"class":350}," key",[279,887,354],{"class":289},[279,889,890],{"class":300}," \"key-\"",[279,892,893],{"class":289}," +",[279,895,896],{"class":293}," i\n",[279,898,900,902,905,907,910,912],{"class":281,"line":899},27,[279,901,882],{"class":289},[279,903,904],{"class":350}," value",[279,906,354],{"class":289},[279,908,909],{"class":300}," \"value-\"",[279,911,893],{"class":289},[279,913,896],{"class":293},[279,915,917],{"class":281,"line":916},28,[279,918,338],{"emptyLinePlaceholder":337},[279,920,922,925,928,931,934,937],{"class":281,"line":921},29,[279,923,924],{"class":293},"      println(",[279,926,927],{"class":289},"s",[279,929,930],{"class":300},"\"### Sending ",[279,932,933],{"class":293},"${i}",[279,935,936],{"class":300}," ###\"",[279,938,701],{"class":293},[279,940,942],{"class":281,"line":941},30,[279,943,338],{"emptyLinePlaceholder":337},[279,945,947,950,953,956,958,960,962,964],{"class":281,"line":946},31,[279,948,949],{"class":293},"      producer.send(",[279,951,952],{"class":289},"new",[279,954,955],{"class":285}," ProducerRecord",[279,957,669],{"class":293},[279,959,672],{"class":285},[279,961,548],{"class":293},[279,963,672],{"class":285},[279,965,966],{"class":293},"](topic, key, value))\n",[279,968,970],{"class":281,"line":969},32,[279,971,972],{"class":293},"    }\n",[279,974,976],{"class":281,"line":975},33,[279,977,338],{"emptyLinePlaceholder":337},[279,979,981,984,987,990,993],{"class":281,"line":980},34,[279,982,983],{"class":293},"    producer.close(",[279,985,986],{"class":285},"Duration",[279,988,989],{"class":293},".ofMillis(",[279,991,992],{"class":772},"100",[279,994,363],{"class":293},[279,996,998],{"class":281,"line":997},35,[279,999,338],{"emptyLinePlaceholder":337},[279,1001,1003,1005,1008],{"class":281,"line":1002},36,[279,1004,695],{"class":293},[279,1006,1007],{"class":300},"\"### Stopping Basic Producer ###\"",[279,1009,701],{"class":293},[279,1011,1013],{"class":281,"line":1012},37,[279,1014,338],{"emptyLinePlaceholder":337},[279,1016,1018],{"class":281,"line":1017},38,[279,1019,1020],{"class":293},"  }\n",[279,1022,1024],{"class":281,"line":1023},39,[279,1025,564],{"class":293},[211,1027,1028],{},"If you compare this to the java version - this is almost line for line the same code.",[211,1030,1031],{},"Let's make sure it compiles:",[270,1033,1037],{"className":1034,"code":1035,"language":1036,"meta":275,"style":275},"language-shell shiki shiki-themes github-dark","sbt compile\n","shell",[236,1038,1039],{"__ignoreMap":275},[279,1040,1041,1044],{"class":281,"line":282},[279,1042,1043],{"class":285},"sbt",[279,1045,1046],{"class":300}," compile\n",[211,1048,1049],{},"And then - let's run it. sbt's run will just run the first main method it finds.",[270,1051,1053],{"className":1034,"code":1052,"language":1036,"meta":275,"style":275},"sbt run\n",[236,1054,1055],{"__ignoreMap":275},[279,1056,1057,1059],{"class":281,"line":282},[279,1058,1043],{"class":285},[279,1060,1061],{"class":300}," run\n",[211,1063,1064],{},"The output here is almost the same as for the java example (we still haven't configured logging so ignore related lines):",[270,1066,1069],{"className":1067,"code":1068,"language":446},[444],"*** Starting Basic Producer ***\n### Sending 1 ###\n### Sending 2 ###\n### Sending 3 ###\n### Sending 4 ###\n### Sending 5 ###\n### Stopping Basic Producer ###\n",[236,1070,1068],{"__ignoreMap":275},[218,1072,1074],{"id":1073},"consumer","Consumer",[223,1076,226],{"id":1077},"project-structure-1",[211,1079,1080],{},"We will use almost the same project structure for the consumer as for the producer.",[243,1082,246],{"id":1083},"buildsbt-1",[211,1085,1086],{},"The only difference in build.sbt is the name:",[270,1088,1090],{"className":272,"code":1089,"language":274,"meta":275,"style":275},"name := \"BasicConsumer\"\n",[236,1091,1092],{"__ignoreMap":275},[279,1093,1094,1097,1099],{"class":281,"line":282},[279,1095,1096],{"class":293},"name ",[279,1098,297],{"class":289},[279,1100,1101],{"class":300}," \"BasicConsumer\"\n",[243,1103,1104],{"id":1104},"project",[211,1106,1107,1109],{},[236,1108,431],{}," is the same as for producer.",[223,1111,452],{"id":1112},"project-code-1",[243,1114,1116],{"id":1115},"scala-consumer","Scala consumer",[211,1118,1119],{},"We'll create BasicConsumer.scala in the src\u002Fmain\u002Fscala directory.",[270,1121,1123],{"className":272,"code":1122,"language":274,"meta":275,"style":275},"import java.time.Duration\nimport java.util.Properties\n\nimport org.apache.kafka.clients.consumer.ConsumerConfig._\nimport org.apache.kafka.clients.consumer.KafkaConsumer\nimport org.apache.kafka.common.serialization.StringDeserializer\n\nimport collection.JavaConverters._\n\nobject BasicConsumer {\n\n  def main(args: Array[String]): Unit = {\n\n    println(\"*** Starting Basic Consumer ***\")\n\n    val settings = new Properties()\n\n    settings.put(GROUP_ID_CONFIG, \"basic-consumer\")\n    settings.put(BOOTSTRAP_SERVERS_CONFIG, \"localhost:29092\")\n    settings.put(ENABLE_AUTO_COMMIT_CONFIG, \"true\")\n    settings.put(AUTO_COMMIT_INTERVAL_MS_CONFIG, \"1000\")\n    settings.put(AUTO_OFFSET_RESET_CONFIG, \"earliest\")\n    settings.put(KEY_DESERIALIZER_CLASS_CONFIG, classOf[StringDeserializer])\n    settings.put(VALUE_DESERIALIZER_CLASS_CONFIG, classOf[StringDeserializer])\n\n    val consumer = new KafkaConsumer[String, String](settings)\n\n    val topic = \"scala-v1-basic-topic\"\n\n    try {\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  }\n}\n",[236,1124,1125,1139,1153,1157,1189,1216,1243,1247,1263,1267,1276,1280,1308,1312,1321,1325,1339,1343,1357,1369,1383,1397,1411,1430,1447,1451,1475,1479,1489,1493,1500,1511,1515,1528,1549,1553,1566,1596,1601,1606,1617,1623,1628,1633],{"__ignoreMap":275},[279,1126,1127,1129,1131,1133,1135,1137],{"class":281,"line":282},[279,1128,475],{"class":289},[279,1130,478],{"class":285},[279,1132,437],{"class":293},[279,1134,483],{"class":285},[279,1136,437],{"class":293},[279,1138,488],{"class":285},[279,1140,1141,1143,1145,1147,1149,1151],{"class":281,"line":304},[279,1142,475],{"class":289},[279,1144,478],{"class":285},[279,1146,437],{"class":293},[279,1148,499],{"class":285},[279,1150,437],{"class":293},[279,1152,504],{"class":285},[279,1154,1155],{"class":281,"line":319},[279,1156,338],{"emptyLinePlaceholder":337},[279,1158,1159,1161,1163,1165,1167,1169,1171,1173,1175,1177,1179,1181,1184,1186],{"class":281,"line":334},[279,1160,475],{"class":289},[279,1162,515],{"class":285},[279,1164,437],{"class":293},[279,1166,520],{"class":285},[279,1168,437],{"class":293},[279,1170,525],{"class":285},[279,1172,437],{"class":293},[279,1174,530],{"class":285},[279,1176,437],{"class":293},[279,1178,1073],{"class":285},[279,1180,437],{"class":293},[279,1182,1183],{"class":285},"ConsumerConfig",[279,1185,437],{"class":293},[279,1187,1188],{"class":285},"_\n",[279,1190,1191,1193,1195,1197,1199,1201,1203,1205,1207,1209,1211,1213],{"class":281,"line":341},[279,1192,475],{"class":289},[279,1194,515],{"class":285},[279,1196,437],{"class":293},[279,1198,520],{"class":285},[279,1200,437],{"class":293},[279,1202,525],{"class":285},[279,1204,437],{"class":293},[279,1206,530],{"class":285},[279,1208,437],{"class":293},[279,1210,1073],{"class":285},[279,1212,437],{"class":293},[279,1214,1215],{"class":285},"KafkaConsumer\n",[279,1217,1218,1220,1222,1224,1226,1228,1230,1232,1234,1236,1238,1240],{"class":281,"line":366},[279,1219,475],{"class":289},[279,1221,515],{"class":285},[279,1223,437],{"class":293},[279,1225,520],{"class":285},[279,1227,437],{"class":293},[279,1229,525],{"class":285},[279,1231,437],{"class":293},[279,1233,617],{"class":285},[279,1235,437],{"class":293},[279,1237,622],{"class":285},[279,1239,437],{"class":293},[279,1241,1242],{"class":285},"StringDeserializer\n",[279,1244,1245],{"class":281,"line":372},[279,1246,338],{"emptyLinePlaceholder":337},[279,1248,1249,1251,1254,1256,1259,1261],{"class":281,"line":386},[279,1250,475],{"class":289},[279,1252,1253],{"class":285}," collection",[279,1255,437],{"class":293},[279,1257,1258],{"class":285},"JavaConverters",[279,1260,437],{"class":293},[279,1262,1188],{"class":285},[279,1264,1265],{"class":281,"line":401},[279,1266,338],{"emptyLinePlaceholder":337},[279,1268,1269,1271,1274],{"class":281,"line":418},[279,1270,636],{"class":289},[279,1272,1273],{"class":285}," BasicConsumer",[279,1275,642],{"class":293},[279,1277,1278],{"class":281,"line":424},[279,1279,338],{"emptyLinePlaceholder":337},[279,1281,1282,1284,1286,1288,1290,1292,1294,1296,1298,1300,1302,1304,1306],{"class":281,"line":692},[279,1283,651],{"class":289},[279,1285,654],{"class":285},[279,1287,657],{"class":293},[279,1289,660],{"class":350},[279,1291,663],{"class":293},[279,1293,666],{"class":285},[279,1295,669],{"class":293},[279,1297,672],{"class":285},[279,1299,675],{"class":293},[279,1301,678],{"class":289},[279,1303,681],{"class":285},[279,1305,354],{"class":289},[279,1307,642],{"class":293},[279,1309,1310],{"class":281,"line":704},[279,1311,338],{"emptyLinePlaceholder":337},[279,1313,1314,1316,1319],{"class":281,"line":709},[279,1315,695],{"class":293},[279,1317,1318],{"class":300},"\"*** Starting Basic Consumer ***\"",[279,1320,701],{"class":293},[279,1322,1323],{"class":281,"line":729},[279,1324,338],{"emptyLinePlaceholder":337},[279,1326,1327,1329,1331,1333,1335,1337],{"class":281,"line":734},[279,1328,712],{"class":289},[279,1330,715],{"class":350},[279,1332,354],{"class":289},[279,1334,720],{"class":289},[279,1336,723],{"class":285},[279,1338,726],{"class":293},[279,1340,1341],{"class":281,"line":749},[279,1342,338],{"emptyLinePlaceholder":337},[279,1344,1345,1347,1350,1352,1355],{"class":281,"line":763},[279,1346,737],{"class":293},[279,1348,1349],{"class":285},"GROUP_ID_CONFIG",[279,1351,548],{"class":293},[279,1353,1354],{"class":300},"\"basic-consumer\"",[279,1356,701],{"class":293},[279,1358,1359,1361,1363,1365,1367],{"class":281,"line":784},[279,1360,737],{"class":293},[279,1362,545],{"class":285},[279,1364,548],{"class":293},[279,1366,758],{"class":300},[279,1368,701],{"class":293},[279,1370,1371,1373,1376,1378,1381],{"class":281,"line":801},[279,1372,737],{"class":293},[279,1374,1375],{"class":285},"ENABLE_AUTO_COMMIT_CONFIG",[279,1377,548],{"class":293},[279,1379,1380],{"class":300},"\"true\"",[279,1382,701],{"class":293},[279,1384,1385,1387,1390,1392,1395],{"class":281,"line":806},[279,1386,737],{"class":293},[279,1388,1389],{"class":285},"AUTO_COMMIT_INTERVAL_MS_CONFIG",[279,1391,548],{"class":293},[279,1393,1394],{"class":300},"\"1000\"",[279,1396,701],{"class":293},[279,1398,1399,1401,1404,1406,1409],{"class":281,"line":832},[279,1400,737],{"class":293},[279,1402,1403],{"class":285},"AUTO_OFFSET_RESET_CONFIG",[279,1405,548],{"class":293},[279,1407,1408],{"class":300},"\"earliest\"",[279,1410,701],{"class":293},[279,1412,1413,1415,1418,1420,1422,1424,1427],{"class":281,"line":837},[279,1414,737],{"class":293},[279,1416,1417],{"class":285},"KEY_DESERIALIZER_CLASS_CONFIG",[279,1419,548],{"class":293},[279,1421,773],{"class":772},[279,1423,669],{"class":293},[279,1425,1426],{"class":285},"StringDeserializer",[279,1428,1429],{"class":293},"])\n",[279,1431,1432,1434,1437,1439,1441,1443,1445],{"class":281,"line":850},[279,1433,737],{"class":293},[279,1435,1436],{"class":285},"VALUE_DESERIALIZER_CLASS_CONFIG",[279,1438,548],{"class":293},[279,1440,773],{"class":772},[279,1442,669],{"class":293},[279,1444,1426],{"class":285},[279,1446,1429],{"class":293},[279,1448,1449],{"class":281,"line":855},[279,1450,338],{"emptyLinePlaceholder":337},[279,1452,1453,1455,1458,1460,1462,1465,1467,1469,1471,1473],{"class":281,"line":879},[279,1454,712],{"class":289},[279,1456,1457],{"class":350}," consumer",[279,1459,354],{"class":289},[279,1461,720],{"class":289},[279,1463,1464],{"class":285}," KafkaConsumer",[279,1466,669],{"class":293},[279,1468,672],{"class":285},[279,1470,548],{"class":293},[279,1472,672],{"class":285},[279,1474,829],{"class":293},[279,1476,1477],{"class":281,"line":899},[279,1478,338],{"emptyLinePlaceholder":337},[279,1480,1481,1483,1485,1487],{"class":281,"line":916},[279,1482,712],{"class":289},[279,1484,842],{"class":350},[279,1486,354],{"class":289},[279,1488,847],{"class":300},[279,1490,1491],{"class":281,"line":921},[279,1492,338],{"emptyLinePlaceholder":337},[279,1494,1495,1498],{"class":281,"line":941},[279,1496,1497],{"class":289},"    try",[279,1499,642],{"class":293},[279,1501,1502,1505,1508],{"class":281,"line":946},[279,1503,1504],{"class":293},"      consumer.subscribe(",[279,1506,1507],{"class":285},"List",[279,1509,1510],{"class":293},"(topic).asJava)\n",[279,1512,1513],{"class":281,"line":969},[279,1514,338],{"emptyLinePlaceholder":337},[279,1516,1517,1520,1523,1526],{"class":281,"line":975},[279,1518,1519],{"class":289},"      while",[279,1521,1522],{"class":293}," (",[279,1524,1525],{"class":772},"true",[279,1527,876],{"class":293},[279,1529,1530,1533,1536,1538,1541,1543,1545,1547],{"class":281,"line":980},[279,1531,1532],{"class":289},"        val",[279,1534,1535],{"class":350}," records",[279,1537,354],{"class":289},[279,1539,1540],{"class":293}," consumer.poll(",[279,1542,986],{"class":285},[279,1544,989],{"class":293},[279,1546,992],{"class":772},[279,1548,363],{"class":293},[279,1550,1551],{"class":281,"line":997},[279,1552,338],{"emptyLinePlaceholder":337},[279,1554,1555,1558,1561,1563],{"class":281,"line":1002},[279,1556,1557],{"class":289},"        for",[279,1559,1560],{"class":293}," (record ",[279,1562,864],{"class":289},[279,1564,1565],{"class":293}," records.asScala) {\n",[279,1567,1568,1571,1573,1576,1579,1582,1585,1588,1591,1594],{"class":281,"line":1012},[279,1569,1570],{"class":293},"          println(",[279,1572,927],{"class":289},[279,1574,1575],{"class":300},"\"offset = ",[279,1577,1578],{"class":293},"${record.offset}",[279,1580,1581],{"class":300},", key = ",[279,1583,1584],{"class":293},"${record.key}",[279,1586,1587],{"class":300},", value = ",[279,1589,1590],{"class":293},"${record.value}",[279,1592,1593],{"class":300},"\"",[279,1595,701],{"class":293},[279,1597,1598],{"class":281,"line":1017},[279,1599,1600],{"class":293},"        }\n",[279,1602,1603],{"class":281,"line":1023},[279,1604,1605],{"class":293},"      }\n",[279,1607,1609,1612,1615],{"class":281,"line":1608},40,[279,1610,1611],{"class":293},"    } ",[279,1613,1614],{"class":289},"finally",[279,1616,642],{"class":293},[279,1618,1620],{"class":281,"line":1619},41,[279,1621,1622],{"class":293},"      consumer.close()\n",[279,1624,1626],{"class":281,"line":1625},42,[279,1627,972],{"class":293},[279,1629,1631],{"class":281,"line":1630},43,[279,1632,1020],{"class":293},[279,1634,1636],{"class":281,"line":1635},44,[279,1637,564],{"class":293},[211,1639,1640],{},"If you compare this to the java version - this is again doing the same thing as the java consumer code.",[211,1642,1031],{},[270,1644,1645],{"className":1034,"code":1035,"language":1036,"meta":275,"style":275},[236,1646,1647],{"__ignoreMap":275},[279,1648,1649,1651],{"class":281,"line":282},[279,1650,1043],{"class":285},[279,1652,1046],{"class":300},[211,1654,1655],{},"And then run:",[270,1657,1658],{"className":1034,"code":1052,"language":1036,"meta":275,"style":275},[236,1659,1660],{"__ignoreMap":275},[279,1661,1662,1664],{"class":281,"line":282},[279,1663,1043],{"class":285},[279,1665,1061],{"class":300},[211,1667,1668],{},"The output is the same as for the java example",[270,1670,1673],{"className":1671,"code":1672,"language":446},[444],"*** Starting Basic Consumer ***\noffset = 0, key = key-1, value = value-1\noffset = 1, key = key-2, value = value-2\noffset = 2, key = key-3, value = value-3\noffset = 3, key = key-4, value = value-4\noffset = 4, key = key-5, value = value-5\n",[236,1674,1672],{"__ignoreMap":275},[218,1676,1678],{"id":1677},"summary","Summary",[211,1680,1681],{},"In this step we converted the producer and consumer to scala.",[211,1683,1684],{},"So far all that has done is to make this a little harder for java coders to understand :)",[211,1686,1687],{},"But moving forward we'll look at improving the code, better scala, akka, streams etc etc.",[218,1689,1691],{"id":1690},"links","Links",[1693,1694,1695,1708],"ul",{},[1696,1697,1698],"li",{},[1699,1700,1707],"a",{"href":1701,"rel":1702,"target":1706},"https:\u002F\u002Fgithub.com\u002Fchrissearle\u002Fkafka-java-to-scala\u002Ftree\u002Fmaster\u002Fscala-v1-basic\u002Fbasicproducer",[1703,1704,1705],"nofollow","noopener","noreferer","_blank","Producer project",[1696,1709,1710],{},[1699,1711,1714],{"href":1712,"rel":1713,"target":1706},"https:\u002F\u002Fgithub.com\u002Fchrissearle\u002Fkafka-java-to-scala\u002Ftree\u002Fmaster\u002Fscala-v1-basic\u002Fbasicconsumer",[1703,1704,1705],"Consumer project",[1716,1717,1718],"style",{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}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);}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}",{"title":275,"searchDepth":304,"depth":304,"links":1720},[1721,1725,1729,1730],{"id":220,"depth":304,"text":221,"children":1722},[1723,1724],{"id":225,"depth":319,"text":226},{"id":451,"depth":319,"text":452},{"id":1073,"depth":304,"text":1074,"children":1726},[1727,1728],{"id":1077,"depth":319,"text":226},{"id":1112,"depth":319,"text":452},{"id":1677,"depth":304,"text":1678},{"id":1690,"depth":304,"text":1691},"2019-04-30 12:08 +0200",null,"md",{"updated":1735},"2020-01-23 00:00","\u002F2019\u002F04\u002F30\u002Fkafka-java-to-scala-scala-v1",{"title":206,"description":213},"Kafka - java to scala",{"loc":1736},"2019\u002F04\u002F30\u002Fkafka-java-to-scala-scala-v1",[525,274,220,1073],"VbjzaPM2uSar3P0k95EY5D6NBbeypxF1_Irsncl2E2g",1775293009227]