[{"data":1,"prerenderedAt":968},["ShallowReactive",2],{"Categories":3,"NavIndexCategoriesCountFooter":203,"content-\u002F2019\u002F04\u002F25\u002Fkafka-java-to-scala-java\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":953,"description":213,"embedImage":954,"extension":955,"image":954,"intro":956,"meta":957,"navigation":293,"path":959,"seo":960,"series":961,"sitemap":962,"stem":963,"tags":964,"__hash__":967},"content\u002F2019\u002F04\u002F25\u002Fkafka-java-to-scala-java.md","Kafka - java to scala - java",{"type":208,"value":209,"toc":943},"minimark",[210,214,222,227,240,244,252,255,376,379,406,409,562,568,573,576,585,588,596,599,603,611,614,722,725,751,754,901,907,911,920,923,929,932,936,939],[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,217],{},"You will need to have the correct initial setup - see ",[218,219,221],"a",{"href":220},"\u002F2019\u002F04\u002F25\u002Fkafka-java-to-scala-introduction\u002F","the introduction",[223,224,226],"h2",{"id":225},"basic-java-clients","Basic Java clients",[211,228,229,230,239],{},"On the ",[218,231,238],{"href":232,"rel":233,"target":237},"https:\u002F\u002Fwww.confluent.io\u002Ftraining\u002F",[234,235,236],"nofollow","noopener","noreferer","_blank","kafka course"," one of the first things you develop is a basic consumer and producer in java.",[223,241,243],{"id":242},"producer","Producer",[211,245,246,247],{},"Let's take a look at the basic producer. There is one main java file here - ",[218,248,251],{"href":249,"rel":250,"target":237},"https:\u002F\u002Fgithub.com\u002Fchrissearle\u002Fkafka-java-to-scala\u002Fblob\u002Fmaster\u002Fjava-starter\u002Fproducer\u002Fsrc\u002Fmain\u002Fjava\u002Fnet\u002Fchrissearle\u002Fkafka\u002FBasicProducer.java",[234,235,236],"BasicProducer.java",[211,253,254],{},"The main method does three main things:",[256,257,262],"pre",{"className":258,"code":259,"language":260,"meta":261,"style":261},"language-java shiki shiki-themes github-dark","Properties settings = new Properties();\n\nsettings.put(\"client.id\", \"basic-producer\");\nsettings.put(\"bootstrap.servers\", \"localhost:29092\");\nsettings.put(\"key.serializer\", \"org.apache.kafka.common.serialization.StringSerializer\");\nsettings.put(\"value.serializer\", \"org.apache.kafka.common.serialization.StringSerializer\");\n","java","",[263,264,265,288,295,320,339,358],"code",{"__ignoreMap":261},[266,267,270,274,278,281,285],"span",{"class":268,"line":269},"line",1,[266,271,273],{"class":272},"s95oV","Properties settings ",[266,275,277],{"class":276},"snl16","=",[266,279,280],{"class":276}," new",[266,282,284],{"class":283},"svObZ"," Properties",[266,286,287],{"class":272},"();\n",[266,289,291],{"class":268,"line":290},2,[266,292,294],{"emptyLinePlaceholder":293},true,"\n",[266,296,298,301,304,307,311,314,317],{"class":268,"line":297},3,[266,299,300],{"class":272},"settings.",[266,302,303],{"class":283},"put",[266,305,306],{"class":272},"(",[266,308,310],{"class":309},"sU2Wk","\"client.id\"",[266,312,313],{"class":272},", ",[266,315,316],{"class":309},"\"basic-producer\"",[266,318,319],{"class":272},");\n",[266,321,323,325,327,329,332,334,337],{"class":268,"line":322},4,[266,324,300],{"class":272},[266,326,303],{"class":283},[266,328,306],{"class":272},[266,330,331],{"class":309},"\"bootstrap.servers\"",[266,333,313],{"class":272},[266,335,336],{"class":309},"\"localhost:29092\"",[266,338,319],{"class":272},[266,340,342,344,346,348,351,353,356],{"class":268,"line":341},5,[266,343,300],{"class":272},[266,345,303],{"class":283},[266,347,306],{"class":272},[266,349,350],{"class":309},"\"key.serializer\"",[266,352,313],{"class":272},[266,354,355],{"class":309},"\"org.apache.kafka.common.serialization.StringSerializer\"",[266,357,319],{"class":272},[266,359,361,363,365,367,370,372,374],{"class":268,"line":360},6,[266,362,300],{"class":272},[266,364,303],{"class":283},[266,366,306],{"class":272},[266,368,369],{"class":309},"\"value.serializer\"",[266,371,313],{"class":272},[266,373,355],{"class":309},[266,375,319],{"class":272},[211,377,378],{},"This sets up the configuration of the kafka producer that we want and says we are working with records that use String both as key and value.",[256,380,382],{"className":258,"code":381,"language":260,"meta":261,"style":261},"KafkaProducer\u003CString, String> producer = new KafkaProducer\u003C>(settings);\n",[263,383,384],{"__ignoreMap":261},[266,385,386,389,392,394,396,399,401,403],{"class":268,"line":269},[266,387,388],{"class":272},"KafkaProducer\u003C",[266,390,391],{"class":276},"String",[266,393,313],{"class":272},[266,395,391],{"class":276},[266,397,398],{"class":272},"> producer ",[266,400,277],{"class":276},[266,402,280],{"class":276},[266,404,405],{"class":272}," KafkaProducer\u003C>(settings);\n",[211,407,408],{},"This creates the producer with the supplied configuration.",[256,410,412],{"className":258,"code":411,"language":260,"meta":261,"style":261},"for (int i = 1; i \u003C= 5; i++) {\n    final String key = \"key-\" + i;\n    final String value = \"value-\" + i;\n\n    System.out.println(\"### Sending \" + i + \" ###\");\n\n    final ProducerRecord\u003CString, String> record = new ProducerRecord\u003C>(TOPIC, key, value);\n    producer.send(record);\n}\n",[263,413,414,452,471,487,491,516,520,544,556],{"__ignoreMap":261},[266,415,416,419,422,425,428,430,434,437,440,443,446,449],{"class":268,"line":269},[266,417,418],{"class":276},"for",[266,420,421],{"class":272}," (",[266,423,424],{"class":276},"int",[266,426,427],{"class":272}," i ",[266,429,277],{"class":276},[266,431,433],{"class":432},"sDLfK"," 1",[266,435,436],{"class":272},"; i ",[266,438,439],{"class":276},"\u003C=",[266,441,442],{"class":432}," 5",[266,444,445],{"class":272},"; i",[266,447,448],{"class":276},"++",[266,450,451],{"class":272},") {\n",[266,453,454,457,460,462,465,468],{"class":268,"line":290},[266,455,456],{"class":276},"    final",[266,458,459],{"class":272}," String key ",[266,461,277],{"class":276},[266,463,464],{"class":309}," \"key-\"",[266,466,467],{"class":276}," +",[266,469,470],{"class":272}," i;\n",[266,472,473,475,478,480,483,485],{"class":268,"line":297},[266,474,456],{"class":276},[266,476,477],{"class":272}," String value ",[266,479,277],{"class":276},[266,481,482],{"class":309}," \"value-\"",[266,484,467],{"class":276},[266,486,470],{"class":272},[266,488,489],{"class":268,"line":322},[266,490,294],{"emptyLinePlaceholder":293},[266,492,493,496,499,501,504,506,508,511,514],{"class":268,"line":341},[266,494,495],{"class":272},"    System.out.",[266,497,498],{"class":283},"println",[266,500,306],{"class":272},[266,502,503],{"class":309},"\"### Sending \"",[266,505,467],{"class":276},[266,507,427],{"class":272},[266,509,510],{"class":276},"+",[266,512,513],{"class":309}," \" ###\"",[266,515,319],{"class":272},[266,517,518],{"class":268,"line":360},[266,519,294],{"emptyLinePlaceholder":293},[266,521,523,525,528,530,532,534,537,539,541],{"class":268,"line":522},7,[266,524,456],{"class":276},[266,526,527],{"class":272}," ProducerRecord\u003C",[266,529,391],{"class":276},[266,531,313],{"class":272},[266,533,391],{"class":276},[266,535,536],{"class":272},"> record ",[266,538,277],{"class":276},[266,540,280],{"class":276},[266,542,543],{"class":272}," ProducerRecord\u003C>(TOPIC, key, value);\n",[266,545,547,550,553],{"class":268,"line":546},8,[266,548,549],{"class":272},"    producer.",[266,551,552],{"class":283},"send",[266,554,555],{"class":272},"(record);\n",[266,557,559],{"class":268,"line":558},9,[266,560,561],{"class":272},"}\n",[211,563,564,565],{},"This posts 5 messages to the topic ",[263,566,567],{},"hello-world-topic",[569,570,572],"h3",{"id":571},"build-and-run-the-producer","Build and run the producer",[211,574,575],{},"This is a standard maven project - simply open in your favourite IDE and build.",[211,577,578,579,584],{},"The BasicProducer class contains a standard main method - so you should easily be able to run the code from the IDE too. You can also use the maven-exec plugin (see ",[218,580,583],{"href":581,"rel":582,"target":237},"https:\u002F\u002Fgithub.com\u002Fchrissearle\u002Fkafka-java-to-scala\u002Fblob\u002Fmaster\u002Fjava-starter\u002Fproducer\u002FREADME.md",[234,235,236],"the readme",").",[211,586,587],{},"The output isn't wildly exciting (we haven't configured logging so ignore related lines):",[256,589,594],{"className":590,"code":592,"language":593},[591],"language-text","*** Starting Basic Producer ***\n### Sending 1 ###\n### Sending 2 ###\n### Sending 3 ###\n### Sending 4 ###\n### Sending 5 ###\n","text",[263,595,592],{"__ignoreMap":261},[211,597,598],{},"So - let's see if we can see what was added to the topic using a consumer.",[223,600,602],{"id":601},"consumer","Consumer",[211,604,605,606],{},"There is again one main java file here - ",[218,607,610],{"href":608,"rel":609,"target":237},"https:\u002F\u002Fgithub.com\u002Fchrissearle\u002Fkafka-java-to-scala\u002Fblob\u002Fmaster\u002Fjava-starter\u002Fconsumer\u002Fsrc\u002Fmain\u002Fjava\u002Fnet\u002Fchrissearle\u002Fkafka\u002FBasicConsumer.java",[234,235,236],"BasicConsumer.java",[211,612,613],{},"The main method again does three main things:",[256,615,617],{"className":258,"code":616,"language":260,"meta":261,"style":261},"Properties settings = new Properties();\n\nsettings.put(ConsumerConfig.GROUP_ID_CONFIG, \"basic-consumer\");\nsettings.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, \"localhost:29092\");\nsettings.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, \"true\");\nsettings.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, \"1000\");\nsettings.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, \"earliest\");\nsettings.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);\nsettings.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);\n",[263,618,619,631,635,649,662,676,690,704,713],{"__ignoreMap":261},[266,620,621,623,625,627,629],{"class":268,"line":269},[266,622,273],{"class":272},[266,624,277],{"class":276},[266,626,280],{"class":276},[266,628,284],{"class":283},[266,630,287],{"class":272},[266,632,633],{"class":268,"line":290},[266,634,294],{"emptyLinePlaceholder":293},[266,636,637,639,641,644,647],{"class":268,"line":297},[266,638,300],{"class":272},[266,640,303],{"class":283},[266,642,643],{"class":272},"(ConsumerConfig.GROUP_ID_CONFIG, ",[266,645,646],{"class":309},"\"basic-consumer\"",[266,648,319],{"class":272},[266,650,651,653,655,658,660],{"class":268,"line":322},[266,652,300],{"class":272},[266,654,303],{"class":283},[266,656,657],{"class":272},"(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, ",[266,659,336],{"class":309},[266,661,319],{"class":272},[266,663,664,666,668,671,674],{"class":268,"line":341},[266,665,300],{"class":272},[266,667,303],{"class":283},[266,669,670],{"class":272},"(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, ",[266,672,673],{"class":309},"\"true\"",[266,675,319],{"class":272},[266,677,678,680,682,685,688],{"class":268,"line":360},[266,679,300],{"class":272},[266,681,303],{"class":283},[266,683,684],{"class":272},"(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, ",[266,686,687],{"class":309},"\"1000\"",[266,689,319],{"class":272},[266,691,692,694,696,699,702],{"class":268,"line":522},[266,693,300],{"class":272},[266,695,303],{"class":283},[266,697,698],{"class":272},"(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, ",[266,700,701],{"class":309},"\"earliest\"",[266,703,319],{"class":272},[266,705,706,708,710],{"class":268,"line":546},[266,707,300],{"class":272},[266,709,303],{"class":283},[266,711,712],{"class":272},"(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);\n",[266,714,715,717,719],{"class":268,"line":558},[266,716,300],{"class":272},[266,718,303],{"class":283},[266,720,721],{"class":272},"(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);\n",[211,723,724],{},"This sets up the configuration of the kafka consumer that we want and says we are working with records that use String both as key and value.",[256,726,728],{"className":258,"code":727,"language":260,"meta":261,"style":261},"KafkaConsumer\u003CString, String> consumer = new KafkaConsumer\u003C>(settings);\n",[263,729,730],{"__ignoreMap":261},[266,731,732,735,737,739,741,744,746,748],{"class":268,"line":269},[266,733,734],{"class":272},"KafkaConsumer\u003C",[266,736,391],{"class":276},[266,738,313],{"class":272},[266,740,391],{"class":276},[266,742,743],{"class":272},"> consumer ",[266,745,277],{"class":276},[266,747,280],{"class":276},[266,749,750],{"class":272}," KafkaConsumer\u003C>(settings);\n",[211,752,753],{},"This creates the consumer with the supplied configuration.",[256,755,757],{"className":258,"code":756,"language":260,"meta":261,"style":261},"consumer.subscribe(Collections.singletonList(\"hello-world-topic\"));\n\nwhile (true) {\n    ConsumerRecords\u003CString, String> records = consumer.poll(Duration.ofMillis(100));\n\n    for (ConsumerRecord\u003CString, String> record : records) {\n        System.out.printf(\"offset = %d, key = %s, value = %s%n\", record.offset(), record.key(),record.value());\n    }\n}\n",[263,758,759,781,785,797,832,836,858,892,897],{"__ignoreMap":261},[266,760,761,764,767,770,773,775,778],{"class":268,"line":269},[266,762,763],{"class":272},"consumer.",[266,765,766],{"class":283},"subscribe",[266,768,769],{"class":272},"(Collections.",[266,771,772],{"class":283},"singletonList",[266,774,306],{"class":272},[266,776,777],{"class":309},"\"hello-world-topic\"",[266,779,780],{"class":272},"));\n",[266,782,783],{"class":268,"line":290},[266,784,294],{"emptyLinePlaceholder":293},[266,786,787,790,792,795],{"class":268,"line":297},[266,788,789],{"class":276},"while",[266,791,421],{"class":272},[266,793,794],{"class":432},"true",[266,796,451],{"class":272},[266,798,799,802,804,806,808,811,813,816,819,822,825,827,830],{"class":268,"line":322},[266,800,801],{"class":272},"    ConsumerRecords\u003C",[266,803,391],{"class":276},[266,805,313],{"class":272},[266,807,391],{"class":276},[266,809,810],{"class":272},"> records ",[266,812,277],{"class":276},[266,814,815],{"class":272}," consumer.",[266,817,818],{"class":283},"poll",[266,820,821],{"class":272},"(Duration.",[266,823,824],{"class":283},"ofMillis",[266,826,306],{"class":272},[266,828,829],{"class":432},"100",[266,831,780],{"class":272},[266,833,834],{"class":268,"line":341},[266,835,294],{"emptyLinePlaceholder":293},[266,837,838,841,844,846,848,850,852,855],{"class":268,"line":360},[266,839,840],{"class":276},"    for",[266,842,843],{"class":272}," (ConsumerRecord\u003C",[266,845,391],{"class":276},[266,847,313],{"class":272},[266,849,391],{"class":276},[266,851,536],{"class":272},[266,853,854],{"class":276},":",[266,856,857],{"class":272}," records) {\n",[266,859,860,863,866,868,871,874,877,880,883,886,889],{"class":268,"line":522},[266,861,862],{"class":272},"        System.out.",[266,864,865],{"class":283},"printf",[266,867,306],{"class":272},[266,869,870],{"class":309},"\"offset = %d, key = %s, value = %s%n\"",[266,872,873],{"class":272},", record.",[266,875,876],{"class":283},"offset",[266,878,879],{"class":272},"(), record.",[266,881,882],{"class":283},"key",[266,884,885],{"class":272},"(),record.",[266,887,888],{"class":283},"value",[266,890,891],{"class":272},"());\n",[266,893,894],{"class":268,"line":546},[266,895,896],{"class":272},"    }\n",[266,898,899],{"class":268,"line":558},[266,900,561],{"class":272},[211,902,903,904,906],{},"This subscribes to the topic ",[263,905,567],{}," and prints out whatever it finds there.",[569,908,910],{"id":909},"build-and-run-the-consumer","Build and run the consumer",[211,912,913,914,919],{},"This is also a standard maven project - again simply open in your favourite IDE and build then run the main method in BasicConsumer or use ",[218,915,918],{"href":916,"rel":917,"target":237},"https:\u002F\u002Fgithub.com\u002Fchrissearle\u002Fkafka-java-to-scala\u002Fblob\u002Fmaster\u002Fjava-starter\u002Fconsumer\u002FREADME.md",[234,235,236],"maven directly from the command line",".",[211,921,922],{},"The consumer output now shows the messages that the basic producer sent to the topic:",[256,924,927],{"className":925,"code":926,"language":593},[591],"*** 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",[263,928,926],{"__ignoreMap":261},[211,930,931],{},"Since the consumer listens until interrupted - break out with Ctrl-C.",[223,933,935],{"id":934},"summary","Summary",[211,937,938],{},"So - we have now a basic consumer and producer in java. Our next step will be a basic scala variant.",[940,941,942],"style",{},"html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}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 .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}",{"title":261,"searchDepth":290,"depth":290,"links":944},[945,946,949,952],{"id":225,"depth":290,"text":226},{"id":242,"depth":290,"text":243,"children":947},[948],{"id":571,"depth":297,"text":572},{"id":601,"depth":290,"text":602,"children":950},[951],{"id":909,"depth":297,"text":910},{"id":934,"depth":290,"text":935},"2019-04-25 12:14 +0200",null,"md","Basic producer and consumer in java",{"updated":958},"2020-01-23 00:00","\u002F2019\u002F04\u002F25\u002Fkafka-java-to-scala-java",{"title":206,"description":213},"Kafka - java to scala",{"loc":959},"2019\u002F04\u002F25\u002Fkafka-java-to-scala-java",[965,260,242,601,966],"kafka","tutorial","F2qwcVZhLHuYHo_tE1IlSQ7nt0MQmm1hAxgMCOyyz08",1775293009237]