[{"data":1,"prerenderedAt":2074},["ShallowReactive",2],{"Categories":3,"NavIndexCategoriesCountFooter":203,"content-\u002F2019\u002F05\u002F03\u002Fkafka-java-to-scala-scala-v2\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":2061,"description":213,"embedImage":2062,"extension":2063,"image":2062,"intro":216,"meta":2064,"navigation":771,"path":2066,"seo":2067,"series":2068,"sitemap":2069,"stem":2070,"tags":2071,"__hash__":2073},"content\u002F2019\u002F05\u002F03\u002Fkafka-java-to-scala-scala-v2.md","Kafka - java to scala - scala v2 - config",{"type":208,"value":209,"toc":2044},"minimark",[210,214,217,222,225,313,316,344,348,351,365,370,376,384,387,391,402,407,413,417,423,427,430,433,495,498,593,597,600,607,634,637,704,708,711,718,722,725,728,1328,1331,1956,1960,1963,1978,1981,1993,1996,2002,2005,2011,2015,2018,2022,2040],[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 scala but it was very close to a line by line conversion. Let's try for something that is closer to normal scala - and let's get the config values out to a configuration file.",[218,219,221],"h2",{"id":220},"app-boilerplate","App boilerplate",[211,223,224],{},"First change - instead of having an object with a main method - let's actually state that it's an app.",[226,227,232],"pre",{"className":228,"code":229,"language":230,"meta":231,"style":231},"language-scala shiki shiki-themes github-dark","object X {\n    def main(args: Array[String]): Unit = {\n        \u002F\u002F Application code\n    }\n}\n","scala","",[233,234,235,252,294,301,307],"code",{"__ignoreMap":231},[236,237,240,244,248],"span",{"class":238,"line":239},"line",1,[236,241,243],{"class":242},"snl16","object",[236,245,247],{"class":246},"svObZ"," X",[236,249,251],{"class":250},"s95oV"," {\n",[236,253,255,258,261,264,268,271,274,277,280,283,286,289,292],{"class":238,"line":254},2,[236,256,257],{"class":242},"    def",[236,259,260],{"class":246}," main",[236,262,263],{"class":250},"(",[236,265,267],{"class":266},"s9osk","args",[236,269,270],{"class":250},": ",[236,272,273],{"class":246},"Array",[236,275,276],{"class":250},"[",[236,278,279],{"class":246},"String",[236,281,282],{"class":250},"])",[236,284,285],{"class":242},":",[236,287,288],{"class":246}," Unit",[236,290,291],{"class":242}," =",[236,293,251],{"class":250},[236,295,297],{"class":238,"line":296},3,[236,298,300],{"class":299},"sAwPA","        \u002F\u002F Application code\n",[236,302,304],{"class":238,"line":303},4,[236,305,306],{"class":250},"    }\n",[236,308,310],{"class":238,"line":309},5,[236,311,312],{"class":250},"}\n",[211,314,315],{},"changes to",[226,317,319],{"className":228,"code":318,"language":230,"meta":231,"style":231},"object X extends App {\n    \u002F\u002F Application code\n}\n",[233,320,321,335,340],{"__ignoreMap":231},[236,322,323,325,327,330,333],{"class":238,"line":239},[236,324,243],{"class":242},[236,326,247],{"class":246},[236,328,329],{"class":242}," extends",[236,331,332],{"class":246}," App",[236,334,251],{"class":250},[236,336,337],{"class":238,"line":254},[236,338,339],{"class":299},"    \u002F\u002F Application code\n",[236,341,342],{"class":238,"line":296},[236,343,312],{"class":250},[218,345,347],{"id":346},"pure-config","Pure Config",[211,349,350],{},"The config values are present in the code - let's do something about that.",[211,352,353,354,364],{},"For this we'll use the ",[355,356,363],"a",{"href":357,"rel":358,"target":362},"https:\u002F\u002Fpureconfig.github.io\u002F",[359,360,361],"nofollow","noopener","noreferer","_blank","PureConfig"," library.",[366,367,369],"h3",{"id":368},"dependency","Dependency",[211,371,372,373,285],{},"We need to add the following to ",[233,374,375],{},"build.sbt",[226,377,382],{"className":378,"code":380,"language":381},[379],"language-text","  \"com.github.pureconfig\" %% \"pureconfig\" % \"0.12.0\"\n","text",[233,383,380],{"__ignoreMap":231},[211,385,386],{},"This is added to the list of libraryDependencies that is already present.",[366,388,390],{"id":389},"configuration-file","Configuration file",[211,392,393,394,397,398,401],{},"We can add our configuration values to a file under ",[233,395,396],{},"src\u002Fmain\u002Fresources"," called ",[233,399,400],{},"application.conf",".",[403,404,406],"h4",{"id":405},"producer","Producer",[226,408,411],{"className":409,"code":410,"language":381},[379],"client-id = \"pureconfig-producer\"\nbootstrap-servers = \"localhost:29092\"\ntopic = \"pureconfig-topic\"\nserializer = \"org.apache.kafka.common.serialization.StringSerializer\"\n",[233,412,410],{"__ignoreMap":231},[403,414,416],{"id":415},"consumer","Consumer",[226,418,421],{"className":419,"code":420,"language":381},[379],"group-id = \"pureconfig-consumer\"\nbootstrap-servers = \"localhost:29092\"\ntopic = \"pureconfig-topic\"\ndeserializer = \"org.apache.kafka.common.serialization.StringDeserializer\"\nenable-auto-commit = \"true\"\nauto-commit-interval-ms = \"1000\"\nauto-offset-reset = \"earliest\"\n",[233,422,420],{"__ignoreMap":231},[366,424,426],{"id":425},"loading-configuration","Loading configuration",[211,428,429],{},"PureConfig can load the values into a matching case class.",[403,431,406],{"id":432},"producer-1",[226,434,436],{"className":228,"code":435,"language":230,"meta":231,"style":231},"case class Config(clientId: String,\n                  bootstrapServers: String,\n                  topic: String,\n                  serializer: String)\n",[233,437,438,461,472,483],{"__ignoreMap":231},[236,439,440,443,446,449,451,454,456,458],{"class":238,"line":239},[236,441,442],{"class":242},"case",[236,444,445],{"class":242}," class",[236,447,448],{"class":246}," Config",[236,450,263],{"class":250},[236,452,453],{"class":266},"clientId",[236,455,270],{"class":250},[236,457,279],{"class":246},[236,459,460],{"class":250},",\n",[236,462,463,466,468,470],{"class":238,"line":254},[236,464,465],{"class":266},"                  bootstrapServers",[236,467,270],{"class":250},[236,469,279],{"class":246},[236,471,460],{"class":250},[236,473,474,477,479,481],{"class":238,"line":296},[236,475,476],{"class":266},"                  topic",[236,478,270],{"class":250},[236,480,279],{"class":246},[236,482,460],{"class":250},[236,484,485,488,490,492],{"class":238,"line":303},[236,486,487],{"class":266},"                  serializer",[236,489,270],{"class":250},[236,491,279],{"class":246},[236,493,494],{"class":250},")\n",[403,496,416],{"id":497},"consumer-1",[226,499,501],{"className":228,"code":500,"language":230,"meta":231,"style":231},"case class Config(groupId: String,\n                  bootstrapServers: String,\n                  enableAutoCommit: String,\n                  autoCommitIntervalMs: String,\n                  autoOffsetReset: String,\n                  deserializer: String,\n                  topic: String\n                 )\n",[233,502,503,522,532,543,554,565,577,587],{"__ignoreMap":231},[236,504,505,507,509,511,513,516,518,520],{"class":238,"line":239},[236,506,442],{"class":242},[236,508,445],{"class":242},[236,510,448],{"class":246},[236,512,263],{"class":250},[236,514,515],{"class":266},"groupId",[236,517,270],{"class":250},[236,519,279],{"class":246},[236,521,460],{"class":250},[236,523,524,526,528,530],{"class":238,"line":254},[236,525,465],{"class":266},[236,527,270],{"class":250},[236,529,279],{"class":246},[236,531,460],{"class":250},[236,533,534,537,539,541],{"class":238,"line":296},[236,535,536],{"class":266},"                  enableAutoCommit",[236,538,270],{"class":250},[236,540,279],{"class":246},[236,542,460],{"class":250},[236,544,545,548,550,552],{"class":238,"line":303},[236,546,547],{"class":266},"                  autoCommitIntervalMs",[236,549,270],{"class":250},[236,551,279],{"class":246},[236,553,460],{"class":250},[236,555,556,559,561,563],{"class":238,"line":309},[236,557,558],{"class":266},"                  autoOffsetReset",[236,560,270],{"class":250},[236,562,279],{"class":246},[236,564,460],{"class":250},[236,566,568,571,573,575],{"class":238,"line":567},6,[236,569,570],{"class":266},"                  deserializer",[236,572,270],{"class":250},[236,574,279],{"class":246},[236,576,460],{"class":250},[236,578,580,582,584],{"class":238,"line":579},7,[236,581,476],{"class":266},[236,583,270],{"class":250},[236,585,586],{"class":246},"String\n",[236,588,590],{"class":238,"line":589},8,[236,591,592],{"class":250},"                 )\n",[366,594,596],{"id":595},"loading-successful","Loading successful?",[211,598,599],{},"We can choose how to handle a config load so that we know if the configuation was loaded OK or not.",[211,601,602,603,606],{},"One method we can call is ",[233,604,605],{},"loadOrThrow"," which will throw an exception if it can't load the configuration.",[226,608,610],{"className":228,"code":609,"language":230,"meta":231,"style":231},"val conf = ConfigSource.default.loadOrThrow[Config]\n",[233,611,612],{"__ignoreMap":231},[236,613,614,617,620,622,625,628,631],{"class":238,"line":239},[236,615,616],{"class":242},"val",[236,618,619],{"class":266}," conf",[236,621,291],{"class":242},[236,623,624],{"class":246}," ConfigSource",[236,626,627],{"class":250},".default.loadOrThrow[",[236,629,630],{"class":246},"Config",[236,632,633],{"class":250},"]\n",[211,635,636],{},"Another option is to just use load - this returns in effect an Either - where the left choice is ConfigReaderFailures and the right choice is configuration matching the case class asked for.",[226,638,640],{"className":228,"code":639,"language":230,"meta":231,"style":231},"ConfigSource.default.load[Config] match {\n    case Left(errors) => ...\n    case Right(config: Config) => ...\n}\n",[233,641,642,660,677,700],{"__ignoreMap":231},[236,643,644,647,650,652,655,658],{"class":238,"line":239},[236,645,646],{"class":246},"ConfigSource",[236,648,649],{"class":250},".default.load[",[236,651,630],{"class":246},[236,653,654],{"class":250},"] ",[236,656,657],{"class":242},"match",[236,659,251],{"class":250},[236,661,662,665,668,671,674],{"class":238,"line":254},[236,663,664],{"class":242},"    case",[236,666,667],{"class":246}," Left",[236,669,670],{"class":250},"(errors) ",[236,672,673],{"class":242},"=>",[236,675,676],{"class":250}," ...\n",[236,678,679,681,684,686,689,691,693,696,698],{"class":238,"line":296},[236,680,664],{"class":242},[236,682,683],{"class":246}," Right",[236,685,263],{"class":250},[236,687,688],{"class":266},"config",[236,690,270],{"class":250},[236,692,630],{"class":246},[236,694,695],{"class":250},") ",[236,697,673],{"class":242},[236,699,676],{"class":250},[236,701,702],{"class":238,"line":303},[236,703,312],{"class":250},[366,705,707],{"id":706},"config-asproperties","Config asProperties",[211,709,710],{},"There is one thing that means that we can't just use our nice neat Config case classes as is. The kafka clients (KafkaProducer\u002FKafkaConsumer) require a java properties object.",[211,712,713,714,717],{},"For now - I've simply created an asProperties method onto each Config case class. However - there are other ways of handling this conversion (usually the word ",[233,715,716],{},"implicit"," turns up here - but for this example - let's keep it simple).",[218,719,721],{"id":720},"updated-clients","Updated clients",[211,723,724],{},"We'll throw in some other small tidying up - this gives the following clients:",[366,726,406],{"id":727},"producer-2",[226,729,731],{"className":228,"code":730,"language":230,"meta":231,"style":231},"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 pureconfig.ConfigSource\nimport pureconfig.generic.auto._\n\ncase class Config(clientId: String,\n                  bootstrapServers: String,\n                  topic: String,\n                  serializer: String) {\n\n  def asProperties: Properties = {\n    val props = new Properties()\n\n    props.put(CLIENT_ID_CONFIG, clientId)\n    props.put(BOOTSTRAP_SERVERS_CONFIG, bootstrapServers)\n    props.put(KEY_SERIALIZER_CLASS_CONFIG, serializer)\n    props.put(VALUE_SERIALIZER_CLASS_CONFIG, serializer)\n\n    props\n  }\n}\n\nobject ConfigProducer extends App {\n\n  ConfigSource.default.load[Config] match {\n    case Left(errors) =>\n      println(errors)\n      System.exit(1)\n\n    case Right(config: Config) =>\n      println(\"*** Starting Config Producer ***\")\n\n      val producer = new KafkaProducer[String, String](config.asProperties)\n\n      (1 to 5).foreach { i =>\n        producer.send(new ProducerRecord[String, String](config.topic, s\"key-$i\", s\"value-$i\"))\n      }\n\n      producer.close(Duration.ofMillis(100))\n\n      println(\"### Stopping Config Producer ###\")\n  }\n}\n",[233,732,733,751,767,773,828,862,874,895,899,918,929,940,952,957,975,994,999,1010,1020,1030,1039,1044,1050,1056,1061,1066,1080,1085,1101,1113,1119,1134,1139,1158,1170,1175,1202,1207,1226,1275,1281,1286,1303,1308,1318,1323],{"__ignoreMap":231},[236,734,735,738,741,743,746,748],{"class":238,"line":239},[236,736,737],{"class":242},"import",[236,739,740],{"class":246}," java",[236,742,401],{"class":250},[236,744,745],{"class":246},"time",[236,747,401],{"class":250},[236,749,750],{"class":246},"Duration\n",[236,752,753,755,757,759,762,764],{"class":238,"line":254},[236,754,737],{"class":242},[236,756,740],{"class":246},[236,758,401],{"class":250},[236,760,761],{"class":246},"util",[236,763,401],{"class":250},[236,765,766],{"class":246},"Properties\n",[236,768,769],{"class":238,"line":296},[236,770,772],{"emptyLinePlaceholder":771},true,"\n",[236,774,775,777,780,782,785,787,790,792,795,797,799,801,804,807,810,813,816,818,821,823,826],{"class":238,"line":303},[236,776,737],{"class":242},[236,778,779],{"class":246}," org",[236,781,401],{"class":250},[236,783,784],{"class":246},"apache",[236,786,401],{"class":250},[236,788,789],{"class":246},"kafka",[236,791,401],{"class":250},[236,793,794],{"class":246},"clients",[236,796,401],{"class":250},[236,798,405],{"class":246},[236,800,401],{"class":250},[236,802,803],{"class":246},"ProducerConfig",[236,805,806],{"class":250},".{",[236,808,809],{"class":246},"BOOTSTRAP_SERVERS_CONFIG",[236,811,812],{"class":250},", ",[236,814,815],{"class":246},"CLIENT_ID_CONFIG",[236,817,812],{"class":250},[236,819,820],{"class":246},"KEY_SERIALIZER_CLASS_CONFIG",[236,822,812],{"class":250},[236,824,825],{"class":246},"VALUE_SERIALIZER_CLASS_CONFIG",[236,827,312],{"class":250},[236,829,830,832,834,836,838,840,842,844,846,848,850,852,855,857,860],{"class":238,"line":309},[236,831,737],{"class":242},[236,833,779],{"class":246},[236,835,401],{"class":250},[236,837,784],{"class":246},[236,839,401],{"class":250},[236,841,789],{"class":246},[236,843,401],{"class":250},[236,845,794],{"class":246},[236,847,401],{"class":250},[236,849,405],{"class":246},[236,851,806],{"class":250},[236,853,854],{"class":246},"KafkaProducer",[236,856,812],{"class":250},[236,858,859],{"class":246},"ProducerRecord",[236,861,312],{"class":250},[236,863,864,866,869,871],{"class":238,"line":567},[236,865,737],{"class":242},[236,867,868],{"class":246}," pureconfig",[236,870,401],{"class":250},[236,872,873],{"class":246},"ConfigSource\n",[236,875,876,878,880,882,885,887,890,892],{"class":238,"line":579},[236,877,737],{"class":242},[236,879,868],{"class":246},[236,881,401],{"class":250},[236,883,884],{"class":246},"generic",[236,886,401],{"class":250},[236,888,889],{"class":246},"auto",[236,891,401],{"class":250},[236,893,894],{"class":246},"_\n",[236,896,897],{"class":238,"line":589},[236,898,772],{"emptyLinePlaceholder":771},[236,900,902,904,906,908,910,912,914,916],{"class":238,"line":901},9,[236,903,442],{"class":242},[236,905,445],{"class":242},[236,907,448],{"class":246},[236,909,263],{"class":250},[236,911,453],{"class":266},[236,913,270],{"class":250},[236,915,279],{"class":246},[236,917,460],{"class":250},[236,919,921,923,925,927],{"class":238,"line":920},10,[236,922,465],{"class":266},[236,924,270],{"class":250},[236,926,279],{"class":246},[236,928,460],{"class":250},[236,930,932,934,936,938],{"class":238,"line":931},11,[236,933,476],{"class":266},[236,935,270],{"class":250},[236,937,279],{"class":246},[236,939,460],{"class":250},[236,941,943,945,947,949],{"class":238,"line":942},12,[236,944,487],{"class":266},[236,946,270],{"class":250},[236,948,279],{"class":246},[236,950,951],{"class":250},") {\n",[236,953,955],{"class":238,"line":954},13,[236,956,772],{"emptyLinePlaceholder":771},[236,958,960,963,966,968,971,973],{"class":238,"line":959},14,[236,961,962],{"class":242},"  def",[236,964,965],{"class":246}," asProperties",[236,967,285],{"class":242},[236,969,970],{"class":246}," Properties",[236,972,291],{"class":242},[236,974,251],{"class":250},[236,976,978,981,984,986,989,991],{"class":238,"line":977},15,[236,979,980],{"class":242},"    val",[236,982,983],{"class":266}," props",[236,985,291],{"class":242},[236,987,988],{"class":242}," new",[236,990,970],{"class":246},[236,992,993],{"class":250},"()\n",[236,995,997],{"class":238,"line":996},16,[236,998,772],{"emptyLinePlaceholder":771},[236,1000,1002,1005,1007],{"class":238,"line":1001},17,[236,1003,1004],{"class":250},"    props.put(",[236,1006,815],{"class":246},[236,1008,1009],{"class":250},", clientId)\n",[236,1011,1013,1015,1017],{"class":238,"line":1012},18,[236,1014,1004],{"class":250},[236,1016,809],{"class":246},[236,1018,1019],{"class":250},", bootstrapServers)\n",[236,1021,1023,1025,1027],{"class":238,"line":1022},19,[236,1024,1004],{"class":250},[236,1026,820],{"class":246},[236,1028,1029],{"class":250},", serializer)\n",[236,1031,1033,1035,1037],{"class":238,"line":1032},20,[236,1034,1004],{"class":250},[236,1036,825],{"class":246},[236,1038,1029],{"class":250},[236,1040,1042],{"class":238,"line":1041},21,[236,1043,772],{"emptyLinePlaceholder":771},[236,1045,1047],{"class":238,"line":1046},22,[236,1048,1049],{"class":250},"    props\n",[236,1051,1053],{"class":238,"line":1052},23,[236,1054,1055],{"class":250},"  }\n",[236,1057,1059],{"class":238,"line":1058},24,[236,1060,312],{"class":250},[236,1062,1064],{"class":238,"line":1063},25,[236,1065,772],{"emptyLinePlaceholder":771},[236,1067,1069,1071,1074,1076,1078],{"class":238,"line":1068},26,[236,1070,243],{"class":242},[236,1072,1073],{"class":246}," ConfigProducer",[236,1075,329],{"class":242},[236,1077,332],{"class":246},[236,1079,251],{"class":250},[236,1081,1083],{"class":238,"line":1082},27,[236,1084,772],{"emptyLinePlaceholder":771},[236,1086,1088,1091,1093,1095,1097,1099],{"class":238,"line":1087},28,[236,1089,1090],{"class":246},"  ConfigSource",[236,1092,649],{"class":250},[236,1094,630],{"class":246},[236,1096,654],{"class":250},[236,1098,657],{"class":242},[236,1100,251],{"class":250},[236,1102,1104,1106,1108,1110],{"class":238,"line":1103},29,[236,1105,664],{"class":242},[236,1107,667],{"class":246},[236,1109,670],{"class":250},[236,1111,1112],{"class":242},"=>\n",[236,1114,1116],{"class":238,"line":1115},30,[236,1117,1118],{"class":250},"      println(errors)\n",[236,1120,1122,1125,1128,1132],{"class":238,"line":1121},31,[236,1123,1124],{"class":246},"      System",[236,1126,1127],{"class":250},".exit(",[236,1129,1131],{"class":1130},"sDLfK","1",[236,1133,494],{"class":250},[236,1135,1137],{"class":238,"line":1136},32,[236,1138,772],{"emptyLinePlaceholder":771},[236,1140,1142,1144,1146,1148,1150,1152,1154,1156],{"class":238,"line":1141},33,[236,1143,664],{"class":242},[236,1145,683],{"class":246},[236,1147,263],{"class":250},[236,1149,688],{"class":266},[236,1151,270],{"class":250},[236,1153,630],{"class":246},[236,1155,695],{"class":250},[236,1157,1112],{"class":242},[236,1159,1161,1164,1168],{"class":238,"line":1160},34,[236,1162,1163],{"class":250},"      println(",[236,1165,1167],{"class":1166},"sU2Wk","\"*** Starting Config Producer ***\"",[236,1169,494],{"class":250},[236,1171,1173],{"class":238,"line":1172},35,[236,1174,772],{"emptyLinePlaceholder":771},[236,1176,1178,1181,1184,1186,1188,1191,1193,1195,1197,1199],{"class":238,"line":1177},36,[236,1179,1180],{"class":242},"      val",[236,1182,1183],{"class":266}," producer",[236,1185,291],{"class":242},[236,1187,988],{"class":242},[236,1189,1190],{"class":246}," KafkaProducer",[236,1192,276],{"class":250},[236,1194,279],{"class":246},[236,1196,812],{"class":250},[236,1198,279],{"class":246},[236,1200,1201],{"class":250},"](config.asProperties)\n",[236,1203,1205],{"class":238,"line":1204},37,[236,1206,772],{"emptyLinePlaceholder":771},[236,1208,1210,1213,1215,1218,1221,1224],{"class":238,"line":1209},38,[236,1211,1212],{"class":250},"      (",[236,1214,1131],{"class":1130},[236,1216,1217],{"class":250}," to ",[236,1219,1220],{"class":1130},"5",[236,1222,1223],{"class":250},").foreach { i ",[236,1225,1112],{"class":242},[236,1227,1229,1232,1235,1238,1240,1242,1244,1246,1249,1252,1255,1258,1261,1263,1265,1268,1270,1272],{"class":238,"line":1228},39,[236,1230,1231],{"class":250},"        producer.send(",[236,1233,1234],{"class":242},"new",[236,1236,1237],{"class":246}," ProducerRecord",[236,1239,276],{"class":250},[236,1241,279],{"class":246},[236,1243,812],{"class":250},[236,1245,279],{"class":246},[236,1247,1248],{"class":250},"](config.topic, ",[236,1250,1251],{"class":242},"s",[236,1253,1254],{"class":1166},"\"key-",[236,1256,1257],{"class":250},"$i",[236,1259,1260],{"class":1166},"\"",[236,1262,812],{"class":250},[236,1264,1251],{"class":242},[236,1266,1267],{"class":1166},"\"value-",[236,1269,1257],{"class":250},[236,1271,1260],{"class":1166},[236,1273,1274],{"class":250},"))\n",[236,1276,1278],{"class":238,"line":1277},40,[236,1279,1280],{"class":250},"      }\n",[236,1282,1284],{"class":238,"line":1283},41,[236,1285,772],{"emptyLinePlaceholder":771},[236,1287,1289,1292,1295,1298,1301],{"class":238,"line":1288},42,[236,1290,1291],{"class":250},"      producer.close(",[236,1293,1294],{"class":246},"Duration",[236,1296,1297],{"class":250},".ofMillis(",[236,1299,1300],{"class":1130},"100",[236,1302,1274],{"class":250},[236,1304,1306],{"class":238,"line":1305},43,[236,1307,772],{"emptyLinePlaceholder":771},[236,1309,1311,1313,1316],{"class":238,"line":1310},44,[236,1312,1163],{"class":250},[236,1314,1315],{"class":1166},"\"### Stopping Config Producer ###\"",[236,1317,494],{"class":250},[236,1319,1321],{"class":238,"line":1320},45,[236,1322,1055],{"class":250},[236,1324,1326],{"class":238,"line":1325},46,[236,1327,312],{"class":250},[366,1329,416],{"id":1330},"consumer-2",[226,1332,1334],{"className":228,"code":1333,"language":230,"meta":231,"style":231},"import java.time.Duration\nimport java.util.Properties\n\nimport org.apache.kafka.clients.consumer.ConsumerConfig._\nimport org.apache.kafka.clients.consumer.KafkaConsumer\nimport pureconfig.ConfigSource\nimport pureconfig.generic.auto._\n\nimport scala.collection.JavaConverters._\n\ncase class Config(groupId: String,\n                  bootstrapServers: String,\n                  enableAutoCommit: String,\n                  autoCommitIntervalMs: String,\n                  autoOffsetReset: String,\n                  deserializer: String,\n                  topic: String\n                 ) {\n  def asProperties: Properties = {\n    val props = new Properties()\n\n    props.put(GROUP_ID_CONFIG, groupId)\n    props.put(BOOTSTRAP_SERVERS_CONFIG, bootstrapServers)\n    props.put(ENABLE_AUTO_COMMIT_CONFIG, enableAutoCommit)\n    props.put(AUTO_COMMIT_INTERVAL_MS_CONFIG, autoCommitIntervalMs)\n    props.put(AUTO_OFFSET_RESET_CONFIG, autoOffsetReset)\n    props.put(KEY_DESERIALIZER_CLASS_CONFIG, deserializer)\n    props.put(VALUE_DESERIALIZER_CLASS_CONFIG, deserializer)\n\n    props\n  }\n}\n\nobject ConfigConsumer extends App {\n  ConfigSource.default.load[Config] match {\n    case Left(errors) =>\n      println(errors)\n      System.exit(1)\n\n    case Right(config: Config) =>\n      println(\"*** Starting Config Consumer ***\")\n\n      val consumer = new KafkaConsumer[String, String](config.asProperties)\n\n      try {\n        consumer.subscribe(List(config.topic).asJava)\n\n        while (true) {\n          val records = consumer.poll(Duration.ofMillis(100)).asScala\n\n          for (record \u003C- records) {\n            println(s\"offset = ${record.offset}, key = ${record.key}, value = ${record.value}\")\n          }\n        }\n      } finally {\n        consumer.close()\n      }\n\n  }\n}\n",[233,1335,1336,1350,1364,1368,1399,1426,1436,1454,1458,1479,1483,1501,1511,1521,1531,1541,1551,1559,1564,1578,1592,1596,1606,1614,1624,1634,1644,1654,1663,1667,1671,1675,1679,1683,1696,1710,1720,1724,1734,1738,1756,1765,1769,1793,1797,1804,1815,1820,1834,1857,1862,1877,1907,1913,1919,1930,1936,1941,1946,1951],{"__ignoreMap":231},[236,1337,1338,1340,1342,1344,1346,1348],{"class":238,"line":239},[236,1339,737],{"class":242},[236,1341,740],{"class":246},[236,1343,401],{"class":250},[236,1345,745],{"class":246},[236,1347,401],{"class":250},[236,1349,750],{"class":246},[236,1351,1352,1354,1356,1358,1360,1362],{"class":238,"line":254},[236,1353,737],{"class":242},[236,1355,740],{"class":246},[236,1357,401],{"class":250},[236,1359,761],{"class":246},[236,1361,401],{"class":250},[236,1363,766],{"class":246},[236,1365,1366],{"class":238,"line":296},[236,1367,772],{"emptyLinePlaceholder":771},[236,1369,1370,1372,1374,1376,1378,1380,1382,1384,1386,1388,1390,1392,1395,1397],{"class":238,"line":303},[236,1371,737],{"class":242},[236,1373,779],{"class":246},[236,1375,401],{"class":250},[236,1377,784],{"class":246},[236,1379,401],{"class":250},[236,1381,789],{"class":246},[236,1383,401],{"class":250},[236,1385,794],{"class":246},[236,1387,401],{"class":250},[236,1389,415],{"class":246},[236,1391,401],{"class":250},[236,1393,1394],{"class":246},"ConsumerConfig",[236,1396,401],{"class":250},[236,1398,894],{"class":246},[236,1400,1401,1403,1405,1407,1409,1411,1413,1415,1417,1419,1421,1423],{"class":238,"line":309},[236,1402,737],{"class":242},[236,1404,779],{"class":246},[236,1406,401],{"class":250},[236,1408,784],{"class":246},[236,1410,401],{"class":250},[236,1412,789],{"class":246},[236,1414,401],{"class":250},[236,1416,794],{"class":246},[236,1418,401],{"class":250},[236,1420,415],{"class":246},[236,1422,401],{"class":250},[236,1424,1425],{"class":246},"KafkaConsumer\n",[236,1427,1428,1430,1432,1434],{"class":238,"line":567},[236,1429,737],{"class":242},[236,1431,868],{"class":246},[236,1433,401],{"class":250},[236,1435,873],{"class":246},[236,1437,1438,1440,1442,1444,1446,1448,1450,1452],{"class":238,"line":579},[236,1439,737],{"class":242},[236,1441,868],{"class":246},[236,1443,401],{"class":250},[236,1445,884],{"class":246},[236,1447,401],{"class":250},[236,1449,889],{"class":246},[236,1451,401],{"class":250},[236,1453,894],{"class":246},[236,1455,1456],{"class":238,"line":589},[236,1457,772],{"emptyLinePlaceholder":771},[236,1459,1460,1462,1465,1467,1470,1472,1475,1477],{"class":238,"line":901},[236,1461,737],{"class":242},[236,1463,1464],{"class":246}," scala",[236,1466,401],{"class":250},[236,1468,1469],{"class":246},"collection",[236,1471,401],{"class":250},[236,1473,1474],{"class":246},"JavaConverters",[236,1476,401],{"class":250},[236,1478,894],{"class":246},[236,1480,1481],{"class":238,"line":920},[236,1482,772],{"emptyLinePlaceholder":771},[236,1484,1485,1487,1489,1491,1493,1495,1497,1499],{"class":238,"line":931},[236,1486,442],{"class":242},[236,1488,445],{"class":242},[236,1490,448],{"class":246},[236,1492,263],{"class":250},[236,1494,515],{"class":266},[236,1496,270],{"class":250},[236,1498,279],{"class":246},[236,1500,460],{"class":250},[236,1502,1503,1505,1507,1509],{"class":238,"line":942},[236,1504,465],{"class":266},[236,1506,270],{"class":250},[236,1508,279],{"class":246},[236,1510,460],{"class":250},[236,1512,1513,1515,1517,1519],{"class":238,"line":954},[236,1514,536],{"class":266},[236,1516,270],{"class":250},[236,1518,279],{"class":246},[236,1520,460],{"class":250},[236,1522,1523,1525,1527,1529],{"class":238,"line":959},[236,1524,547],{"class":266},[236,1526,270],{"class":250},[236,1528,279],{"class":246},[236,1530,460],{"class":250},[236,1532,1533,1535,1537,1539],{"class":238,"line":977},[236,1534,558],{"class":266},[236,1536,270],{"class":250},[236,1538,279],{"class":246},[236,1540,460],{"class":250},[236,1542,1543,1545,1547,1549],{"class":238,"line":996},[236,1544,570],{"class":266},[236,1546,270],{"class":250},[236,1548,279],{"class":246},[236,1550,460],{"class":250},[236,1552,1553,1555,1557],{"class":238,"line":1001},[236,1554,476],{"class":266},[236,1556,270],{"class":250},[236,1558,586],{"class":246},[236,1560,1561],{"class":238,"line":1012},[236,1562,1563],{"class":250},"                 ) {\n",[236,1565,1566,1568,1570,1572,1574,1576],{"class":238,"line":1022},[236,1567,962],{"class":242},[236,1569,965],{"class":246},[236,1571,285],{"class":242},[236,1573,970],{"class":246},[236,1575,291],{"class":242},[236,1577,251],{"class":250},[236,1579,1580,1582,1584,1586,1588,1590],{"class":238,"line":1032},[236,1581,980],{"class":242},[236,1583,983],{"class":266},[236,1585,291],{"class":242},[236,1587,988],{"class":242},[236,1589,970],{"class":246},[236,1591,993],{"class":250},[236,1593,1594],{"class":238,"line":1041},[236,1595,772],{"emptyLinePlaceholder":771},[236,1597,1598,1600,1603],{"class":238,"line":1046},[236,1599,1004],{"class":250},[236,1601,1602],{"class":246},"GROUP_ID_CONFIG",[236,1604,1605],{"class":250},", groupId)\n",[236,1607,1608,1610,1612],{"class":238,"line":1052},[236,1609,1004],{"class":250},[236,1611,809],{"class":246},[236,1613,1019],{"class":250},[236,1615,1616,1618,1621],{"class":238,"line":1058},[236,1617,1004],{"class":250},[236,1619,1620],{"class":246},"ENABLE_AUTO_COMMIT_CONFIG",[236,1622,1623],{"class":250},", enableAutoCommit)\n",[236,1625,1626,1628,1631],{"class":238,"line":1063},[236,1627,1004],{"class":250},[236,1629,1630],{"class":246},"AUTO_COMMIT_INTERVAL_MS_CONFIG",[236,1632,1633],{"class":250},", autoCommitIntervalMs)\n",[236,1635,1636,1638,1641],{"class":238,"line":1068},[236,1637,1004],{"class":250},[236,1639,1640],{"class":246},"AUTO_OFFSET_RESET_CONFIG",[236,1642,1643],{"class":250},", autoOffsetReset)\n",[236,1645,1646,1648,1651],{"class":238,"line":1082},[236,1647,1004],{"class":250},[236,1649,1650],{"class":246},"KEY_DESERIALIZER_CLASS_CONFIG",[236,1652,1653],{"class":250},", deserializer)\n",[236,1655,1656,1658,1661],{"class":238,"line":1087},[236,1657,1004],{"class":250},[236,1659,1660],{"class":246},"VALUE_DESERIALIZER_CLASS_CONFIG",[236,1662,1653],{"class":250},[236,1664,1665],{"class":238,"line":1103},[236,1666,772],{"emptyLinePlaceholder":771},[236,1668,1669],{"class":238,"line":1115},[236,1670,1049],{"class":250},[236,1672,1673],{"class":238,"line":1121},[236,1674,1055],{"class":250},[236,1676,1677],{"class":238,"line":1136},[236,1678,312],{"class":250},[236,1680,1681],{"class":238,"line":1141},[236,1682,772],{"emptyLinePlaceholder":771},[236,1684,1685,1687,1690,1692,1694],{"class":238,"line":1160},[236,1686,243],{"class":242},[236,1688,1689],{"class":246}," ConfigConsumer",[236,1691,329],{"class":242},[236,1693,332],{"class":246},[236,1695,251],{"class":250},[236,1697,1698,1700,1702,1704,1706,1708],{"class":238,"line":1172},[236,1699,1090],{"class":246},[236,1701,649],{"class":250},[236,1703,630],{"class":246},[236,1705,654],{"class":250},[236,1707,657],{"class":242},[236,1709,251],{"class":250},[236,1711,1712,1714,1716,1718],{"class":238,"line":1177},[236,1713,664],{"class":242},[236,1715,667],{"class":246},[236,1717,670],{"class":250},[236,1719,1112],{"class":242},[236,1721,1722],{"class":238,"line":1204},[236,1723,1118],{"class":250},[236,1725,1726,1728,1730,1732],{"class":238,"line":1209},[236,1727,1124],{"class":246},[236,1729,1127],{"class":250},[236,1731,1131],{"class":1130},[236,1733,494],{"class":250},[236,1735,1736],{"class":238,"line":1228},[236,1737,772],{"emptyLinePlaceholder":771},[236,1739,1740,1742,1744,1746,1748,1750,1752,1754],{"class":238,"line":1277},[236,1741,664],{"class":242},[236,1743,683],{"class":246},[236,1745,263],{"class":250},[236,1747,688],{"class":266},[236,1749,270],{"class":250},[236,1751,630],{"class":246},[236,1753,695],{"class":250},[236,1755,1112],{"class":242},[236,1757,1758,1760,1763],{"class":238,"line":1283},[236,1759,1163],{"class":250},[236,1761,1762],{"class":1166},"\"*** Starting Config Consumer ***\"",[236,1764,494],{"class":250},[236,1766,1767],{"class":238,"line":1288},[236,1768,772],{"emptyLinePlaceholder":771},[236,1770,1771,1773,1776,1778,1780,1783,1785,1787,1789,1791],{"class":238,"line":1305},[236,1772,1180],{"class":242},[236,1774,1775],{"class":266}," consumer",[236,1777,291],{"class":242},[236,1779,988],{"class":242},[236,1781,1782],{"class":246}," KafkaConsumer",[236,1784,276],{"class":250},[236,1786,279],{"class":246},[236,1788,812],{"class":250},[236,1790,279],{"class":246},[236,1792,1201],{"class":250},[236,1794,1795],{"class":238,"line":1310},[236,1796,772],{"emptyLinePlaceholder":771},[236,1798,1799,1802],{"class":238,"line":1320},[236,1800,1801],{"class":242},"      try",[236,1803,251],{"class":250},[236,1805,1806,1809,1812],{"class":238,"line":1325},[236,1807,1808],{"class":250},"        consumer.subscribe(",[236,1810,1811],{"class":246},"List",[236,1813,1814],{"class":250},"(config.topic).asJava)\n",[236,1816,1818],{"class":238,"line":1817},47,[236,1819,772],{"emptyLinePlaceholder":771},[236,1821,1823,1826,1829,1832],{"class":238,"line":1822},48,[236,1824,1825],{"class":242},"        while",[236,1827,1828],{"class":250}," (",[236,1830,1831],{"class":1130},"true",[236,1833,951],{"class":250},[236,1835,1837,1840,1843,1845,1848,1850,1852,1854],{"class":238,"line":1836},49,[236,1838,1839],{"class":242},"          val",[236,1841,1842],{"class":266}," records",[236,1844,291],{"class":242},[236,1846,1847],{"class":250}," consumer.poll(",[236,1849,1294],{"class":246},[236,1851,1297],{"class":250},[236,1853,1300],{"class":1130},[236,1855,1856],{"class":250},")).asScala\n",[236,1858,1860],{"class":238,"line":1859},50,[236,1861,772],{"emptyLinePlaceholder":771},[236,1863,1865,1868,1871,1874],{"class":238,"line":1864},51,[236,1866,1867],{"class":242},"          for",[236,1869,1870],{"class":250}," (record ",[236,1872,1873],{"class":242},"\u003C-",[236,1875,1876],{"class":250}," records) {\n",[236,1878,1880,1883,1885,1888,1891,1894,1897,1900,1903,1905],{"class":238,"line":1879},52,[236,1881,1882],{"class":250},"            println(",[236,1884,1251],{"class":242},[236,1886,1887],{"class":1166},"\"offset = ",[236,1889,1890],{"class":250},"${record.offset}",[236,1892,1893],{"class":1166},", key = ",[236,1895,1896],{"class":250},"${record.key}",[236,1898,1899],{"class":1166},", value = ",[236,1901,1902],{"class":250},"${record.value}",[236,1904,1260],{"class":1166},[236,1906,494],{"class":250},[236,1908,1910],{"class":238,"line":1909},53,[236,1911,1912],{"class":250},"          }\n",[236,1914,1916],{"class":238,"line":1915},54,[236,1917,1918],{"class":250},"        }\n",[236,1920,1922,1925,1928],{"class":238,"line":1921},55,[236,1923,1924],{"class":250},"      } ",[236,1926,1927],{"class":242},"finally",[236,1929,251],{"class":250},[236,1931,1933],{"class":238,"line":1932},56,[236,1934,1935],{"class":250},"        consumer.close()\n",[236,1937,1939],{"class":238,"line":1938},57,[236,1940,1280],{"class":250},[236,1942,1944],{"class":238,"line":1943},58,[236,1945,772],{"emptyLinePlaceholder":771},[236,1947,1949],{"class":238,"line":1948},59,[236,1950,1055],{"class":250},[236,1952,1954],{"class":238,"line":1953},60,[236,1955,312],{"class":250},[366,1957,1959],{"id":1958},"build-and-run","Build and Run",[211,1961,1962],{},"For each client - we can check it compiles and run it using sbt as before:",[226,1964,1968],{"className":1965,"code":1966,"language":1967,"meta":231,"style":231},"language-shell shiki shiki-themes github-dark","sbt compile\n","shell",[233,1969,1970],{"__ignoreMap":231},[236,1971,1972,1975],{"class":238,"line":239},[236,1973,1974],{"class":246},"sbt",[236,1976,1977],{"class":1166}," compile\n",[211,1979,1980],{},"sbt's run command will also find classes that extend App so we can also still run:",[226,1982,1984],{"className":1965,"code":1983,"language":1967,"meta":231,"style":231},"sbt run\n",[233,1985,1986],{"__ignoreMap":231},[236,1987,1988,1990],{"class":238,"line":239},[236,1989,1974],{"class":246},[236,1991,1992],{"class":1166}," run\n",[211,1994,1995],{},"Producer output:",[226,1997,2000],{"className":1998,"code":1999,"language":381},[379],"*** Starting Config Producer ***\n### Stopping Config Producer ###\n",[233,2001,1999],{"__ignoreMap":231},[211,2003,2004],{},"Consumer output:",[226,2006,2009],{"className":2007,"code":2008,"language":381},[379],"*** Starting Config 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",[233,2010,2008],{"__ignoreMap":231},[218,2012,2014],{"id":2013},"summary","Summary",[211,2016,2017],{},"In this step we tidied up the producer and consumer a little and moved our configuration out to a config file.",[218,2019,2021],{"id":2020},"links","Links",[2023,2024,2025,2033],"ul",{},[2026,2027,2028],"li",{},[355,2029,2032],{"href":2030,"rel":2031,"target":362},"https:\u002F\u002Fgithub.com\u002Fchrissearle\u002Fkafka-java-to-scala\u002Ftree\u002Fmaster\u002Fscala-v2-config\u002Fconfigproducer",[359,360,361],"Producer project",[2026,2034,2035],{},[355,2036,2039],{"href":2037,"rel":2038,"target":362},"https:\u002F\u002Fgithub.com\u002Fchrissearle\u002Fkafka-java-to-scala\u002Ftree\u002Fmaster\u002Fscala-v2-config\u002Fconfigconsumer",[359,360,361],"Consumer project",[2041,2042,2043],"style",{},"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 .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}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}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}",{"title":231,"searchDepth":254,"depth":254,"links":2045},[2046,2047,2054,2059,2060],{"id":220,"depth":254,"text":221},{"id":346,"depth":254,"text":347,"children":2048},[2049,2050,2051,2052,2053],{"id":368,"depth":296,"text":369},{"id":389,"depth":296,"text":390},{"id":425,"depth":296,"text":426},{"id":595,"depth":296,"text":596},{"id":706,"depth":296,"text":707},{"id":720,"depth":254,"text":721,"children":2055},[2056,2057,2058],{"id":727,"depth":296,"text":406},{"id":1330,"depth":296,"text":416},{"id":1958,"depth":296,"text":1959},{"id":2013,"depth":254,"text":2014},{"id":2020,"depth":254,"text":2021},"2019-05-03 11:33 +0200",null,"md",{"updated":2065},"2020-01-23 00:00","\u002F2019\u002F05\u002F03\u002Fkafka-java-to-scala-scala-v2",{"title":206,"description":213},"Kafka - java to scala",{"loc":2066},"2019\u002F05\u002F03\u002Fkafka-java-to-scala-scala-v2",[789,230,405,415,2072],"pureconfig","pebskUlIafAvqsrJQHdIFAdJywmZ4gTFJI2Up0IxDns",1775293009145]