[{"data":1,"prerenderedAt":5320},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fbuilding\u002Fscheduled-sources":314,"\u002Fdocs\u002Fbuilding\u002Fscheduled-sources-surround":5315},[4,38,86,149,176,219,257,273],{"title":5,"path":6,"stem":7,"children":8,"icon":37},"Getting Started","\u002Fdocs\u002Fgetting-started","1.docs\u002F1.getting-started\u002F1.index",[9,12,17,22,27,32],{"title":10,"path":6,"stem":7,"icon":11},"Getting started","i-lucide-flag",{"title":13,"path":14,"stem":15,"icon":16},"Modules overview","\u002Fdocs\u002Fgetting-started\u002Fmodules-overview","1.docs\u002F1.getting-started\u002F2.modules-overview","i-lucide-boxes",{"title":18,"path":19,"stem":20,"icon":21},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","1.docs\u002F1.getting-started\u002F3.installation","i-lucide-download",{"title":23,"path":24,"stem":25,"icon":26},"License configuration","\u002Fdocs\u002Fgetting-started\u002Flicense-configuration","1.docs\u002F1.getting-started\u002F4.license-configuration","i-lucide-key-round",{"title":28,"path":29,"stem":30,"icon":31},"Your first app","\u002Fdocs\u002Fgetting-started\u002Ffirst-app","1.docs\u002F1.getting-started\u002F5.first-app","i-lucide-square-play",{"title":33,"path":34,"stem":35,"icon":36},"Project setup","\u002Fdocs\u002Fgetting-started\u002Fproject-setup","1.docs\u002F1.getting-started\u002F6.project-setup","i-lucide-package",false,{"title":39,"path":40,"stem":41,"children":42,"icon":45},"Core Concepts","\u002Fdocs\u002Fconcepts","1.docs\u002F2.concepts\u002F1.index",[43,46,51,56,61,66,71,76,81],{"title":44,"path":40,"stem":41,"icon":45},"Core concepts","i-lucide-book-open",{"title":47,"path":48,"stem":49,"icon":50},"Architecture","\u002Fdocs\u002Fconcepts\u002Farchitecture","1.docs\u002F2.concepts\u002F2.architecture","i-lucide-layers",{"title":52,"path":53,"stem":54,"icon":55},"Exactly-once semantics","\u002Fdocs\u002Fconcepts\u002Fexactly-once","1.docs\u002F2.concepts\u002F3.exactly-once","i-lucide-shield-check",{"title":57,"path":58,"stem":59,"icon":60},"Lanes and parallelism","\u002Fdocs\u002Fconcepts\u002Flanes-and-parallelism","1.docs\u002F2.concepts\u002F4.lanes-and-parallelism","i-lucide-split",{"title":62,"path":63,"stem":64,"icon":65},"State and thread-safety","\u002Fdocs\u002Fconcepts\u002Fstate-and-thread-safety","1.docs\u002F2.concepts\u002F5.state-and-thread-safety","i-lucide-lock",{"title":67,"path":68,"stem":69,"icon":70},"Event time and watermarks","\u002Fdocs\u002Fconcepts\u002Fevent-time-and-watermarks","1.docs\u002F2.concepts\u002F6.event-time-and-watermarks","i-lucide-clock",{"title":72,"path":73,"stem":74,"icon":75},"The configuration model","\u002Fdocs\u002Fconcepts\u002Fconfiguration-model","1.docs\u002F2.concepts\u002F7.configuration-model","i-lucide-sliders-horizontal",{"title":77,"path":78,"stem":79,"icon":80},"The error-handling model","\u002Fdocs\u002Fconcepts\u002Ferror-handling-model","1.docs\u002F2.concepts\u002F8.error-handling-model","i-lucide-triangle-alert",{"title":82,"path":83,"stem":84,"icon":85},"How StoatFlow differs from Kafka Streams","\u002Fdocs\u002Fconcepts\u002Fhow-stoatflow-differs-from-ks","1.docs\u002F2.concepts\u002F9.how-stoatflow-differs-from-ks","i-lucide-arrow-left-right",{"title":87,"path":88,"stem":89,"children":90,"icon":93},"Building Topologies","\u002Fdocs\u002Fbuilding","1.docs\u002F3.building\u002F1.index",[91,94,99,104,109,114,119,124,129,134,139,144],{"title":92,"path":88,"stem":89,"icon":93},"Building topologies","i-lucide-blocks",{"title":95,"path":96,"stem":97,"icon":98},"Error handling and DLQ","\u002Fdocs\u002Fbuilding\u002Ferror-handling-dlq","1.docs\u002F3.building\u002F10.error-handling-dlq","i-lucide-circle-x",{"title":100,"path":101,"stem":102,"icon":103},"State stores","\u002Fdocs\u002Fbuilding\u002Fstate-stores","1.docs\u002F3.building\u002F11.state-stores","i-lucide-database",{"title":105,"path":106,"stem":107,"icon":108},"Testing topologies","\u002Fdocs\u002Fbuilding\u002Ftesting","1.docs\u002F3.building\u002F12.testing","i-lucide-flask-conical",{"title":110,"path":111,"stem":112,"icon":113},"Sources and sinks","\u002Fdocs\u002Fbuilding\u002Fstreams-builder","1.docs\u002F3.building\u002F2.streams-builder","i-lucide-import",{"title":115,"path":116,"stem":117,"icon":118},"KStream and KTable operations","\u002Fdocs\u002Fbuilding\u002Fkstream-ktable","1.docs\u002F3.building\u002F3.kstream-ktable","i-lucide-waypoints",{"title":120,"path":121,"stem":122,"icon":123},"Aggregations","\u002Fdocs\u002Fbuilding\u002Faggregations","1.docs\u002F3.building\u002F4.aggregations","i-lucide-sigma",{"title":125,"path":126,"stem":127,"icon":128},"Windowing","\u002Fdocs\u002Fbuilding\u002Fwindowing","1.docs\u002F3.building\u002F5.windowing","i-lucide-calendar-clock",{"title":130,"path":131,"stem":132,"icon":133},"Joins","\u002Fdocs\u002Fbuilding\u002Fjoins","1.docs\u002F3.building\u002F6.joins","i-lucide-git-merge",{"title":135,"path":136,"stem":137,"icon":138},"The Processor API","\u002Fdocs\u002Fbuilding\u002Fprocessor-api","1.docs\u002F3.building\u002F7.processor-api","i-lucide-cpu",{"title":140,"path":141,"stem":142,"icon":143},"Scheduled sources","\u002Fdocs\u002Fbuilding\u002Fscheduled-sources","1.docs\u002F3.building\u002F8.scheduled-sources","i-lucide-timer",{"title":145,"path":146,"stem":147,"icon":148},"Serdes and Avro","\u002Fdocs\u002Fbuilding\u002Fserdes","1.docs\u002F3.building\u002F9.serdes","i-lucide-binary",{"title":150,"path":151,"stem":152,"children":153,"icon":75},"Configuration","\u002Fdocs\u002Fconfiguration","1.docs\u002F4.configuration\u002F1.index",[154,156,161,166,171],{"title":155,"path":151,"stem":152,"icon":75},"How configuration works",{"title":157,"path":158,"stem":159,"icon":160},"Engine configuration (:core)","\u002Fdocs\u002Fconfiguration\u002Fcore-config","1.docs\u002F4.configuration\u002F2.core-config","i-lucide-settings-2",{"title":162,"path":163,"stem":164,"icon":165},"Runtime configuration (:runtime)","\u002Fdocs\u002Fconfiguration\u002Fruntime-config","1.docs\u002F4.configuration\u002F3.runtime-config","i-lucide-server-cog",{"title":167,"path":168,"stem":169,"icon":170},"Defaults, adaptivity, and presets","\u002Fdocs\u002Fconfiguration\u002Fdefaults-and-presets","1.docs\u002F4.configuration\u002F4.defaults-and-presets","i-lucide-gauge",{"title":172,"path":173,"stem":174,"icon":175},"Kafka client configuration","\u002Fdocs\u002Fconfiguration\u002Fkafka-client-config","1.docs\u002F4.configuration\u002F5.kafka-client-config","i-lucide-plug",{"title":177,"path":178,"stem":179,"children":180,"icon":183},"Running in Production","\u002Fdocs\u002Fruntime","1.docs\u002F5.runtime\u002F1.index",[181,184,189,194,199,204,209,214],{"title":182,"path":178,"stem":179,"icon":183},"The runtime","i-lucide-server",{"title":185,"path":186,"stem":187,"icon":188},"The REST API","\u002Fdocs\u002Fruntime\u002Frest-api","1.docs\u002F5.runtime\u002F2.rest-api","i-lucide-globe",{"title":190,"path":191,"stem":192,"icon":193},"Health checks","\u002Fdocs\u002Fruntime\u002Fhealth-checks","1.docs\u002F5.runtime\u002F3.health-checks","i-lucide-heart-pulse",{"title":195,"path":196,"stem":197,"icon":198},"Metrics","\u002Fdocs\u002Fruntime\u002Fmetrics","1.docs\u002F5.runtime\u002F4.metrics","i-lucide-activity",{"title":200,"path":201,"stem":202,"icon":203},"Pause and resume","\u002Fdocs\u002Fruntime\u002Fpause-unpause","1.docs\u002F5.runtime\u002F5.pause-unpause","i-lucide-pause",{"title":205,"path":206,"stem":207,"icon":208},"Plugins and lifecycle hooks","\u002Fdocs\u002Fruntime\u002Fplugins","1.docs\u002F5.runtime\u002F6.plugins","i-lucide-puzzle",{"title":210,"path":211,"stem":212,"icon":213},"Docker images","\u002Fdocs\u002Fruntime\u002Fdocker","1.docs\u002F5.runtime\u002F7.docker","i-lucide-container",{"title":215,"path":216,"stem":217,"icon":218},"GraalVM native image","\u002Fdocs\u002Fruntime\u002Fnative-image","1.docs\u002F5.runtime\u002F8.native-image","i-lucide-zap",{"title":220,"path":221,"stem":222,"children":223,"icon":226},"Deploying & Operating","\u002Fdocs\u002Foperating","1.docs\u002F6.operating\u002F1.index",[224,227,232,237,242,247,252],{"title":225,"path":221,"stem":222,"icon":226},"Deploying and operating","i-lucide-life-buoy",{"title":228,"path":229,"stem":230,"icon":231},"Running on Kubernetes","\u002Fdocs\u002Foperating\u002Fkubernetes","1.docs\u002F6.operating\u002F2.kubernetes","i-lucide-ship",{"title":233,"path":234,"stem":235,"icon":236},"High availability","\u002Fdocs\u002Foperating\u002Fhigh-availability","1.docs\u002F6.operating\u002F3.high-availability","i-lucide-copy",{"title":238,"path":239,"stem":240,"icon":241},"Liveness and readiness probes","\u002Fdocs\u002Foperating\u002Fprobes","1.docs\u002F6.operating\u002F4.probes","i-lucide-stethoscope",{"title":243,"path":244,"stem":245,"icon":246},"Observability","\u002Fdocs\u002Foperating\u002Fobservability","1.docs\u002F6.operating\u002F5.observability","i-lucide-telescope",{"title":248,"path":249,"stem":250,"icon":251},"Tuning under load","\u002Fdocs\u002Foperating\u002Ftuning","1.docs\u002F6.operating\u002F6.tuning","i-lucide-sliders",{"title":253,"path":254,"stem":255,"icon":256},"Production checklist","\u002Fdocs\u002Foperating\u002Fproduction-checklist","1.docs\u002F6.operating\u002F7.production-checklist","i-lucide-clipboard-check",{"title":258,"path":259,"stem":260,"children":261,"icon":85},"Migrating from Kafka Streams","\u002Fdocs\u002Fmigration","1.docs\u002F7.migration\u002F1.index",[262,263,268],{"title":258,"path":259,"stem":260,"icon":85},{"title":264,"path":265,"stem":266,"icon":267},"Migration without carrying state","\u002Fdocs\u002Fmigration\u002Fwithout-data-migration","1.docs\u002F7.migration\u002F2.without-data-migration","i-lucide-sparkles",{"title":269,"path":270,"stem":271,"icon":272},"Migration carrying state","\u002Fdocs\u002Fmigration\u002Fwith-data-migration","1.docs\u002F7.migration\u002F3.with-data-migration","i-lucide-database-backup",{"title":274,"path":275,"stem":276,"children":277,"icon":279},"Reference","\u002Fdocs\u002Freference","1.docs\u002F8.reference\u002F1.index",[278,280,285,290,295,300,305,309],{"title":274,"path":275,"stem":276,"icon":279},"i-lucide-list",{"title":281,"path":282,"stem":283,"icon":284},"Configuration reference","\u002Fdocs\u002Freference\u002Fconfiguration-reference","1.docs\u002F8.reference\u002F2.configuration-reference","i-lucide-table",{"title":286,"path":287,"stem":288,"icon":289},"REST API reference","\u002Fdocs\u002Freference\u002Frest-api-reference","1.docs\u002F8.reference\u002F3.rest-api-reference","i-lucide-network",{"title":291,"path":292,"stem":293,"icon":294},"Gradle plugin reference","\u002Fdocs\u002Freference\u002Fgradle-plugin-reference","1.docs\u002F8.reference\u002F4.gradle-plugin-reference","i-lucide-box",{"title":296,"path":297,"stem":298,"icon":299},"Maven reference","\u002Fdocs\u002Freference\u002Fmaven-reference","1.docs\u002F8.reference\u002F5.maven-reference","i-simple-icons-apachemaven",{"title":301,"path":302,"stem":303,"icon":304},"Kafka Streams compatibility matrix","\u002Fdocs\u002Freference\u002Fks-compatibility-matrix","1.docs\u002F8.reference\u002F6.ks-compatibility-matrix","i-lucide-table-2",{"title":306,"path":307,"stem":308,"icon":170},"Metrics reference","\u002Fdocs\u002Freference\u002Fmetrics-reference","1.docs\u002F8.reference\u002F7.metrics-reference",{"title":310,"path":311,"stem":312,"icon":313},"Glossary","\u002Fdocs\u002Freference\u002Fglossary","1.docs\u002F8.reference\u002F8.glossary","i-lucide-book-a",{"id":315,"title":140,"body":316,"description":5308,"extension":5309,"meta":5310,"navigation":5311,"pageType":5312,"path":141,"seo":5313,"stem":142,"__hash__":5314},"docs\u002F1.docs\u002F3.building\u002F8.scheduled-sources.md",{"type":317,"value":318,"toc":5292},"minimark",[319,327,391,396,409,425,436,1042,1069,1074,1094,1408,1412,1429,1867,1871,1878,1975,1997,2019,2023,2033,2037,2043,2102,2108,2653,2657,2678,3271,3298,3331,3335,3346,3805,3814,4280,4284,4293,4338,4368,5190,5194,5197,5242,5246,5288],[320,321,322,326],"p",{},[323,324,325],"code",{},"StreamsBuilder.scheduled()"," is a StoatFlow extension — it has no Kafka Streams equivalent. It creates a topology source that periodically generates records and feeds them downstream, without consuming from any Kafka topic. Use it for heartbeats, periodic state-store scans, external polling, or any time-driven event you want to flow through the same DAG as your Kafka-sourced records.",[328,329,330],"tldr-panel",{},[331,332,333,345,363,381],"ul",{},[334,335,336,340,341,344],"li",{},[337,338,339],"strong",{},"What it is:"," a source node that emits records on a schedule instead of reading a topic. Returns a ",[323,342,343],{},"KStream\u003CK, V>"," you process like any other.",[334,346,347,350,351,354,355,358,359,362],{},[337,348,349],{},"Two schedules:"," fixed interval (",[323,352,353],{},"STREAM_TIME"," or ",[323,356,357],{},"WALL_CLOCK_TIME",") or a cron expression (",[323,360,361],{},"CronExpression.unix\u002Fquartz\u002Fspring",", always wall-clock).",[334,364,365,368,369,372,373,376,377,380],{},[337,366,367],{},"The emitter:"," a ",[323,370,371],{},"ScheduledEmitter\u003CK, V>"," callback. Its context gives you ",[323,374,375],{},"forward(...)"," and ",[337,378,379],{},"read-only"," state-store access.",[334,382,383,386,387,390],{},[337,384,385],{},"StoatFlow-only:"," not part of the Kafka Streams DSL — see the ",[388,389,301],"a",{"href":302}," for the parity picture.",[392,393,395],"h2",{"id":394},"interval-based-sources","Interval-based sources",[320,397,398,399,402,403,408],{},"The interval overload fires every ",[323,400,401],{},"Duration"," according to a ",[388,404,405],{"href":68},[323,406,407],{},"TimeNotion",":",[331,410,411,418],{},[334,412,413,417],{},[337,414,415],{},[323,416,357],{}," — fires on the system clock, every interval, regardless of data flow. Use for heartbeats, metrics, or polling that must happen on real-world time.",[334,419,420,424],{},[337,421,422],{},[323,423,353],{}," — fires when the event-time watermark advances past the interval. Data-driven: with no records flowing, the watermark doesn't move and the source doesn't fire.",[320,426,427,428,431,432,435],{},"The interval must be positive (",[323,429,430],{},"scheduled()"," throws ",[323,433,434],{},"IllegalArgumentException"," otherwise).",[437,438,440,698],"code-tabs",{"group":439},"lang",[441,442,448],"pre",{"className":443,"code":444,"filename":445,"language":446,"meta":447,"style":447},"language-kotlin shiki shiki-themes vitesse-light","import io.stoatflow.core.processor.PunctuationType\nimport io.stoatflow.core.topology.Produced\nimport io.stoatflow.core.topology.StreamsBuilder\nimport org.apache.kafka.common.serialization.Serdes\nimport java.time.Duration\n\nval builder = StreamsBuilder()\n\n\u002F\u002F Emit a heartbeat every 30 seconds on wall-clock time\nbuilder\n    .scheduled\u003CString, String>(\n        interval = Duration.ofSeconds(30),\n        type = PunctuationType.WALL_CLOCK_TIME,\n        emitter = { context ->\n            context.forward(\"heartbeat\", \"alive-${context.currentWallClockTime()}\")\n        },\n    )\n    .to(\"heartbeats\", Produced.with(Serdes.String(), Serdes.String()))\n","Kotlin","kotlin","",[323,449,450,463,471,479,487,495,502,522,527,534,540,564,588,599,613,654,660,666],{"__ignoreMap":447},[451,452,455,459],"span",{"class":453,"line":454},"line",1,[451,456,458],{"class":457},"sbBg2","import",[451,460,462],{"class":461},"sySUi"," io.stoatflow.core.processor.PunctuationType\n",[451,464,466,468],{"class":453,"line":465},2,[451,467,458],{"class":457},[451,469,470],{"class":461}," io.stoatflow.core.topology.Produced\n",[451,472,474,476],{"class":453,"line":473},3,[451,475,458],{"class":457},[451,477,478],{"class":461}," io.stoatflow.core.topology.StreamsBuilder\n",[451,480,482,484],{"class":453,"line":481},4,[451,483,458],{"class":457},[451,485,486],{"class":461}," org.apache.kafka.common.serialization.Serdes\n",[451,488,490,492],{"class":453,"line":489},5,[451,491,458],{"class":457},[451,493,494],{"class":461}," java.time.Duration\n",[451,496,498],{"class":453,"line":497},6,[451,499,501],{"emptyLinePlaceholder":500},true,"\n",[451,503,505,508,512,516,519],{"class":453,"line":504},7,[451,506,507],{"class":457},"val",[451,509,511],{"class":510},"suHK_"," builder ",[451,513,515],{"class":514},"sYZai","=",[451,517,518],{"class":461}," StreamsBuilder",[451,520,521],{"class":510},"()\n",[451,523,525],{"class":453,"line":524},8,[451,526,501],{"emptyLinePlaceholder":500},[451,528,530],{"class":453,"line":529},9,[451,531,533],{"class":532},"s8zF2","\u002F\u002F Emit a heartbeat every 30 seconds on wall-clock time\n",[451,535,537],{"class":453,"line":536},10,[451,538,539],{"class":510},"builder\n",[451,541,543,546,549,552,556,559,561],{"class":453,"line":542},11,[451,544,545],{"class":510},"    .",[451,547,548],{"class":461},"scheduled",[451,550,551],{"class":510},"\u003C",[451,553,555],{"class":554},"sUxyF","String",[451,557,558],{"class":510},", ",[451,560,555],{"class":554},[451,562,563],{"class":510},">(\n",[451,565,567,570,572,575,578,581,585],{"class":453,"line":566},12,[451,568,569],{"class":510},"        interval ",[451,571,515],{"class":514},[451,573,574],{"class":510}," Duration.",[451,576,577],{"class":461},"ofSeconds",[451,579,580],{"class":510},"(",[451,582,584],{"class":583},"s-TwI","30",[451,586,587],{"class":510},"),\n",[451,589,591,594,596],{"class":453,"line":590},13,[451,592,593],{"class":510},"        type ",[451,595,515],{"class":514},[451,597,598],{"class":510}," PunctuationType.WALL_CLOCK_TIME,\n",[451,600,602,605,607,610],{"class":453,"line":601},14,[451,603,604],{"class":510},"        emitter ",[451,606,515],{"class":514},[451,608,609],{"class":510}," { context ",[451,611,612],{"class":514},"->\n",[451,614,616,619,622,624,628,630,633,636,639,642,645,648,651],{"class":453,"line":615},15,[451,617,618],{"class":510},"            context.",[451,620,621],{"class":461},"forward",[451,623,580],{"class":510},[451,625,627],{"class":626},"spphp","\"heartbeat\"",[451,629,558],{"class":510},[451,631,632],{"class":626},"\"alive-",[451,634,635],{"class":457},"${",[451,637,638],{"class":626},"context.",[451,640,641],{"class":461},"currentWallClockTime",[451,643,644],{"class":626},"()",[451,646,647],{"class":457},"}",[451,649,650],{"class":626},"\"",[451,652,653],{"class":510},")\n",[451,655,657],{"class":453,"line":656},16,[451,658,659],{"class":510},"        },\n",[451,661,663],{"class":453,"line":662},17,[451,664,665],{"class":510},"    )\n",[451,667,669,671,674,676,679,682,685,688,690,693,695],{"class":453,"line":668},18,[451,670,545],{"class":510},[451,672,673],{"class":461},"to",[451,675,580],{"class":510},[451,677,678],{"class":626},"\"heartbeats\"",[451,680,681],{"class":510},", Produced.",[451,683,684],{"class":461},"with",[451,686,687],{"class":510},"(Serdes.",[451,689,555],{"class":461},[451,691,692],{"class":510},"(), Serdes.",[451,694,555],{"class":461},[451,696,697],{"class":510},"()))\n",[441,699,704],{"className":700,"code":701,"filename":702,"language":703,"meta":447,"style":447},"language-java shiki shiki-themes vitesse-light","import io.stoatflow.core.processor.PunctuationType;\nimport io.stoatflow.core.topology.Produced;\nimport io.stoatflow.core.topology.StreamsBuilder;\nimport org.apache.kafka.common.serialization.Serdes;\n\nimport java.time.Duration;\n\nStreamsBuilder builder = new StreamsBuilder();\n\n\u002F\u002F Emit a heartbeat every 30 seconds on wall-clock time\nbuilder\n    .\u003CString, String>scheduled(\n        null,                                 \u002F\u002F named (optional)\n        Duration.ofSeconds(30),\n        PunctuationType.WALL_CLOCK_TIME,\n        null,                                 \u002F\u002F keySerde (optional)\n        context ->\n            context.forward(\"heartbeat\", \"alive-\" + context.currentWallClockTime()))\n    .to(\"heartbeats\", Produced.with(Serdes.String(), Serdes.String()));\n","Java","java",[323,705,706,737,763,788,822,826,844,848,867,871,875,879,902,912,927,939,948,955,996],{"__ignoreMap":447},[451,707,708,710,713,716,719,721,724,726,729,731,734],{"class":453,"line":454},[451,709,458],{"class":457},[451,711,712],{"class":510}," io",[451,714,715],{"class":514},".",[451,717,718],{"class":510},"stoatflow",[451,720,715],{"class":514},[451,722,723],{"class":510},"core",[451,725,715],{"class":514},[451,727,728],{"class":510},"processor",[451,730,715],{"class":514},[451,732,733],{"class":510},"PunctuationType",[451,735,736],{"class":514},";\n",[451,738,739,741,743,745,747,749,751,753,756,758,761],{"class":453,"line":465},[451,740,458],{"class":457},[451,742,712],{"class":510},[451,744,715],{"class":514},[451,746,718],{"class":510},[451,748,715],{"class":514},[451,750,723],{"class":510},[451,752,715],{"class":514},[451,754,755],{"class":510},"topology",[451,757,715],{"class":514},[451,759,760],{"class":510},"Produced",[451,762,736],{"class":514},[451,764,765,767,769,771,773,775,777,779,781,783,786],{"class":453,"line":473},[451,766,458],{"class":457},[451,768,712],{"class":510},[451,770,715],{"class":514},[451,772,718],{"class":510},[451,774,715],{"class":514},[451,776,723],{"class":510},[451,778,715],{"class":514},[451,780,755],{"class":510},[451,782,715],{"class":514},[451,784,785],{"class":510},"StreamsBuilder",[451,787,736],{"class":514},[451,789,790,792,795,797,800,802,805,807,810,812,815,817,820],{"class":453,"line":481},[451,791,458],{"class":457},[451,793,794],{"class":510}," org",[451,796,715],{"class":514},[451,798,799],{"class":510},"apache",[451,801,715],{"class":514},[451,803,804],{"class":510},"kafka",[451,806,715],{"class":514},[451,808,809],{"class":510},"common",[451,811,715],{"class":514},[451,813,814],{"class":510},"serialization",[451,816,715],{"class":514},[451,818,819],{"class":510},"Serdes",[451,821,736],{"class":514},[451,823,824],{"class":453,"line":489},[451,825,501],{"emptyLinePlaceholder":500},[451,827,828,830,833,835,838,840,842],{"class":453,"line":497},[451,829,458],{"class":457},[451,831,832],{"class":510}," java",[451,834,715],{"class":514},[451,836,837],{"class":510},"time",[451,839,715],{"class":514},[451,841,401],{"class":510},[451,843,736],{"class":514},[451,845,846],{"class":453,"line":504},[451,847,501],{"emptyLinePlaceholder":500},[451,849,850,852,856,859,862,864],{"class":453,"line":524},[451,851,785],{"class":510},[451,853,855],{"class":854},"svycV"," builder",[451,857,858],{"class":514}," =",[451,860,861],{"class":457}," new",[451,863,518],{"class":461},[451,865,866],{"class":514},"();\n",[451,868,869],{"class":453,"line":529},[451,870,501],{"emptyLinePlaceholder":500},[451,872,873],{"class":453,"line":536},[451,874,533],{"class":532},[451,876,877],{"class":453,"line":542},[451,878,539],{"class":510},[451,880,881,883,886,888,891,894,897,899],{"class":453,"line":566},[451,882,545],{"class":514},[451,884,551],{"class":885},"si04Y",[451,887,555],{"class":510},[451,889,890],{"class":514},",",[451,892,893],{"class":510}," String",[451,895,896],{"class":885},">",[451,898,548],{"class":461},[451,900,901],{"class":514},"(\n",[451,903,904,907,909],{"class":453,"line":590},[451,905,906],{"class":457},"        null",[451,908,890],{"class":514},[451,910,911],{"class":532},"                                 \u002F\u002F named (optional)\n",[451,913,914,917,919,921,923,925],{"class":453,"line":601},[451,915,916],{"class":854},"        Duration",[451,918,715],{"class":514},[451,920,577],{"class":461},[451,922,580],{"class":514},[451,924,584],{"class":583},[451,926,587],{"class":514},[451,928,929,932,934,936],{"class":453,"line":615},[451,930,931],{"class":854},"        PunctuationType",[451,933,715],{"class":514},[451,935,357],{"class":854},[451,937,938],{"class":514},",\n",[451,940,941,943,945],{"class":453,"line":656},[451,942,906],{"class":457},[451,944,890],{"class":514},[451,946,947],{"class":532},"                                 \u002F\u002F keySerde (optional)\n",[451,949,950,953],{"class":453,"line":662},[451,951,952],{"class":510},"        context ",[451,954,612],{"class":514},[451,956,957,960,962,964,966,969,972,974,976,979,982,984,987,990,992,994],{"class":453,"line":668},[451,958,959],{"class":854},"            context",[451,961,715],{"class":514},[451,963,621],{"class":461},[451,965,580],{"class":514},[451,967,650],{"class":968},"sSP4y",[451,970,971],{"class":626},"heartbeat",[451,973,650],{"class":968},[451,975,890],{"class":514},[451,977,978],{"class":968}," \"",[451,980,981],{"class":626},"alive-",[451,983,650],{"class":968},[451,985,986],{"class":885}," +",[451,988,989],{"class":854}," context",[451,991,715],{"class":514},[451,993,641],{"class":461},[451,995,697],{"class":514},[451,997,999,1001,1003,1005,1007,1010,1012,1014,1017,1019,1021,1023,1025,1027,1029,1032,1035,1037,1039],{"class":453,"line":998},19,[451,1000,545],{"class":514},[451,1002,673],{"class":461},[451,1004,580],{"class":514},[451,1006,650],{"class":968},[451,1008,1009],{"class":626},"heartbeats",[451,1011,650],{"class":968},[451,1013,890],{"class":514},[451,1015,1016],{"class":854}," Produced",[451,1018,715],{"class":514},[451,1020,684],{"class":461},[451,1022,580],{"class":514},[451,1024,819],{"class":854},[451,1026,715],{"class":514},[451,1028,555],{"class":461},[451,1030,1031],{"class":514},"(),",[451,1033,1034],{"class":854}," Serdes",[451,1036,715],{"class":514},[451,1038,555],{"class":461},[451,1040,1041],{"class":514},"()));\n",[1043,1044,1047],"callout",{"color":1045,"icon":1046},"info","i-lucide-info",[320,1048,1049,1050,1053,1054,1057,1058,376,1061,1064,1065,1068],{},"For Java, the emitter is delivered as a ",[323,1051,1052],{},"java.util.function.Consumer\u003CScheduledEmitterContext\u003CK, V>>",", so a plain lambda works. The Kotlin lambda overload is hidden from Java (",[323,1055,1056],{},"@JvmSynthetic",") to avoid ambiguity. The ",[323,1059,1060],{},"named",[323,1062,1063],{},"keySerde"," parameters have Kotlin defaults; from Java, pass ",[323,1066,1067],{},"null"," to skip them.",[1070,1071,1073],"h3",{"id":1072},"naming-the-source","Naming the source",[320,1075,1076,1077,1082,1083,558,1086,1089,1090,715],{},"Pass a ",[388,1078,1079],{"href":111},[323,1080,1081],{},"Named"," to give the source a stable name in the topology graph and metrics. Without it, sources are auto-named ",[323,1084,1085],{},"scheduled-source-0",[323,1087,1088],{},"scheduled-source-1",", … in declaration order — which is the name you'll reference when ",[388,1091,1093],{"href":1092},"#testing-scheduled-sources","testing",[437,1095,1096,1220],{"group":439},[441,1097,1099],{"className":443,"code":1098,"filename":445,"language":446,"meta":447,"style":447},"import io.stoatflow.core.processor.PunctuationType\nimport io.stoatflow.core.topology.Named\nimport java.time.Duration\n\nbuilder.scheduled\u003CString, String>(\n    named = Named.`as`(\"heartbeat-source\"),\n    interval = Duration.ofSeconds(30),\n    type = PunctuationType.WALL_CLOCK_TIME,\n    emitter = { context -> context.forward(\"heartbeat\", \"alive\") },\n)\n",[323,1100,1101,1107,1114,1120,1124,1141,1161,1178,1187,1216],{"__ignoreMap":447},[451,1102,1103,1105],{"class":453,"line":454},[451,1104,458],{"class":457},[451,1106,462],{"class":461},[451,1108,1109,1111],{"class":453,"line":465},[451,1110,458],{"class":457},[451,1112,1113],{"class":461}," io.stoatflow.core.topology.Named\n",[451,1115,1116,1118],{"class":453,"line":473},[451,1117,458],{"class":457},[451,1119,494],{"class":461},[451,1121,1122],{"class":453,"line":481},[451,1123,501],{"emptyLinePlaceholder":500},[451,1125,1126,1129,1131,1133,1135,1137,1139],{"class":453,"line":489},[451,1127,1128],{"class":510},"builder.",[451,1130,548],{"class":461},[451,1132,551],{"class":510},[451,1134,555],{"class":554},[451,1136,558],{"class":510},[451,1138,555],{"class":554},[451,1140,563],{"class":510},[451,1142,1143,1146,1148,1151,1154,1156,1159],{"class":453,"line":497},[451,1144,1145],{"class":510},"    named ",[451,1147,515],{"class":514},[451,1149,1150],{"class":510}," Named.",[451,1152,1153],{"class":461},"`as`",[451,1155,580],{"class":510},[451,1157,1158],{"class":626},"\"heartbeat-source\"",[451,1160,587],{"class":510},[451,1162,1163,1166,1168,1170,1172,1174,1176],{"class":453,"line":504},[451,1164,1165],{"class":510},"    interval ",[451,1167,515],{"class":514},[451,1169,574],{"class":510},[451,1171,577],{"class":461},[451,1173,580],{"class":510},[451,1175,584],{"class":583},[451,1177,587],{"class":510},[451,1179,1180,1183,1185],{"class":453,"line":524},[451,1181,1182],{"class":510},"    type ",[451,1184,515],{"class":514},[451,1186,598],{"class":510},[451,1188,1189,1192,1194,1196,1199,1202,1204,1206,1208,1210,1213],{"class":453,"line":529},[451,1190,1191],{"class":510},"    emitter ",[451,1193,515],{"class":514},[451,1195,609],{"class":510},[451,1197,1198],{"class":514},"->",[451,1200,1201],{"class":510}," context.",[451,1203,621],{"class":461},[451,1205,580],{"class":510},[451,1207,627],{"class":626},[451,1209,558],{"class":510},[451,1211,1212],{"class":626},"\"alive\"",[451,1214,1215],{"class":510},") },\n",[451,1217,1218],{"class":453,"line":536},[451,1219,653],{"class":510},[441,1221,1223],{"className":700,"code":1222,"filename":702,"language":703,"meta":447,"style":447},"import io.stoatflow.core.processor.PunctuationType;\nimport io.stoatflow.core.topology.Named;\n\nimport java.time.Duration;\n\nbuilder.\u003CString, String>scheduled(\n    Named.as(\"heartbeat-source\"),\n    Duration.ofSeconds(30),\n    PunctuationType.WALL_CLOCK_TIME,\n    null,                                     \u002F\u002F keySerde (optional)\n    context -> context.forward(\"heartbeat\", \"alive\"));\n",[323,1224,1225,1249,1273,1277,1293,1297,1318,1339,1354,1365,1375],{"__ignoreMap":447},[451,1226,1227,1229,1231,1233,1235,1237,1239,1241,1243,1245,1247],{"class":453,"line":454},[451,1228,458],{"class":457},[451,1230,712],{"class":510},[451,1232,715],{"class":514},[451,1234,718],{"class":510},[451,1236,715],{"class":514},[451,1238,723],{"class":510},[451,1240,715],{"class":514},[451,1242,728],{"class":510},[451,1244,715],{"class":514},[451,1246,733],{"class":510},[451,1248,736],{"class":514},[451,1250,1251,1253,1255,1257,1259,1261,1263,1265,1267,1269,1271],{"class":453,"line":465},[451,1252,458],{"class":457},[451,1254,712],{"class":510},[451,1256,715],{"class":514},[451,1258,718],{"class":510},[451,1260,715],{"class":514},[451,1262,723],{"class":510},[451,1264,715],{"class":514},[451,1266,755],{"class":510},[451,1268,715],{"class":514},[451,1270,1081],{"class":510},[451,1272,736],{"class":514},[451,1274,1275],{"class":453,"line":473},[451,1276,501],{"emptyLinePlaceholder":500},[451,1278,1279,1281,1283,1285,1287,1289,1291],{"class":453,"line":481},[451,1280,458],{"class":457},[451,1282,832],{"class":510},[451,1284,715],{"class":514},[451,1286,837],{"class":510},[451,1288,715],{"class":514},[451,1290,401],{"class":510},[451,1292,736],{"class":514},[451,1294,1295],{"class":453,"line":489},[451,1296,501],{"emptyLinePlaceholder":500},[451,1298,1299,1302,1304,1306,1308,1310,1312,1314,1316],{"class":453,"line":497},[451,1300,1301],{"class":510},"builder",[451,1303,715],{"class":514},[451,1305,551],{"class":885},[451,1307,555],{"class":510},[451,1309,890],{"class":514},[451,1311,893],{"class":510},[451,1313,896],{"class":885},[451,1315,548],{"class":461},[451,1317,901],{"class":514},[451,1319,1320,1323,1325,1328,1330,1332,1335,1337],{"class":453,"line":504},[451,1321,1322],{"class":854},"    Named",[451,1324,715],{"class":514},[451,1326,1327],{"class":461},"as",[451,1329,580],{"class":514},[451,1331,650],{"class":968},[451,1333,1334],{"class":626},"heartbeat-source",[451,1336,650],{"class":968},[451,1338,587],{"class":514},[451,1340,1341,1344,1346,1348,1350,1352],{"class":453,"line":524},[451,1342,1343],{"class":854},"    Duration",[451,1345,715],{"class":514},[451,1347,577],{"class":461},[451,1349,580],{"class":514},[451,1351,584],{"class":583},[451,1353,587],{"class":514},[451,1355,1356,1359,1361,1363],{"class":453,"line":529},[451,1357,1358],{"class":854},"    PunctuationType",[451,1360,715],{"class":514},[451,1362,357],{"class":854},[451,1364,938],{"class":514},[451,1366,1367,1370,1372],{"class":453,"line":536},[451,1368,1369],{"class":457},"    null",[451,1371,890],{"class":514},[451,1373,1374],{"class":532},"                                     \u002F\u002F keySerde (optional)\n",[451,1376,1377,1380,1382,1384,1386,1388,1390,1392,1394,1396,1398,1400,1403,1405],{"class":453,"line":542},[451,1378,1379],{"class":510},"    context ",[451,1381,1198],{"class":514},[451,1383,989],{"class":854},[451,1385,715],{"class":514},[451,1387,621],{"class":461},[451,1389,580],{"class":514},[451,1391,650],{"class":968},[451,1393,971],{"class":626},[451,1395,650],{"class":968},[451,1397,890],{"class":514},[451,1399,978],{"class":968},[451,1401,1402],{"class":626},"alive",[451,1404,650],{"class":968},[451,1406,1407],{"class":514},"));\n",[392,1409,1411],{"id":1410},"cron-based-sources","Cron-based sources",[320,1413,1414,1415,1421,1422,1425,1426,1428],{},"The cron overload fires according to a ",[388,1416,1418],{"href":1417},"#cron-expressions",[323,1419,1420],{},"CronExpression",". Cron scheduling ",[337,1423,1424],{},"always uses wall-clock time"," — there is no ",[323,1427,407],{}," parameter, and cron sources do not fire on watermark advance.",[437,1430,1431,1601],{"group":439},[441,1432,1434],{"className":443,"code":1433,"filename":445,"language":446,"meta":447,"style":447},"import io.stoatflow.core.processor.CronExpression\nimport io.stoatflow.core.topology.Named\nimport io.stoatflow.core.topology.Produced\nimport org.apache.kafka.common.serialization.Serdes\n\n\u002F\u002F Fire every day at midnight (Unix 5-field cron)\nbuilder\n    .scheduled\u003CString, String>(\n        named = Named.`as`(\"daily-report-source\"),\n        cron = CronExpression.unix(\"0 0 * * *\"),\n        emitter = { context ->\n            context.forward(\"report\", \"daily-${context.currentWallClockTime()}\")\n        },\n    )\n    .to(\"daily-reports\", Produced.with(Serdes.String(), Serdes.String()))\n",[323,1435,1436,1443,1449,1455,1461,1465,1470,1474,1490,1508,1528,1538,1568,1572,1576],{"__ignoreMap":447},[451,1437,1438,1440],{"class":453,"line":454},[451,1439,458],{"class":457},[451,1441,1442],{"class":461}," io.stoatflow.core.processor.CronExpression\n",[451,1444,1445,1447],{"class":453,"line":465},[451,1446,458],{"class":457},[451,1448,1113],{"class":461},[451,1450,1451,1453],{"class":453,"line":473},[451,1452,458],{"class":457},[451,1454,470],{"class":461},[451,1456,1457,1459],{"class":453,"line":481},[451,1458,458],{"class":457},[451,1460,486],{"class":461},[451,1462,1463],{"class":453,"line":489},[451,1464,501],{"emptyLinePlaceholder":500},[451,1466,1467],{"class":453,"line":497},[451,1468,1469],{"class":532},"\u002F\u002F Fire every day at midnight (Unix 5-field cron)\n",[451,1471,1472],{"class":453,"line":504},[451,1473,539],{"class":510},[451,1475,1476,1478,1480,1482,1484,1486,1488],{"class":453,"line":524},[451,1477,545],{"class":510},[451,1479,548],{"class":461},[451,1481,551],{"class":510},[451,1483,555],{"class":554},[451,1485,558],{"class":510},[451,1487,555],{"class":554},[451,1489,563],{"class":510},[451,1491,1492,1495,1497,1499,1501,1503,1506],{"class":453,"line":529},[451,1493,1494],{"class":510},"        named ",[451,1496,515],{"class":514},[451,1498,1150],{"class":510},[451,1500,1153],{"class":461},[451,1502,580],{"class":510},[451,1504,1505],{"class":626},"\"daily-report-source\"",[451,1507,587],{"class":510},[451,1509,1510,1513,1515,1518,1521,1523,1526],{"class":453,"line":536},[451,1511,1512],{"class":510},"        cron ",[451,1514,515],{"class":514},[451,1516,1517],{"class":510}," CronExpression.",[451,1519,1520],{"class":461},"unix",[451,1522,580],{"class":510},[451,1524,1525],{"class":626},"\"0 0 * * *\"",[451,1527,587],{"class":510},[451,1529,1530,1532,1534,1536],{"class":453,"line":542},[451,1531,604],{"class":510},[451,1533,515],{"class":514},[451,1535,609],{"class":510},[451,1537,612],{"class":514},[451,1539,1540,1542,1544,1546,1549,1551,1554,1556,1558,1560,1562,1564,1566],{"class":453,"line":566},[451,1541,618],{"class":510},[451,1543,621],{"class":461},[451,1545,580],{"class":510},[451,1547,1548],{"class":626},"\"report\"",[451,1550,558],{"class":510},[451,1552,1553],{"class":626},"\"daily-",[451,1555,635],{"class":457},[451,1557,638],{"class":626},[451,1559,641],{"class":461},[451,1561,644],{"class":626},[451,1563,647],{"class":457},[451,1565,650],{"class":626},[451,1567,653],{"class":510},[451,1569,1570],{"class":453,"line":590},[451,1571,659],{"class":510},[451,1573,1574],{"class":453,"line":601},[451,1575,665],{"class":510},[451,1577,1578,1580,1582,1584,1587,1589,1591,1593,1595,1597,1599],{"class":453,"line":615},[451,1579,545],{"class":510},[451,1581,673],{"class":461},[451,1583,580],{"class":510},[451,1585,1586],{"class":626},"\"daily-reports\"",[451,1588,681],{"class":510},[451,1590,684],{"class":461},[451,1592,687],{"class":510},[451,1594,555],{"class":461},[451,1596,692],{"class":510},[451,1598,555],{"class":461},[451,1600,697],{"class":510},[441,1602,1604],{"className":700,"code":1603,"filename":702,"language":703,"meta":447,"style":447},"import io.stoatflow.core.processor.CronExpression;\nimport io.stoatflow.core.topology.Named;\nimport io.stoatflow.core.topology.Produced;\nimport org.apache.kafka.common.serialization.Serdes;\n\n\u002F\u002F Fire every day at midnight (Unix 5-field cron)\nbuilder\n    .\u003CString, String>scheduled(\n        Named.as(\"daily-report-source\"),\n        CronExpression.unix(\"0 0 * * *\"),\n        null,                                 \u002F\u002F keySerde (optional)\n        context ->\n            context.forward(\"report\", \"daily-\" + context.currentWallClockTime()))\n    .to(\"daily-reports\", Produced.with(Serdes.String(), Serdes.String()));\n",[323,1605,1606,1630,1654,1678,1706,1710,1714,1718,1736,1756,1776,1784,1790,1826],{"__ignoreMap":447},[451,1607,1608,1610,1612,1614,1616,1618,1620,1622,1624,1626,1628],{"class":453,"line":454},[451,1609,458],{"class":457},[451,1611,712],{"class":510},[451,1613,715],{"class":514},[451,1615,718],{"class":510},[451,1617,715],{"class":514},[451,1619,723],{"class":510},[451,1621,715],{"class":514},[451,1623,728],{"class":510},[451,1625,715],{"class":514},[451,1627,1420],{"class":510},[451,1629,736],{"class":514},[451,1631,1632,1634,1636,1638,1640,1642,1644,1646,1648,1650,1652],{"class":453,"line":465},[451,1633,458],{"class":457},[451,1635,712],{"class":510},[451,1637,715],{"class":514},[451,1639,718],{"class":510},[451,1641,715],{"class":514},[451,1643,723],{"class":510},[451,1645,715],{"class":514},[451,1647,755],{"class":510},[451,1649,715],{"class":514},[451,1651,1081],{"class":510},[451,1653,736],{"class":514},[451,1655,1656,1658,1660,1662,1664,1666,1668,1670,1672,1674,1676],{"class":453,"line":473},[451,1657,458],{"class":457},[451,1659,712],{"class":510},[451,1661,715],{"class":514},[451,1663,718],{"class":510},[451,1665,715],{"class":514},[451,1667,723],{"class":510},[451,1669,715],{"class":514},[451,1671,755],{"class":510},[451,1673,715],{"class":514},[451,1675,760],{"class":510},[451,1677,736],{"class":514},[451,1679,1680,1682,1684,1686,1688,1690,1692,1694,1696,1698,1700,1702,1704],{"class":453,"line":481},[451,1681,458],{"class":457},[451,1683,794],{"class":510},[451,1685,715],{"class":514},[451,1687,799],{"class":510},[451,1689,715],{"class":514},[451,1691,804],{"class":510},[451,1693,715],{"class":514},[451,1695,809],{"class":510},[451,1697,715],{"class":514},[451,1699,814],{"class":510},[451,1701,715],{"class":514},[451,1703,819],{"class":510},[451,1705,736],{"class":514},[451,1707,1708],{"class":453,"line":489},[451,1709,501],{"emptyLinePlaceholder":500},[451,1711,1712],{"class":453,"line":497},[451,1713,1469],{"class":532},[451,1715,1716],{"class":453,"line":504},[451,1717,539],{"class":510},[451,1719,1720,1722,1724,1726,1728,1730,1732,1734],{"class":453,"line":524},[451,1721,545],{"class":514},[451,1723,551],{"class":885},[451,1725,555],{"class":510},[451,1727,890],{"class":514},[451,1729,893],{"class":510},[451,1731,896],{"class":885},[451,1733,548],{"class":461},[451,1735,901],{"class":514},[451,1737,1738,1741,1743,1745,1747,1749,1752,1754],{"class":453,"line":529},[451,1739,1740],{"class":854},"        Named",[451,1742,715],{"class":514},[451,1744,1327],{"class":461},[451,1746,580],{"class":514},[451,1748,650],{"class":968},[451,1750,1751],{"class":626},"daily-report-source",[451,1753,650],{"class":968},[451,1755,587],{"class":514},[451,1757,1758,1761,1763,1765,1767,1769,1772,1774],{"class":453,"line":536},[451,1759,1760],{"class":854},"        CronExpression",[451,1762,715],{"class":514},[451,1764,1520],{"class":461},[451,1766,580],{"class":514},[451,1768,650],{"class":968},[451,1770,1771],{"class":626},"0 0 * * *",[451,1773,650],{"class":968},[451,1775,587],{"class":514},[451,1777,1778,1780,1782],{"class":453,"line":542},[451,1779,906],{"class":457},[451,1781,890],{"class":514},[451,1783,947],{"class":532},[451,1785,1786,1788],{"class":453,"line":566},[451,1787,952],{"class":510},[451,1789,612],{"class":514},[451,1791,1792,1794,1796,1798,1800,1802,1805,1807,1809,1811,1814,1816,1818,1820,1822,1824],{"class":453,"line":590},[451,1793,959],{"class":854},[451,1795,715],{"class":514},[451,1797,621],{"class":461},[451,1799,580],{"class":514},[451,1801,650],{"class":968},[451,1803,1804],{"class":626},"report",[451,1806,650],{"class":968},[451,1808,890],{"class":514},[451,1810,978],{"class":968},[451,1812,1813],{"class":626},"daily-",[451,1815,650],{"class":968},[451,1817,986],{"class":885},[451,1819,989],{"class":854},[451,1821,715],{"class":514},[451,1823,641],{"class":461},[451,1825,697],{"class":514},[451,1827,1828,1830,1832,1834,1836,1839,1841,1843,1845,1847,1849,1851,1853,1855,1857,1859,1861,1863,1865],{"class":453,"line":601},[451,1829,545],{"class":514},[451,1831,673],{"class":461},[451,1833,580],{"class":514},[451,1835,650],{"class":968},[451,1837,1838],{"class":626},"daily-reports",[451,1840,650],{"class":968},[451,1842,890],{"class":514},[451,1844,1016],{"class":854},[451,1846,715],{"class":514},[451,1848,684],{"class":461},[451,1850,580],{"class":514},[451,1852,819],{"class":854},[451,1854,715],{"class":514},[451,1856,555],{"class":461},[451,1858,1031],{"class":514},[451,1860,1034],{"class":854},[451,1862,715],{"class":514},[451,1864,555],{"class":461},[451,1866,1041],{"class":514},[1070,1868,1870],{"id":1869},"cron-expressions","Cron expressions",[320,1872,1873,1875,1876,715],{},[323,1874,1420],{}," wraps three cron dialects. Pick the factory that matches the dialect of your expression — the field counts differ, so an expression valid in one dialect is usually invalid in another. An unparseable expression throws ",[323,1877,434],{},[1879,1880,1881,1903],"table",{},[1882,1883,1884],"thead",{},[1885,1886,1887,1891,1894,1897,1900],"tr",{},[1888,1889,1890],"th",{},"Factory",[1888,1892,1893],{},"Fields",[1888,1895,1896],{},"Format",[1888,1898,1899],{},"Example",[1888,1901,1902],{},"Meaning",[1904,1905,1906,1930,1953],"tbody",{},[1885,1907,1908,1914,1917,1922,1927],{},[1909,1910,1911],"td",{},[323,1912,1913],{},"CronExpression.unix(...)",[1909,1915,1916],{},"5",[1909,1918,1919],{},[323,1920,1921],{},"min hour day-of-month month day-of-week",[1909,1923,1924],{},[323,1925,1926],{},"\"0 * * * *\"",[1909,1928,1929],{},"top of every hour",[1885,1931,1932,1937,1940,1945,1950],{},[1909,1933,1934],{},[323,1935,1936],{},"CronExpression.quartz(...)",[1909,1938,1939],{},"6–7",[1909,1941,1942],{},[323,1943,1944],{},"sec min hour day-of-month month day-of-week [year]",[1909,1946,1947],{},[323,1948,1949],{},"\"0 0 0 * * ?\"",[1909,1951,1952],{},"every day at midnight",[1885,1954,1955,1960,1963,1968,1973],{},[1909,1956,1957],{},[323,1958,1959],{},"CronExpression.spring(...)",[1909,1961,1962],{},"6",[1909,1964,1965],{},[323,1966,1967],{},"sec min hour day-of-month month day-of-week",[1909,1969,1970],{},[323,1971,1972],{},"\"0 0 0 * * *\"",[1909,1974,1952],{},[320,1976,1977,1978,1981,1982,1985,1986,1989,1990,1985,1993,1996],{},"All three factories are ",[323,1979,1980],{},"@JvmStatic",", so they're called identically from Kotlin and Java. Day-of-week numbering differs between dialects (Unix ",[323,1983,1984],{},"0–6"," with ",[323,1987,1988],{},"0 = Sunday","; Quartz ",[323,1991,1992],{},"1–7",[323,1994,1995],{},"1 = Sunday","), so consult the dialect when porting expressions.",[1043,1998,1999],{"color":1045,"icon":70},[320,2000,2001,2003,2004,2007,2008,558,2011,2014,2015,2018],{},[323,2002,1420],{}," resolves the next fire time in the ",[337,2005,2006],{},"system default time zone"," by default. The next-execution helpers (",[323,2009,2010],{},"nextExecutionTime",[323,2012,2013],{},"timeUntilNextExecution",") accept an explicit ",[323,2016,2017],{},"ZoneId"," if you need a fixed zone.",[392,2020,2022],{"id":2021},"the-emitter-and-its-context","The emitter and its context",[320,2024,2025,2026,2028,2029,2032],{},"The emitter is a ",[323,2027,371],{}," — a single-method functional interface. Each invocation receives a ",[323,2030,2031],{},"ScheduledEmitterContext\u003CK, V>"," for emitting records and reading state.",[1070,2034,2036],{"id":2035},"forwarding-records","Forwarding records",[320,2038,2039,2040,2042],{},"The context offers three ",[323,2041,621],{}," overloads:",[1879,2044,2045,2058],{},[1882,2046,2047],{},[1885,2048,2049,2052,2055],{},[1888,2050,2051],{},"Method",[1888,2053,2054],{},"Timestamp",[1888,2056,2057],{},"Headers",[1904,2059,2060,2073,2085],{},[1885,2061,2062,2067,2070],{},[1909,2063,2064],{},[323,2065,2066],{},"forward(key, value)",[1909,2068,2069],{},"current wall-clock time",[1909,2071,2072],{},"none",[1885,2074,2075,2080,2083],{},[1909,2076,2077],{},[323,2078,2079],{},"forward(key, value, timestamp)",[1909,2081,2082],{},"explicit",[1909,2084,2072],{},[1885,2086,2087,2092,2098],{},[1909,2088,2089],{},[323,2090,2091],{},"forward(record: Record\u003CK, V>)",[1909,2093,2094,2095],{},"from the ",[323,2096,2097],{},"Record",[1909,2099,2094,2100],{},[323,2101,2097],{},[320,2103,2104,2105,715],{},"A single emitter invocation may forward zero, one, or many records. The key drives downstream routing, exactly as for Kafka-sourced records, so per-key ordering downstream behaves the same way — see ",[388,2106,2107],{"href":58},"Lanes & parallelism",[437,2109,2110,2329],{"group":439},[441,2111,2113],{"className":443,"code":2112,"filename":445,"language":446,"meta":447,"style":447},"import io.stoatflow.core.processor.Record\nimport org.apache.kafka.common.header.internals.RecordHeaders\n\nbuilder.scheduled\u003CString, String>(\n    interval = Duration.ofSeconds(10),\n    type = PunctuationType.WALL_CLOCK_TIME,\n    emitter = { context ->\n        \u002F\u002F simplest: key + value, timestamped now\n        context.forward(\"k1\", \"v1\")\n\n        \u002F\u002F explicit event-time timestamp\n        context.forward(\"k2\", \"v2\", context.currentWallClockTime())\n\n        \u002F\u002F full control via Record (key, value, timestamp, headers)\n        val headers = RecordHeaders().apply { add(\"source\", \"scheduled\".toByteArray()) }\n        context.forward(Record(\"k3\", \"v3\", context.currentWallClockTime(), headers))\n    },\n)\n",[323,2114,2115,2122,2129,2133,2149,2166,2174,2184,2189,2208,2212,2217,2241,2245,2250,2293,2320,2325],{"__ignoreMap":447},[451,2116,2117,2119],{"class":453,"line":454},[451,2118,458],{"class":457},[451,2120,2121],{"class":461}," io.stoatflow.core.processor.Record\n",[451,2123,2124,2126],{"class":453,"line":465},[451,2125,458],{"class":457},[451,2127,2128],{"class":461}," org.apache.kafka.common.header.internals.RecordHeaders\n",[451,2130,2131],{"class":453,"line":473},[451,2132,501],{"emptyLinePlaceholder":500},[451,2134,2135,2137,2139,2141,2143,2145,2147],{"class":453,"line":481},[451,2136,1128],{"class":510},[451,2138,548],{"class":461},[451,2140,551],{"class":510},[451,2142,555],{"class":554},[451,2144,558],{"class":510},[451,2146,555],{"class":554},[451,2148,563],{"class":510},[451,2150,2151,2153,2155,2157,2159,2161,2164],{"class":453,"line":489},[451,2152,1165],{"class":510},[451,2154,515],{"class":514},[451,2156,574],{"class":510},[451,2158,577],{"class":461},[451,2160,580],{"class":510},[451,2162,2163],{"class":583},"10",[451,2165,587],{"class":510},[451,2167,2168,2170,2172],{"class":453,"line":497},[451,2169,1182],{"class":510},[451,2171,515],{"class":514},[451,2173,598],{"class":510},[451,2175,2176,2178,2180,2182],{"class":453,"line":504},[451,2177,1191],{"class":510},[451,2179,515],{"class":514},[451,2181,609],{"class":510},[451,2183,612],{"class":514},[451,2185,2186],{"class":453,"line":524},[451,2187,2188],{"class":532},"        \u002F\u002F simplest: key + value, timestamped now\n",[451,2190,2191,2194,2196,2198,2201,2203,2206],{"class":453,"line":529},[451,2192,2193],{"class":510},"        context.",[451,2195,621],{"class":461},[451,2197,580],{"class":510},[451,2199,2200],{"class":626},"\"k1\"",[451,2202,558],{"class":510},[451,2204,2205],{"class":626},"\"v1\"",[451,2207,653],{"class":510},[451,2209,2210],{"class":453,"line":536},[451,2211,501],{"emptyLinePlaceholder":500},[451,2213,2214],{"class":453,"line":542},[451,2215,2216],{"class":532},"        \u002F\u002F explicit event-time timestamp\n",[451,2218,2219,2221,2223,2225,2228,2230,2233,2236,2238],{"class":453,"line":566},[451,2220,2193],{"class":510},[451,2222,621],{"class":461},[451,2224,580],{"class":510},[451,2226,2227],{"class":626},"\"k2\"",[451,2229,558],{"class":510},[451,2231,2232],{"class":626},"\"v2\"",[451,2234,2235],{"class":510},", context.",[451,2237,641],{"class":461},[451,2239,2240],{"class":510},"())\n",[451,2242,2243],{"class":453,"line":590},[451,2244,501],{"emptyLinePlaceholder":500},[451,2246,2247],{"class":453,"line":601},[451,2248,2249],{"class":532},"        \u002F\u002F full control via Record (key, value, timestamp, headers)\n",[451,2251,2252,2255,2258,2260,2263,2266,2269,2272,2275,2277,2280,2282,2285,2287,2290],{"class":453,"line":615},[451,2253,2254],{"class":457},"        val",[451,2256,2257],{"class":510}," headers ",[451,2259,515],{"class":514},[451,2261,2262],{"class":461}," RecordHeaders",[451,2264,2265],{"class":510},"().",[451,2267,2268],{"class":461},"apply",[451,2270,2271],{"class":510}," { ",[451,2273,2274],{"class":461},"add",[451,2276,580],{"class":510},[451,2278,2279],{"class":626},"\"source\"",[451,2281,558],{"class":510},[451,2283,2284],{"class":626},"\"scheduled\"",[451,2286,715],{"class":510},[451,2288,2289],{"class":461},"toByteArray",[451,2291,2292],{"class":510},"()) }\n",[451,2294,2295,2297,2299,2301,2303,2305,2308,2310,2313,2315,2317],{"class":453,"line":656},[451,2296,2193],{"class":510},[451,2298,621],{"class":461},[451,2300,580],{"class":510},[451,2302,2097],{"class":461},[451,2304,580],{"class":510},[451,2306,2307],{"class":626},"\"k3\"",[451,2309,558],{"class":510},[451,2311,2312],{"class":626},"\"v3\"",[451,2314,2235],{"class":510},[451,2316,641],{"class":461},[451,2318,2319],{"class":510},"(), headers))\n",[451,2321,2322],{"class":453,"line":662},[451,2323,2324],{"class":510},"    },\n",[451,2326,2327],{"class":453,"line":668},[451,2328,653],{"class":510},[441,2330,2332],{"className":700,"code":2331,"filename":702,"language":703,"meta":447,"style":447},"import io.stoatflow.core.processor.Record;\nimport org.apache.kafka.common.header.internals.RecordHeaders;\n\nbuilder.\u003CString, String>scheduled(\n    null,\n    Duration.ofSeconds(10),\n    PunctuationType.WALL_CLOCK_TIME,\n    null,\n    context -> {\n        \u002F\u002F simplest: key + value, timestamped now\n        context.forward(\"k1\", \"v1\");\n\n        \u002F\u002F explicit event-time timestamp\n        context.forward(\"k2\", \"v2\", context.currentWallClockTime());\n\n        \u002F\u002F full control via Record (key, value, timestamp, headers)\n        var headers = new RecordHeaders();\n        headers.add(\"source\", \"scheduled\".getBytes());\n        context.forward(new Record\u003C>(\"k3\", \"v3\", context.currentWallClockTime(), headers));\n    });\n",[323,2333,2334,2358,2393,2397,2417,2423,2437,2447,2453,2462,2466,2496,2500,2504,2541,2545,2549,2565,2598,2647],{"__ignoreMap":447},[451,2335,2336,2338,2340,2342,2344,2346,2348,2350,2352,2354,2356],{"class":453,"line":454},[451,2337,458],{"class":457},[451,2339,712],{"class":510},[451,2341,715],{"class":514},[451,2343,718],{"class":510},[451,2345,715],{"class":514},[451,2347,723],{"class":510},[451,2349,715],{"class":514},[451,2351,728],{"class":510},[451,2353,715],{"class":514},[451,2355,2097],{"class":510},[451,2357,736],{"class":514},[451,2359,2360,2362,2364,2366,2368,2370,2372,2374,2376,2378,2381,2383,2386,2388,2391],{"class":453,"line":465},[451,2361,458],{"class":457},[451,2363,794],{"class":510},[451,2365,715],{"class":514},[451,2367,799],{"class":510},[451,2369,715],{"class":514},[451,2371,804],{"class":510},[451,2373,715],{"class":514},[451,2375,809],{"class":510},[451,2377,715],{"class":514},[451,2379,2380],{"class":510},"header",[451,2382,715],{"class":514},[451,2384,2385],{"class":510},"internals",[451,2387,715],{"class":514},[451,2389,2390],{"class":510},"RecordHeaders",[451,2392,736],{"class":514},[451,2394,2395],{"class":453,"line":473},[451,2396,501],{"emptyLinePlaceholder":500},[451,2398,2399,2401,2403,2405,2407,2409,2411,2413,2415],{"class":453,"line":481},[451,2400,1301],{"class":510},[451,2402,715],{"class":514},[451,2404,551],{"class":885},[451,2406,555],{"class":510},[451,2408,890],{"class":514},[451,2410,893],{"class":510},[451,2412,896],{"class":885},[451,2414,548],{"class":461},[451,2416,901],{"class":514},[451,2418,2419,2421],{"class":453,"line":489},[451,2420,1369],{"class":457},[451,2422,938],{"class":514},[451,2424,2425,2427,2429,2431,2433,2435],{"class":453,"line":497},[451,2426,1343],{"class":854},[451,2428,715],{"class":514},[451,2430,577],{"class":461},[451,2432,580],{"class":514},[451,2434,2163],{"class":583},[451,2436,587],{"class":514},[451,2438,2439,2441,2443,2445],{"class":453,"line":504},[451,2440,1358],{"class":854},[451,2442,715],{"class":514},[451,2444,357],{"class":854},[451,2446,938],{"class":514},[451,2448,2449,2451],{"class":453,"line":524},[451,2450,1369],{"class":457},[451,2452,938],{"class":514},[451,2454,2455,2457,2459],{"class":453,"line":529},[451,2456,1379],{"class":510},[451,2458,1198],{"class":514},[451,2460,2461],{"class":514}," {\n",[451,2463,2464],{"class":453,"line":536},[451,2465,2188],{"class":532},[451,2467,2468,2471,2473,2475,2477,2479,2482,2484,2486,2488,2491,2493],{"class":453,"line":542},[451,2469,2470],{"class":854},"        context",[451,2472,715],{"class":514},[451,2474,621],{"class":461},[451,2476,580],{"class":514},[451,2478,650],{"class":968},[451,2480,2481],{"class":626},"k1",[451,2483,650],{"class":968},[451,2485,890],{"class":514},[451,2487,978],{"class":968},[451,2489,2490],{"class":626},"v1",[451,2492,650],{"class":968},[451,2494,2495],{"class":514},");\n",[451,2497,2498],{"class":453,"line":566},[451,2499,501],{"emptyLinePlaceholder":500},[451,2501,2502],{"class":453,"line":590},[451,2503,2216],{"class":532},[451,2505,2506,2508,2510,2512,2514,2516,2519,2521,2523,2525,2528,2530,2532,2534,2536,2538],{"class":453,"line":601},[451,2507,2470],{"class":854},[451,2509,715],{"class":514},[451,2511,621],{"class":461},[451,2513,580],{"class":514},[451,2515,650],{"class":968},[451,2517,2518],{"class":626},"k2",[451,2520,650],{"class":968},[451,2522,890],{"class":514},[451,2524,978],{"class":968},[451,2526,2527],{"class":626},"v2",[451,2529,650],{"class":968},[451,2531,890],{"class":514},[451,2533,989],{"class":854},[451,2535,715],{"class":514},[451,2537,641],{"class":461},[451,2539,2540],{"class":514},"());\n",[451,2542,2543],{"class":453,"line":615},[451,2544,501],{"emptyLinePlaceholder":500},[451,2546,2547],{"class":453,"line":656},[451,2548,2249],{"class":532},[451,2550,2551,2554,2557,2559,2561,2563],{"class":453,"line":662},[451,2552,2553],{"class":885},"        var",[451,2555,2556],{"class":854}," headers",[451,2558,858],{"class":514},[451,2560,861],{"class":457},[451,2562,2262],{"class":461},[451,2564,866],{"class":514},[451,2566,2567,2570,2572,2574,2576,2578,2581,2583,2585,2587,2589,2591,2593,2596],{"class":453,"line":668},[451,2568,2569],{"class":854},"        headers",[451,2571,715],{"class":514},[451,2573,2274],{"class":461},[451,2575,580],{"class":514},[451,2577,650],{"class":968},[451,2579,2580],{"class":626},"source",[451,2582,650],{"class":968},[451,2584,890],{"class":514},[451,2586,978],{"class":968},[451,2588,548],{"class":626},[451,2590,650],{"class":968},[451,2592,715],{"class":514},[451,2594,2595],{"class":461},"getBytes",[451,2597,2540],{"class":514},[451,2599,2600,2602,2604,2606,2608,2611,2614,2617,2619,2622,2624,2626,2628,2631,2633,2635,2637,2639,2641,2643,2645],{"class":453,"line":998},[451,2601,2470],{"class":854},[451,2603,715],{"class":514},[451,2605,621],{"class":461},[451,2607,580],{"class":514},[451,2609,2610],{"class":457},"new",[451,2612,2613],{"class":510}," Record",[451,2615,2616],{"class":514},"\u003C>(",[451,2618,650],{"class":968},[451,2620,2621],{"class":626},"k3",[451,2623,650],{"class":968},[451,2625,890],{"class":514},[451,2627,978],{"class":968},[451,2629,2630],{"class":626},"v3",[451,2632,650],{"class":968},[451,2634,890],{"class":514},[451,2636,989],{"class":854},[451,2638,715],{"class":514},[451,2640,641],{"class":461},[451,2642,1031],{"class":514},[451,2644,2556],{"class":510},[451,2646,1407],{"class":514},[451,2648,2650],{"class":453,"line":2649},20,[451,2651,2652],{"class":514},"    });\n",[1070,2654,2656],{"id":2655},"reading-state-stores","Reading state stores",[320,2658,2659,2660,2663,2664,2666,2667,558,2670,2673,2674,2677],{},"The context exposes ",[323,2661,2662],{},"getStateStore(name)"," for ",[337,2665,379],{}," access. Write operations (",[323,2668,2669],{},"put",[323,2671,2672],{},"delete",") on a store obtained this way throw ",[323,2675,2676],{},"UnsupportedOperationException",". This makes the scheduled source a natural fit for periodically scanning state and emitting derived events — for example, scanning pending items and emitting a \"publish\" event once their scheduled time has passed.",[437,2679,2680,2902],{"group":439},[441,2681,2683],{"className":443,"code":2682,"filename":445,"language":446,"meta":447,"style":447},"import io.stoatflow.core.state.ReadOnlyKeyValueStore\n\nbuilder.scheduled\u003CString, String>(\n    named = Named.`as`(\"publish-scanner\"),\n    interval = Duration.ofMinutes(1),\n    type = PunctuationType.WALL_CLOCK_TIME,\n    emitter = { context ->\n        val now = context.currentWallClockTime()\n        val pending = context.getStateStore\u003CReadOnlyKeyValueStore\u003CString, Long>>(\"pending-publishes\")\n        pending.all().use { it ->\n            it.forEach { entry ->\n                if (entry.value \u003C= now) {\n                    context.forward(entry.key, \"published\")\n                }\n            }\n        }\n    },\n)\n",[323,2684,2685,2692,2696,2712,2729,2747,2755,2765,2780,2816,2834,2847,2864,2879,2884,2889,2894,2898],{"__ignoreMap":447},[451,2686,2687,2689],{"class":453,"line":454},[451,2688,458],{"class":457},[451,2690,2691],{"class":461}," io.stoatflow.core.state.ReadOnlyKeyValueStore\n",[451,2693,2694],{"class":453,"line":465},[451,2695,501],{"emptyLinePlaceholder":500},[451,2697,2698,2700,2702,2704,2706,2708,2710],{"class":453,"line":473},[451,2699,1128],{"class":510},[451,2701,548],{"class":461},[451,2703,551],{"class":510},[451,2705,555],{"class":554},[451,2707,558],{"class":510},[451,2709,555],{"class":554},[451,2711,563],{"class":510},[451,2713,2714,2716,2718,2720,2722,2724,2727],{"class":453,"line":481},[451,2715,1145],{"class":510},[451,2717,515],{"class":514},[451,2719,1150],{"class":510},[451,2721,1153],{"class":461},[451,2723,580],{"class":510},[451,2725,2726],{"class":626},"\"publish-scanner\"",[451,2728,587],{"class":510},[451,2730,2731,2733,2735,2737,2740,2742,2745],{"class":453,"line":489},[451,2732,1165],{"class":510},[451,2734,515],{"class":514},[451,2736,574],{"class":510},[451,2738,2739],{"class":461},"ofMinutes",[451,2741,580],{"class":510},[451,2743,2744],{"class":583},"1",[451,2746,587],{"class":510},[451,2748,2749,2751,2753],{"class":453,"line":497},[451,2750,1182],{"class":510},[451,2752,515],{"class":514},[451,2754,598],{"class":510},[451,2756,2757,2759,2761,2763],{"class":453,"line":504},[451,2758,1191],{"class":510},[451,2760,515],{"class":514},[451,2762,609],{"class":510},[451,2764,612],{"class":514},[451,2766,2767,2769,2772,2774,2776,2778],{"class":453,"line":524},[451,2768,2254],{"class":457},[451,2770,2771],{"class":510}," now ",[451,2773,515],{"class":514},[451,2775,1201],{"class":510},[451,2777,641],{"class":461},[451,2779,521],{"class":510},[451,2781,2782,2784,2787,2789,2791,2794,2796,2799,2801,2803,2805,2808,2811,2814],{"class":453,"line":529},[451,2783,2254],{"class":457},[451,2785,2786],{"class":510}," pending ",[451,2788,515],{"class":514},[451,2790,1201],{"class":510},[451,2792,2793],{"class":461},"getStateStore",[451,2795,551],{"class":510},[451,2797,2798],{"class":554},"ReadOnlyKeyValueStore",[451,2800,551],{"class":510},[451,2802,555],{"class":554},[451,2804,558],{"class":510},[451,2806,2807],{"class":554},"Long",[451,2809,2810],{"class":510},">>(",[451,2812,2813],{"class":626},"\"pending-publishes\"",[451,2815,653],{"class":510},[451,2817,2818,2821,2824,2826,2829,2832],{"class":453,"line":536},[451,2819,2820],{"class":510},"        pending.",[451,2822,2823],{"class":461},"all",[451,2825,2265],{"class":510},[451,2827,2828],{"class":461},"use",[451,2830,2831],{"class":510}," { it ",[451,2833,612],{"class":514},[451,2835,2836,2839,2842,2845],{"class":453,"line":542},[451,2837,2838],{"class":510},"            it.",[451,2840,2841],{"class":461},"forEach",[451,2843,2844],{"class":510}," { entry ",[451,2846,612],{"class":514},[451,2848,2849,2852,2855,2858,2861],{"class":453,"line":566},[451,2850,2851],{"class":457},"                if",[451,2853,2854],{"class":510}," (entry.",[451,2856,2857],{"class":885},"value",[451,2859,2860],{"class":885}," \u003C=",[451,2862,2863],{"class":510}," now) {\n",[451,2865,2866,2869,2871,2874,2877],{"class":453,"line":590},[451,2867,2868],{"class":510},"                    context.",[451,2870,621],{"class":461},[451,2872,2873],{"class":510},"(entry.key, ",[451,2875,2876],{"class":626},"\"published\"",[451,2878,653],{"class":510},[451,2880,2881],{"class":453,"line":601},[451,2882,2883],{"class":510},"                }\n",[451,2885,2886],{"class":453,"line":615},[451,2887,2888],{"class":510},"            }\n",[451,2890,2891],{"class":453,"line":656},[451,2892,2893],{"class":510},"        }\n",[451,2895,2896],{"class":453,"line":662},[451,2897,2324],{"class":510},[451,2899,2900],{"class":453,"line":668},[451,2901,653],{"class":510},[441,2903,2905],{"className":700,"code":2904,"filename":702,"language":703,"meta":447,"style":447},"import io.stoatflow.core.state.ReadOnlyKeyValueStore;\nimport io.stoatflow.core.state.KeyValueIterator;\nimport io.stoatflow.core.state.KeyValue;\n\nbuilder.\u003CString, String>scheduled(\n    Named.as(\"publish-scanner\"),\n    Duration.ofMinutes(1),\n    PunctuationType.WALL_CLOCK_TIME,\n    null,\n    context -> {\n        long now = context.currentWallClockTime();\n        ReadOnlyKeyValueStore\u003CString, Long> pending = context.getStateStore(\"pending-publishes\");\n        try (KeyValueIterator\u003CString, Long> it = pending.all()) {\n            while (it.hasNext()) {\n                KeyValue\u003CString, Long> entry = it.next();\n                if (entry.value \u003C= now) {\n                    context.forward(entry.key, \"published\");\n                }\n            }\n        }\n    });\n",[323,2906,2907,2932,2957,2982,2986,3006,3025,3039,3049,3055,3063,3081,3119,3155,3174,3203,3225,3254,3258,3262,3266],{"__ignoreMap":447},[451,2908,2909,2911,2913,2915,2917,2919,2921,2923,2926,2928,2930],{"class":453,"line":454},[451,2910,458],{"class":457},[451,2912,712],{"class":510},[451,2914,715],{"class":514},[451,2916,718],{"class":510},[451,2918,715],{"class":514},[451,2920,723],{"class":510},[451,2922,715],{"class":514},[451,2924,2925],{"class":510},"state",[451,2927,715],{"class":514},[451,2929,2798],{"class":510},[451,2931,736],{"class":514},[451,2933,2934,2936,2938,2940,2942,2944,2946,2948,2950,2952,2955],{"class":453,"line":465},[451,2935,458],{"class":457},[451,2937,712],{"class":510},[451,2939,715],{"class":514},[451,2941,718],{"class":510},[451,2943,715],{"class":514},[451,2945,723],{"class":510},[451,2947,715],{"class":514},[451,2949,2925],{"class":510},[451,2951,715],{"class":514},[451,2953,2954],{"class":510},"KeyValueIterator",[451,2956,736],{"class":514},[451,2958,2959,2961,2963,2965,2967,2969,2971,2973,2975,2977,2980],{"class":453,"line":473},[451,2960,458],{"class":457},[451,2962,712],{"class":510},[451,2964,715],{"class":514},[451,2966,718],{"class":510},[451,2968,715],{"class":514},[451,2970,723],{"class":510},[451,2972,715],{"class":514},[451,2974,2925],{"class":510},[451,2976,715],{"class":514},[451,2978,2979],{"class":510},"KeyValue",[451,2981,736],{"class":514},[451,2983,2984],{"class":453,"line":481},[451,2985,501],{"emptyLinePlaceholder":500},[451,2987,2988,2990,2992,2994,2996,2998,3000,3002,3004],{"class":453,"line":489},[451,2989,1301],{"class":510},[451,2991,715],{"class":514},[451,2993,551],{"class":885},[451,2995,555],{"class":510},[451,2997,890],{"class":514},[451,2999,893],{"class":510},[451,3001,896],{"class":885},[451,3003,548],{"class":461},[451,3005,901],{"class":514},[451,3007,3008,3010,3012,3014,3016,3018,3021,3023],{"class":453,"line":497},[451,3009,1322],{"class":854},[451,3011,715],{"class":514},[451,3013,1327],{"class":461},[451,3015,580],{"class":514},[451,3017,650],{"class":968},[451,3019,3020],{"class":626},"publish-scanner",[451,3022,650],{"class":968},[451,3024,587],{"class":514},[451,3026,3027,3029,3031,3033,3035,3037],{"class":453,"line":504},[451,3028,1343],{"class":854},[451,3030,715],{"class":514},[451,3032,2739],{"class":461},[451,3034,580],{"class":514},[451,3036,2744],{"class":583},[451,3038,587],{"class":514},[451,3040,3041,3043,3045,3047],{"class":453,"line":524},[451,3042,1358],{"class":854},[451,3044,715],{"class":514},[451,3046,357],{"class":854},[451,3048,938],{"class":514},[451,3050,3051,3053],{"class":453,"line":529},[451,3052,1369],{"class":457},[451,3054,938],{"class":514},[451,3056,3057,3059,3061],{"class":453,"line":536},[451,3058,1379],{"class":510},[451,3060,1198],{"class":514},[451,3062,2461],{"class":514},[451,3064,3065,3068,3071,3073,3075,3077,3079],{"class":453,"line":542},[451,3066,3067],{"class":885},"        long",[451,3069,3070],{"class":854}," now",[451,3072,858],{"class":514},[451,3074,989],{"class":854},[451,3076,715],{"class":514},[451,3078,641],{"class":461},[451,3080,866],{"class":514},[451,3082,3083,3086,3088,3090,3092,3095,3097,3100,3102,3104,3106,3108,3110,3112,3115,3117],{"class":453,"line":566},[451,3084,3085],{"class":510},"        ReadOnlyKeyValueStore",[451,3087,551],{"class":514},[451,3089,555],{"class":885},[451,3091,890],{"class":514},[451,3093,3094],{"class":885}," Long",[451,3096,896],{"class":514},[451,3098,3099],{"class":854}," pending",[451,3101,858],{"class":514},[451,3103,989],{"class":854},[451,3105,715],{"class":514},[451,3107,2793],{"class":461},[451,3109,580],{"class":514},[451,3111,650],{"class":968},[451,3113,3114],{"class":626},"pending-publishes",[451,3116,650],{"class":968},[451,3118,2495],{"class":514},[451,3120,3121,3124,3127,3129,3131,3133,3135,3137,3139,3142,3144,3146,3148,3150,3153],{"class":453,"line":590},[451,3122,3123],{"class":457},"        try",[451,3125,3126],{"class":514}," (",[451,3128,2954],{"class":510},[451,3130,551],{"class":514},[451,3132,555],{"class":885},[451,3134,890],{"class":514},[451,3136,3094],{"class":885},[451,3138,896],{"class":514},[451,3140,3141],{"class":854}," it",[451,3143,858],{"class":514},[451,3145,3099],{"class":854},[451,3147,715],{"class":514},[451,3149,2823],{"class":461},[451,3151,3152],{"class":514},"())",[451,3154,2461],{"class":514},[451,3156,3157,3160,3162,3165,3167,3170,3172],{"class":453,"line":601},[451,3158,3159],{"class":457},"            while",[451,3161,3126],{"class":514},[451,3163,3164],{"class":854},"it",[451,3166,715],{"class":514},[451,3168,3169],{"class":461},"hasNext",[451,3171,3152],{"class":514},[451,3173,2461],{"class":514},[451,3175,3176,3179,3181,3183,3185,3187,3189,3192,3194,3196,3198,3201],{"class":453,"line":615},[451,3177,3178],{"class":510},"                KeyValue",[451,3180,551],{"class":514},[451,3182,555],{"class":885},[451,3184,890],{"class":514},[451,3186,3094],{"class":885},[451,3188,896],{"class":514},[451,3190,3191],{"class":854}," entry",[451,3193,858],{"class":514},[451,3195,3141],{"class":854},[451,3197,715],{"class":514},[451,3199,3200],{"class":461},"next",[451,3202,866],{"class":514},[451,3204,3205,3207,3209,3212,3214,3216,3218,3220,3223],{"class":453,"line":656},[451,3206,2851],{"class":457},[451,3208,3126],{"class":514},[451,3210,3211],{"class":854},"entry",[451,3213,715],{"class":514},[451,3215,2857],{"class":854},[451,3217,2860],{"class":885},[451,3219,3070],{"class":510},[451,3221,3222],{"class":514},")",[451,3224,2461],{"class":514},[451,3226,3227,3230,3232,3234,3236,3238,3240,3243,3245,3247,3250,3252],{"class":453,"line":662},[451,3228,3229],{"class":854},"                    context",[451,3231,715],{"class":514},[451,3233,621],{"class":461},[451,3235,580],{"class":514},[451,3237,3211],{"class":854},[451,3239,715],{"class":514},[451,3241,3242],{"class":854},"key",[451,3244,890],{"class":514},[451,3246,978],{"class":968},[451,3248,3249],{"class":626},"published",[451,3251,650],{"class":968},[451,3253,2495],{"class":514},[451,3255,3256],{"class":453,"line":668},[451,3257,2883],{"class":514},[451,3259,3260],{"class":453,"line":998},[451,3261,2888],{"class":514},[451,3263,3264],{"class":453,"line":2649},[451,3265,2893],{"class":514},[451,3267,3269],{"class":453,"line":3268},21,[451,3270,2652],{"class":514},[320,3272,3273,558,3276,558,3279,3282,3283,3286,3287,3290,3291,3294,3295,3297],{},[323,3274,3275],{},"all()",[323,3277,3278],{},"range()",[323,3280,3281],{},"prefixScan()",", and the reverse variants all return a ",[323,3284,3285],{},"KeyValueIterator\u003CK, V>",", which is ",[323,3288,3289],{},"Closeable"," — close it (Kotlin ",[323,3292,3293],{},"use {}",", Java try-with-resources) to release resources. See ",[388,3296,100],{"href":101}," for the full read-only query surface.",[1043,3299,3300],{"color":1045,"icon":1046},[320,3301,3302,3303,376,3306,3309,3310,3313,3314,3317,3318,3320,3321,3323,3324,3326,3327,3330],{},"For the time helpers: ",[323,3304,3305],{},"currentWallClockTime()",[323,3307,3308],{},"currentSystemTimeMs()"," return system time; ",[323,3311,3312],{},"currentWatermarkMs()"," (also ",[323,3315,3316],{},"currentStreamTimeMs()",") returns the global event-time watermark. For a ",[323,3319,353],{}," source, ",[323,3322,3312],{}," is the watermark value that triggered the firing; for a ",[323,3325,357],{}," source it's whatever the global watermark currently is (",[323,3328,3329],{},"Long.MIN_VALUE"," if no events have been processed yet).",[392,3332,3334],{"id":3333},"processing-the-result","Processing the result",[320,3336,3337,3339,3340,3342,3343,715],{},[323,3338,430],{}," returns a ",[323,3341,343],{}," — there's nothing special about it downstream. Map, filter, group, aggregate, join, or merge it with a Kafka-sourced stream, all with the operators from ",[388,3344,3345],{"href":116},"KStream & KTable",[437,3347,3348,3540],{"group":439},[441,3349,3351],{"className":443,"code":3350,"filename":445,"language":446,"meta":447,"style":447},"val ticks = builder.scheduled\u003CString, Int>(\n    interval = Duration.ofSeconds(5),\n    type = PunctuationType.WALL_CLOCK_TIME,\n    emitter = { context ->\n        context.forward(\"a\", 1)\n        context.forward(\"b\", 2)\n    },\n)\n\nticks\n    .filter { _, value -> value > 1 }\n    .mapValues { value -> value * 10 }\n    .to(\"output\", Produced.with(Serdes.String(), Serdes.Integer()))\n",[323,3352,3353,3378,3394,3402,3412,3429,3447,3451,3455,3459,3464,3491,3514],{"__ignoreMap":447},[451,3354,3355,3357,3360,3362,3365,3367,3369,3371,3373,3376],{"class":453,"line":454},[451,3356,507],{"class":457},[451,3358,3359],{"class":510}," ticks ",[451,3361,515],{"class":514},[451,3363,3364],{"class":510}," builder.",[451,3366,548],{"class":461},[451,3368,551],{"class":510},[451,3370,555],{"class":554},[451,3372,558],{"class":510},[451,3374,3375],{"class":554},"Int",[451,3377,563],{"class":510},[451,3379,3380,3382,3384,3386,3388,3390,3392],{"class":453,"line":465},[451,3381,1165],{"class":510},[451,3383,515],{"class":514},[451,3385,574],{"class":510},[451,3387,577],{"class":461},[451,3389,580],{"class":510},[451,3391,1916],{"class":583},[451,3393,587],{"class":510},[451,3395,3396,3398,3400],{"class":453,"line":473},[451,3397,1182],{"class":510},[451,3399,515],{"class":514},[451,3401,598],{"class":510},[451,3403,3404,3406,3408,3410],{"class":453,"line":481},[451,3405,1191],{"class":510},[451,3407,515],{"class":514},[451,3409,609],{"class":510},[451,3411,612],{"class":514},[451,3413,3414,3416,3418,3420,3423,3425,3427],{"class":453,"line":489},[451,3415,2193],{"class":510},[451,3417,621],{"class":461},[451,3419,580],{"class":510},[451,3421,3422],{"class":626},"\"a\"",[451,3424,558],{"class":510},[451,3426,2744],{"class":583},[451,3428,653],{"class":510},[451,3430,3431,3433,3435,3437,3440,3442,3445],{"class":453,"line":497},[451,3432,2193],{"class":510},[451,3434,621],{"class":461},[451,3436,580],{"class":510},[451,3438,3439],{"class":626},"\"b\"",[451,3441,558],{"class":510},[451,3443,3444],{"class":583},"2",[451,3446,653],{"class":510},[451,3448,3449],{"class":453,"line":504},[451,3450,2324],{"class":510},[451,3452,3453],{"class":453,"line":524},[451,3454,653],{"class":510},[451,3456,3457],{"class":453,"line":529},[451,3458,501],{"emptyLinePlaceholder":500},[451,3460,3461],{"class":453,"line":536},[451,3462,3463],{"class":510},"ticks\n",[451,3465,3466,3468,3471,3474,3476,3479,3482,3485,3488],{"class":453,"line":542},[451,3467,545],{"class":510},[451,3469,3470],{"class":461},"filter",[451,3472,3473],{"class":510}," { _, ",[451,3475,2857],{"class":885},[451,3477,3478],{"class":514}," ->",[451,3480,3481],{"class":885}," value",[451,3483,3484],{"class":885}," >",[451,3486,3487],{"class":583}," 1",[451,3489,3490],{"class":510}," }\n",[451,3492,3493,3495,3498,3500,3502,3504,3506,3509,3512],{"class":453,"line":566},[451,3494,545],{"class":510},[451,3496,3497],{"class":461},"mapValues",[451,3499,2271],{"class":510},[451,3501,2857],{"class":885},[451,3503,3478],{"class":514},[451,3505,3481],{"class":885},[451,3507,3508],{"class":885}," *",[451,3510,3511],{"class":583}," 10",[451,3513,3490],{"class":510},[451,3515,3516,3518,3520,3522,3525,3527,3529,3531,3533,3535,3538],{"class":453,"line":590},[451,3517,545],{"class":510},[451,3519,673],{"class":461},[451,3521,580],{"class":510},[451,3523,3524],{"class":626},"\"output\"",[451,3526,681],{"class":510},[451,3528,684],{"class":461},[451,3530,687],{"class":510},[451,3532,555],{"class":461},[451,3534,692],{"class":510},[451,3536,3537],{"class":461},"Integer",[451,3539,697],{"class":510},[441,3541,3543],{"className":700,"code":3542,"filename":702,"language":703,"meta":447,"style":447},"import io.stoatflow.core.topology.KStream;\n\nKStream\u003CString, Integer> ticks = builder.\u003CString, Integer>scheduled(\n    null,\n    Duration.ofSeconds(5),\n    PunctuationType.WALL_CLOCK_TIME,\n    null,\n    context -> {\n        context.forward(\"a\", 1);\n        context.forward(\"b\", 2);\n    });\n\nticks\n    .filter((key, value) -> value > 1)\n    .mapValues(value -> value * 10)\n    .to(\"output\", Produced.with(Serdes.String(), Serdes.Integer()));\n",[323,3544,3545,3570,3574,3612,3618,3632,3642,3648,3656,3678,3702,3706,3710,3714,3742,3764],{"__ignoreMap":447},[451,3546,3547,3549,3551,3553,3555,3557,3559,3561,3563,3565,3568],{"class":453,"line":454},[451,3548,458],{"class":457},[451,3550,712],{"class":510},[451,3552,715],{"class":514},[451,3554,718],{"class":510},[451,3556,715],{"class":514},[451,3558,723],{"class":510},[451,3560,715],{"class":514},[451,3562,755],{"class":510},[451,3564,715],{"class":514},[451,3566,3567],{"class":510},"KStream",[451,3569,736],{"class":514},[451,3571,3572],{"class":453,"line":465},[451,3573,501],{"emptyLinePlaceholder":500},[451,3575,3576,3578,3580,3582,3584,3587,3589,3592,3594,3596,3598,3600,3602,3604,3606,3608,3610],{"class":453,"line":473},[451,3577,3567],{"class":510},[451,3579,551],{"class":514},[451,3581,555],{"class":885},[451,3583,890],{"class":514},[451,3585,3586],{"class":885}," Integer",[451,3588,896],{"class":514},[451,3590,3591],{"class":854}," ticks",[451,3593,858],{"class":514},[451,3595,855],{"class":510},[451,3597,715],{"class":514},[451,3599,551],{"class":885},[451,3601,555],{"class":510},[451,3603,890],{"class":514},[451,3605,3586],{"class":510},[451,3607,896],{"class":885},[451,3609,548],{"class":461},[451,3611,901],{"class":514},[451,3613,3614,3616],{"class":453,"line":481},[451,3615,1369],{"class":457},[451,3617,938],{"class":514},[451,3619,3620,3622,3624,3626,3628,3630],{"class":453,"line":489},[451,3621,1343],{"class":854},[451,3623,715],{"class":514},[451,3625,577],{"class":461},[451,3627,580],{"class":514},[451,3629,1916],{"class":583},[451,3631,587],{"class":514},[451,3633,3634,3636,3638,3640],{"class":453,"line":497},[451,3635,1358],{"class":854},[451,3637,715],{"class":514},[451,3639,357],{"class":854},[451,3641,938],{"class":514},[451,3643,3644,3646],{"class":453,"line":504},[451,3645,1369],{"class":457},[451,3647,938],{"class":514},[451,3649,3650,3652,3654],{"class":453,"line":524},[451,3651,1379],{"class":510},[451,3653,1198],{"class":514},[451,3655,2461],{"class":514},[451,3657,3658,3660,3662,3664,3666,3668,3670,3672,3674,3676],{"class":453,"line":529},[451,3659,2470],{"class":854},[451,3661,715],{"class":514},[451,3663,621],{"class":461},[451,3665,580],{"class":514},[451,3667,650],{"class":968},[451,3669,388],{"class":626},[451,3671,650],{"class":968},[451,3673,890],{"class":514},[451,3675,3487],{"class":583},[451,3677,2495],{"class":514},[451,3679,3680,3682,3684,3686,3688,3690,3693,3695,3697,3700],{"class":453,"line":536},[451,3681,2470],{"class":854},[451,3683,715],{"class":514},[451,3685,621],{"class":461},[451,3687,580],{"class":514},[451,3689,650],{"class":968},[451,3691,3692],{"class":626},"b",[451,3694,650],{"class":968},[451,3696,890],{"class":514},[451,3698,3699],{"class":583}," 2",[451,3701,2495],{"class":514},[451,3703,3704],{"class":453,"line":542},[451,3705,2652],{"class":514},[451,3707,3708],{"class":453,"line":566},[451,3709,501],{"emptyLinePlaceholder":500},[451,3711,3712],{"class":453,"line":590},[451,3713,3463],{"class":510},[451,3715,3716,3718,3720,3723,3725,3727,3729,3731,3733,3736,3738,3740],{"class":453,"line":601},[451,3717,545],{"class":514},[451,3719,3470],{"class":461},[451,3721,3722],{"class":514},"((",[451,3724,3242],{"class":510},[451,3726,890],{"class":514},[451,3728,3481],{"class":510},[451,3730,3222],{"class":514},[451,3732,3478],{"class":514},[451,3734,3735],{"class":510}," value ",[451,3737,896],{"class":885},[451,3739,3487],{"class":583},[451,3741,653],{"class":514},[451,3743,3744,3746,3748,3750,3753,3755,3757,3760,3762],{"class":453,"line":615},[451,3745,545],{"class":514},[451,3747,3497],{"class":461},[451,3749,580],{"class":514},[451,3751,3752],{"class":510},"value ",[451,3754,1198],{"class":514},[451,3756,3735],{"class":510},[451,3758,3759],{"class":885},"*",[451,3761,3511],{"class":583},[451,3763,653],{"class":514},[451,3765,3766,3768,3770,3772,3774,3777,3779,3781,3783,3785,3787,3789,3791,3793,3795,3797,3799,3801,3803],{"class":453,"line":656},[451,3767,545],{"class":514},[451,3769,673],{"class":461},[451,3771,580],{"class":514},[451,3773,650],{"class":968},[451,3775,3776],{"class":626},"output",[451,3778,650],{"class":968},[451,3780,890],{"class":514},[451,3782,1016],{"class":854},[451,3784,715],{"class":514},[451,3786,684],{"class":461},[451,3788,580],{"class":514},[451,3790,819],{"class":854},[451,3792,715],{"class":514},[451,3794,555],{"class":461},[451,3796,1031],{"class":514},[451,3798,1034],{"class":854},[451,3800,715],{"class":514},[451,3802,3537],{"class":461},[451,3804,1041],{"class":514},[320,3806,3807,3808,376,3810,3813],{},"To combine a scheduled source with a Kafka topic, keep a reference to each ",[323,3809,3567],{},[323,3811,3812],{},"merge"," them:",[437,3815,3816,3993],{"group":439},[441,3817,3819],{"className":443,"code":3818,"filename":445,"language":446,"meta":447,"style":447},"import io.stoatflow.core.topology.Consumed\n\nval scheduled = builder.scheduled\u003CString, String>(\n    interval = Duration.ofSeconds(5),\n    type = PunctuationType.WALL_CLOCK_TIME,\n    emitter = { context -> context.forward(\"scheduled\", \"tick\") },\n)\nval kafka = builder.stream\u003CString, String>(\"input\", Consumed.with(Serdes.String(), Serdes.String()))\n\nscheduled\n    .merge(kafka)\n    .to(\"output\", Produced.with(Serdes.String(), Serdes.String()))\n",[323,3820,3821,3828,3832,3855,3871,3879,3904,3908,3951,3955,3960,3969],{"__ignoreMap":447},[451,3822,3823,3825],{"class":453,"line":454},[451,3824,458],{"class":457},[451,3826,3827],{"class":461}," io.stoatflow.core.topology.Consumed\n",[451,3829,3830],{"class":453,"line":465},[451,3831,501],{"emptyLinePlaceholder":500},[451,3833,3834,3836,3839,3841,3843,3845,3847,3849,3851,3853],{"class":453,"line":473},[451,3835,507],{"class":457},[451,3837,3838],{"class":510}," scheduled ",[451,3840,515],{"class":514},[451,3842,3364],{"class":510},[451,3844,548],{"class":461},[451,3846,551],{"class":510},[451,3848,555],{"class":554},[451,3850,558],{"class":510},[451,3852,555],{"class":554},[451,3854,563],{"class":510},[451,3856,3857,3859,3861,3863,3865,3867,3869],{"class":453,"line":481},[451,3858,1165],{"class":510},[451,3860,515],{"class":514},[451,3862,574],{"class":510},[451,3864,577],{"class":461},[451,3866,580],{"class":510},[451,3868,1916],{"class":583},[451,3870,587],{"class":510},[451,3872,3873,3875,3877],{"class":453,"line":489},[451,3874,1182],{"class":510},[451,3876,515],{"class":514},[451,3878,598],{"class":510},[451,3880,3881,3883,3885,3887,3889,3891,3893,3895,3897,3899,3902],{"class":453,"line":497},[451,3882,1191],{"class":510},[451,3884,515],{"class":514},[451,3886,609],{"class":510},[451,3888,1198],{"class":514},[451,3890,1201],{"class":510},[451,3892,621],{"class":461},[451,3894,580],{"class":510},[451,3896,2284],{"class":626},[451,3898,558],{"class":510},[451,3900,3901],{"class":626},"\"tick\"",[451,3903,1215],{"class":510},[451,3905,3906],{"class":453,"line":504},[451,3907,653],{"class":510},[451,3909,3910,3912,3915,3917,3919,3922,3924,3926,3928,3930,3933,3936,3939,3941,3943,3945,3947,3949],{"class":453,"line":524},[451,3911,507],{"class":457},[451,3913,3914],{"class":510}," kafka ",[451,3916,515],{"class":514},[451,3918,3364],{"class":510},[451,3920,3921],{"class":461},"stream",[451,3923,551],{"class":510},[451,3925,555],{"class":554},[451,3927,558],{"class":510},[451,3929,555],{"class":554},[451,3931,3932],{"class":510},">(",[451,3934,3935],{"class":626},"\"input\"",[451,3937,3938],{"class":510},", Consumed.",[451,3940,684],{"class":461},[451,3942,687],{"class":510},[451,3944,555],{"class":461},[451,3946,692],{"class":510},[451,3948,555],{"class":461},[451,3950,697],{"class":510},[451,3952,3953],{"class":453,"line":529},[451,3954,501],{"emptyLinePlaceholder":500},[451,3956,3957],{"class":453,"line":536},[451,3958,3959],{"class":510},"scheduled\n",[451,3961,3962,3964,3966],{"class":453,"line":542},[451,3963,545],{"class":510},[451,3965,3812],{"class":461},[451,3967,3968],{"class":510},"(kafka)\n",[451,3970,3971,3973,3975,3977,3979,3981,3983,3985,3987,3989,3991],{"class":453,"line":566},[451,3972,545],{"class":510},[451,3974,673],{"class":461},[451,3976,580],{"class":510},[451,3978,3524],{"class":626},[451,3980,681],{"class":510},[451,3982,684],{"class":461},[451,3984,687],{"class":510},[451,3986,555],{"class":461},[451,3988,692],{"class":510},[451,3990,555],{"class":461},[451,3992,697],{"class":510},[441,3994,3996],{"className":700,"code":3995,"filename":702,"language":703,"meta":447,"style":447},"import io.stoatflow.core.topology.Consumed;\nimport io.stoatflow.core.topology.KStream;\n\nKStream\u003CString, String> scheduled = builder.\u003CString, String>scheduled(\n    null,\n    Duration.ofSeconds(5),\n    PunctuationType.WALL_CLOCK_TIME,\n    null,\n    context -> context.forward(\"scheduled\", \"tick\"));\nKStream\u003CString, String> kafka =\n    builder.stream(\"input\", Consumed.with(Serdes.String(), Serdes.String()));\n\nscheduled\n    .merge(kafka)\n    .to(\"output\", Produced.with(Serdes.String(), Serdes.String()));\n",[323,3997,3998,4023,4047,4051,4088,4094,4108,4118,4124,4155,4175,4220,4224,4228,4240],{"__ignoreMap":447},[451,3999,4000,4002,4004,4006,4008,4010,4012,4014,4016,4018,4021],{"class":453,"line":454},[451,4001,458],{"class":457},[451,4003,712],{"class":510},[451,4005,715],{"class":514},[451,4007,718],{"class":510},[451,4009,715],{"class":514},[451,4011,723],{"class":510},[451,4013,715],{"class":514},[451,4015,755],{"class":510},[451,4017,715],{"class":514},[451,4019,4020],{"class":510},"Consumed",[451,4022,736],{"class":514},[451,4024,4025,4027,4029,4031,4033,4035,4037,4039,4041,4043,4045],{"class":453,"line":465},[451,4026,458],{"class":457},[451,4028,712],{"class":510},[451,4030,715],{"class":514},[451,4032,718],{"class":510},[451,4034,715],{"class":514},[451,4036,723],{"class":510},[451,4038,715],{"class":514},[451,4040,755],{"class":510},[451,4042,715],{"class":514},[451,4044,3567],{"class":510},[451,4046,736],{"class":514},[451,4048,4049],{"class":453,"line":473},[451,4050,501],{"emptyLinePlaceholder":500},[451,4052,4053,4055,4057,4059,4061,4063,4065,4068,4070,4072,4074,4076,4078,4080,4082,4084,4086],{"class":453,"line":481},[451,4054,3567],{"class":510},[451,4056,551],{"class":514},[451,4058,555],{"class":885},[451,4060,890],{"class":514},[451,4062,893],{"class":885},[451,4064,896],{"class":514},[451,4066,4067],{"class":854}," scheduled",[451,4069,858],{"class":514},[451,4071,855],{"class":510},[451,4073,715],{"class":514},[451,4075,551],{"class":885},[451,4077,555],{"class":510},[451,4079,890],{"class":514},[451,4081,893],{"class":510},[451,4083,896],{"class":885},[451,4085,548],{"class":461},[451,4087,901],{"class":514},[451,4089,4090,4092],{"class":453,"line":489},[451,4091,1369],{"class":457},[451,4093,938],{"class":514},[451,4095,4096,4098,4100,4102,4104,4106],{"class":453,"line":497},[451,4097,1343],{"class":854},[451,4099,715],{"class":514},[451,4101,577],{"class":461},[451,4103,580],{"class":514},[451,4105,1916],{"class":583},[451,4107,587],{"class":514},[451,4109,4110,4112,4114,4116],{"class":453,"line":504},[451,4111,1358],{"class":854},[451,4113,715],{"class":514},[451,4115,357],{"class":854},[451,4117,938],{"class":514},[451,4119,4120,4122],{"class":453,"line":524},[451,4121,1369],{"class":457},[451,4123,938],{"class":514},[451,4125,4126,4128,4130,4132,4134,4136,4138,4140,4142,4144,4146,4148,4151,4153],{"class":453,"line":529},[451,4127,1379],{"class":510},[451,4129,1198],{"class":514},[451,4131,989],{"class":854},[451,4133,715],{"class":514},[451,4135,621],{"class":461},[451,4137,580],{"class":514},[451,4139,650],{"class":968},[451,4141,548],{"class":626},[451,4143,650],{"class":968},[451,4145,890],{"class":514},[451,4147,978],{"class":968},[451,4149,4150],{"class":626},"tick",[451,4152,650],{"class":968},[451,4154,1407],{"class":514},[451,4156,4157,4159,4161,4163,4165,4167,4169,4172],{"class":453,"line":536},[451,4158,3567],{"class":510},[451,4160,551],{"class":514},[451,4162,555],{"class":885},[451,4164,890],{"class":514},[451,4166,893],{"class":885},[451,4168,896],{"class":514},[451,4170,4171],{"class":854}," kafka",[451,4173,4174],{"class":514}," =\n",[451,4176,4177,4180,4182,4184,4186,4188,4191,4193,4195,4198,4200,4202,4204,4206,4208,4210,4212,4214,4216,4218],{"class":453,"line":542},[451,4178,4179],{"class":854},"    builder",[451,4181,715],{"class":514},[451,4183,3921],{"class":461},[451,4185,580],{"class":514},[451,4187,650],{"class":968},[451,4189,4190],{"class":626},"input",[451,4192,650],{"class":968},[451,4194,890],{"class":514},[451,4196,4197],{"class":854}," Consumed",[451,4199,715],{"class":514},[451,4201,684],{"class":461},[451,4203,580],{"class":514},[451,4205,819],{"class":854},[451,4207,715],{"class":514},[451,4209,555],{"class":461},[451,4211,1031],{"class":514},[451,4213,1034],{"class":854},[451,4215,715],{"class":514},[451,4217,555],{"class":461},[451,4219,1041],{"class":514},[451,4221,4222],{"class":453,"line":566},[451,4223,501],{"emptyLinePlaceholder":500},[451,4225,4226],{"class":453,"line":590},[451,4227,3959],{"class":510},[451,4229,4230,4232,4234,4236,4238],{"class":453,"line":601},[451,4231,545],{"class":514},[451,4233,3812],{"class":461},[451,4235,580],{"class":514},[451,4237,804],{"class":510},[451,4239,653],{"class":514},[451,4241,4242,4244,4246,4248,4250,4252,4254,4256,4258,4260,4262,4264,4266,4268,4270,4272,4274,4276,4278],{"class":453,"line":615},[451,4243,545],{"class":514},[451,4245,673],{"class":461},[451,4247,580],{"class":514},[451,4249,650],{"class":968},[451,4251,3776],{"class":626},[451,4253,650],{"class":968},[451,4255,890],{"class":514},[451,4257,1016],{"class":854},[451,4259,715],{"class":514},[451,4261,684],{"class":461},[451,4263,580],{"class":514},[451,4265,819],{"class":854},[451,4267,715],{"class":514},[451,4269,555],{"class":461},[451,4271,1031],{"class":514},[451,4273,1034],{"class":854},[451,4275,715],{"class":514},[451,4277,555],{"class":461},[451,4279,1041],{"class":514},[392,4281,4283],{"id":4282},"testing-scheduled-sources","Testing scheduled sources",[320,4285,4286,4287,4292],{},"The ",[388,4288,4289],{"href":106},[323,4290,4291],{},"TopologyTestDriver"," drives scheduled sources deterministically — no clock waiting. Three controls:",[331,4294,4295,4312,4323],{},[334,4296,4297,4302,4303,4305,4306,558,4308,4311],{},[337,4298,4299],{},[323,4300,4301],{},"triggerScheduledSource(name)"," — fires a source immediately, once, by name. With no ",[323,4304,1081],{},", the auto name is ",[323,4307,1085],{},[323,4309,4310],{},"-1",", … in declaration order.",[334,4313,4314,4319,4320,4322],{},[337,4315,4316],{},[323,4317,4318],{},"advanceWallClockTime(duration)"," — advances the test clock; interval (",[323,4321,357],{},") and cron sources fire for every boundary crossed.",[334,4324,4325,4330,4331,4333,4334,4337],{},[337,4326,4327],{},[323,4328,4329],{},"advanceWatermark(timestamp)"," — advances the event-time watermark; ",[323,4332,353],{}," interval sources fire for each interval crossed. Cron sources do ",[337,4335,4336],{},"not"," fire on watermark advance.",[320,4339,4340,4341,4344,4345,4348,4349,4351,4352,4355,4356,4359,4360,4363,4364,4367],{},"Pass ",[323,4342,4343],{},"initialWallClockTime"," to ",[323,4346,4347],{},"fromBuilder"," to pin the starting instant for cron and wall-clock assertions. In Kotlin it's a named, defaulted parameter. From Java, ",[323,4350,4347],{}," is ",[323,4353,4354],{},"@JvmOverloads"," over ",[323,4357,4358],{},"(builder, config, initialWallClockTime)"," — to set the instant you must also pass the ",[323,4361,4362],{},"StreamsConfig"," (there is no two-argument ",[323,4365,4366],{},"(builder, Instant)"," overload), so construct one explicitly.",[437,4369,4370,4688],{"group":439},[441,4371,4373],{"className":443,"code":4372,"filename":445,"language":446,"meta":447,"style":447},"import io.stoatflow.testutils.TopologyTestDriver\nimport java.time.Instant\n\nval builder = StreamsBuilder()\nbuilder\n    .scheduled\u003CString, String>(\n        interval = Duration.ofSeconds(10),\n        type = PunctuationType.WALL_CLOCK_TIME,\n        emitter = { context -> context.forward(\"key1\", \"tick\") },\n    )\n    .to(\"output\", Produced.with(Serdes.String(), Serdes.String()))\n\nval driver = TopologyTestDriver.fromBuilder(builder, initialWallClockTime = Instant.ofEpochMilli(0L))\ntry {\n    val output = driver.createOutputTopic(\"output\", Serdes.String(), Serdes.String())\n\n    \u002F\u002F Option A: fire once, immediately, by name\n    driver.triggerScheduledSource(\"scheduled-source-0\")\n    output.readRecord()?.key shouldBe \"key1\"\n\n    \u002F\u002F Option B: advance the clock and let the schedule fire\n    driver.advanceWallClockTime(Duration.ofSeconds(10))\n    output.readRecord()?.value shouldBe \"tick\"\n} finally {\n    driver.close()\n}\n",[323,4374,4375,4382,4389,4393,4405,4409,4425,4441,4449,4474,4478,4502,4506,4539,4546,4577,4581,4586,4601,4615,4619,4624,4643,4661,4672,4682],{"__ignoreMap":447},[451,4376,4377,4379],{"class":453,"line":454},[451,4378,458],{"class":457},[451,4380,4381],{"class":461}," io.stoatflow.testutils.TopologyTestDriver\n",[451,4383,4384,4386],{"class":453,"line":465},[451,4385,458],{"class":457},[451,4387,4388],{"class":461}," java.time.Instant\n",[451,4390,4391],{"class":453,"line":473},[451,4392,501],{"emptyLinePlaceholder":500},[451,4394,4395,4397,4399,4401,4403],{"class":453,"line":481},[451,4396,507],{"class":457},[451,4398,511],{"class":510},[451,4400,515],{"class":514},[451,4402,518],{"class":461},[451,4404,521],{"class":510},[451,4406,4407],{"class":453,"line":489},[451,4408,539],{"class":510},[451,4410,4411,4413,4415,4417,4419,4421,4423],{"class":453,"line":497},[451,4412,545],{"class":510},[451,4414,548],{"class":461},[451,4416,551],{"class":510},[451,4418,555],{"class":554},[451,4420,558],{"class":510},[451,4422,555],{"class":554},[451,4424,563],{"class":510},[451,4426,4427,4429,4431,4433,4435,4437,4439],{"class":453,"line":504},[451,4428,569],{"class":510},[451,4430,515],{"class":514},[451,4432,574],{"class":510},[451,4434,577],{"class":461},[451,4436,580],{"class":510},[451,4438,2163],{"class":583},[451,4440,587],{"class":510},[451,4442,4443,4445,4447],{"class":453,"line":524},[451,4444,593],{"class":510},[451,4446,515],{"class":514},[451,4448,598],{"class":510},[451,4450,4451,4453,4455,4457,4459,4461,4463,4465,4468,4470,4472],{"class":453,"line":529},[451,4452,604],{"class":510},[451,4454,515],{"class":514},[451,4456,609],{"class":510},[451,4458,1198],{"class":514},[451,4460,1201],{"class":510},[451,4462,621],{"class":461},[451,4464,580],{"class":510},[451,4466,4467],{"class":626},"\"key1\"",[451,4469,558],{"class":510},[451,4471,3901],{"class":626},[451,4473,1215],{"class":510},[451,4475,4476],{"class":453,"line":536},[451,4477,665],{"class":510},[451,4479,4480,4482,4484,4486,4488,4490,4492,4494,4496,4498,4500],{"class":453,"line":542},[451,4481,545],{"class":510},[451,4483,673],{"class":461},[451,4485,580],{"class":510},[451,4487,3524],{"class":626},[451,4489,681],{"class":510},[451,4491,684],{"class":461},[451,4493,687],{"class":510},[451,4495,555],{"class":461},[451,4497,692],{"class":510},[451,4499,555],{"class":461},[451,4501,697],{"class":510},[451,4503,4504],{"class":453,"line":566},[451,4505,501],{"emptyLinePlaceholder":500},[451,4507,4508,4510,4513,4515,4518,4520,4523,4525,4528,4531,4533,4536],{"class":453,"line":590},[451,4509,507],{"class":457},[451,4511,4512],{"class":510}," driver ",[451,4514,515],{"class":514},[451,4516,4517],{"class":510}," TopologyTestDriver.",[451,4519,4347],{"class":461},[451,4521,4522],{"class":510},"(builder, initialWallClockTime ",[451,4524,515],{"class":514},[451,4526,4527],{"class":510}," Instant.",[451,4529,4530],{"class":461},"ofEpochMilli",[451,4532,580],{"class":510},[451,4534,4535],{"class":583},"0L",[451,4537,4538],{"class":510},"))\n",[451,4540,4541,4544],{"class":453,"line":601},[451,4542,4543],{"class":457},"try",[451,4545,2461],{"class":510},[451,4547,4548,4551,4554,4556,4559,4562,4564,4566,4569,4571,4573,4575],{"class":453,"line":615},[451,4549,4550],{"class":457},"    val",[451,4552,4553],{"class":510}," output ",[451,4555,515],{"class":514},[451,4557,4558],{"class":510}," driver.",[451,4560,4561],{"class":461},"createOutputTopic",[451,4563,580],{"class":510},[451,4565,3524],{"class":626},[451,4567,4568],{"class":510},", Serdes.",[451,4570,555],{"class":461},[451,4572,692],{"class":510},[451,4574,555],{"class":461},[451,4576,2240],{"class":510},[451,4578,4579],{"class":453,"line":656},[451,4580,501],{"emptyLinePlaceholder":500},[451,4582,4583],{"class":453,"line":662},[451,4584,4585],{"class":532},"    \u002F\u002F Option A: fire once, immediately, by name\n",[451,4587,4588,4591,4594,4596,4599],{"class":453,"line":668},[451,4589,4590],{"class":510},"    driver.",[451,4592,4593],{"class":461},"triggerScheduledSource",[451,4595,580],{"class":510},[451,4597,4598],{"class":626},"\"scheduled-source-0\"",[451,4600,653],{"class":510},[451,4602,4603,4606,4609,4612],{"class":453,"line":998},[451,4604,4605],{"class":510},"    output.",[451,4607,4608],{"class":461},"readRecord",[451,4610,4611],{"class":510},"()?.key shouldBe ",[451,4613,4614],{"class":626},"\"key1\"\n",[451,4616,4617],{"class":453,"line":2649},[451,4618,501],{"emptyLinePlaceholder":500},[451,4620,4621],{"class":453,"line":3268},[451,4622,4623],{"class":532},"    \u002F\u002F Option B: advance the clock and let the schedule fire\n",[451,4625,4627,4629,4632,4635,4637,4639,4641],{"class":453,"line":4626},22,[451,4628,4590],{"class":510},[451,4630,4631],{"class":461},"advanceWallClockTime",[451,4633,4634],{"class":510},"(Duration.",[451,4636,577],{"class":461},[451,4638,580],{"class":510},[451,4640,2163],{"class":583},[451,4642,4538],{"class":510},[451,4644,4646,4648,4650,4653,4655,4658],{"class":453,"line":4645},23,[451,4647,4605],{"class":510},[451,4649,4608],{"class":461},[451,4651,4652],{"class":510},"()?.",[451,4654,2857],{"class":885},[451,4656,4657],{"class":510}," shouldBe ",[451,4659,4660],{"class":626},"\"tick\"\n",[451,4662,4664,4667,4670],{"class":453,"line":4663},24,[451,4665,4666],{"class":510},"} ",[451,4668,4669],{"class":457},"finally",[451,4671,2461],{"class":510},[451,4673,4675,4677,4680],{"class":453,"line":4674},25,[451,4676,4590],{"class":510},[451,4678,4679],{"class":461},"close",[451,4681,521],{"class":510},[451,4683,4685],{"class":453,"line":4684},26,[451,4686,4687],{"class":510},"}\n",[441,4689,4691],{"className":700,"code":4690,"filename":702,"language":703,"meta":447,"style":447},"import io.stoatflow.core.config.StreamsConfig;\nimport io.stoatflow.testutils.TopologyTestDriver;\nimport io.stoatflow.testutils.TestOutputTopic;\n\nimport java.time.Duration;\nimport java.time.Instant;\n\nStreamsBuilder builder = new StreamsBuilder();\nbuilder\n    .\u003CString, String>scheduled(\n        null,\n        Duration.ofSeconds(10),\n        PunctuationType.WALL_CLOCK_TIME,\n        null,\n        context -> context.forward(\"key1\", \"tick\"))\n    .to(\"output\", Produced.with(Serdes.String(), Serdes.String()));\n\n\u002F\u002F fromBuilder is @JvmOverloads over (builder, config, initialWallClockTime);\n\u002F\u002F pass the config explicitly to set the starting instant from Java.\nStreamsConfig config = StreamsConfig.builder(\"test-app\", \"localhost:9092\").build();\nTopologyTestDriver driver =\n    TopologyTestDriver.fromBuilder(builder, config, Instant.ofEpochMilli(0L));\ntry {\n    TestOutputTopic\u003CString, String> output =\n        driver.createOutputTopic(\"output\", Serdes.String(), Serdes.String());\n\n    \u002F\u002F Option A: fire once, immediately, by name\n    driver.triggerScheduledSource(\"scheduled-source-0\");\n\n    \u002F\u002F Option B: advance the clock and let the schedule fire\n    driver.advanceWallClockTime(Duration.ofSeconds(10));\n} finally {\n    driver.close();\n}\n",[323,4692,4693,4718,4739,4760,4764,4780,4797,4801,4815,4819,4837,4843,4857,4867,4873,4904,4944,4948,4953,4958,5000,5009,5041,5047,5067,5102,5106,5111,5131,5136,5141,5164,5174,5185],{"__ignoreMap":447},[451,4694,4695,4697,4699,4701,4703,4705,4707,4709,4712,4714,4716],{"class":453,"line":454},[451,4696,458],{"class":457},[451,4698,712],{"class":510},[451,4700,715],{"class":514},[451,4702,718],{"class":510},[451,4704,715],{"class":514},[451,4706,723],{"class":510},[451,4708,715],{"class":514},[451,4710,4711],{"class":510},"config",[451,4713,715],{"class":514},[451,4715,4362],{"class":510},[451,4717,736],{"class":514},[451,4719,4720,4722,4724,4726,4728,4730,4733,4735,4737],{"class":453,"line":465},[451,4721,458],{"class":457},[451,4723,712],{"class":510},[451,4725,715],{"class":514},[451,4727,718],{"class":510},[451,4729,715],{"class":514},[451,4731,4732],{"class":510},"testutils",[451,4734,715],{"class":514},[451,4736,4291],{"class":510},[451,4738,736],{"class":514},[451,4740,4741,4743,4745,4747,4749,4751,4753,4755,4758],{"class":453,"line":473},[451,4742,458],{"class":457},[451,4744,712],{"class":510},[451,4746,715],{"class":514},[451,4748,718],{"class":510},[451,4750,715],{"class":514},[451,4752,4732],{"class":510},[451,4754,715],{"class":514},[451,4756,4757],{"class":510},"TestOutputTopic",[451,4759,736],{"class":514},[451,4761,4762],{"class":453,"line":481},[451,4763,501],{"emptyLinePlaceholder":500},[451,4765,4766,4768,4770,4772,4774,4776,4778],{"class":453,"line":489},[451,4767,458],{"class":457},[451,4769,832],{"class":510},[451,4771,715],{"class":514},[451,4773,837],{"class":510},[451,4775,715],{"class":514},[451,4777,401],{"class":510},[451,4779,736],{"class":514},[451,4781,4782,4784,4786,4788,4790,4792,4795],{"class":453,"line":497},[451,4783,458],{"class":457},[451,4785,832],{"class":510},[451,4787,715],{"class":514},[451,4789,837],{"class":510},[451,4791,715],{"class":514},[451,4793,4794],{"class":510},"Instant",[451,4796,736],{"class":514},[451,4798,4799],{"class":453,"line":504},[451,4800,501],{"emptyLinePlaceholder":500},[451,4802,4803,4805,4807,4809,4811,4813],{"class":453,"line":524},[451,4804,785],{"class":510},[451,4806,855],{"class":854},[451,4808,858],{"class":514},[451,4810,861],{"class":457},[451,4812,518],{"class":461},[451,4814,866],{"class":514},[451,4816,4817],{"class":453,"line":529},[451,4818,539],{"class":510},[451,4820,4821,4823,4825,4827,4829,4831,4833,4835],{"class":453,"line":536},[451,4822,545],{"class":514},[451,4824,551],{"class":885},[451,4826,555],{"class":510},[451,4828,890],{"class":514},[451,4830,893],{"class":510},[451,4832,896],{"class":885},[451,4834,548],{"class":461},[451,4836,901],{"class":514},[451,4838,4839,4841],{"class":453,"line":542},[451,4840,906],{"class":457},[451,4842,938],{"class":514},[451,4844,4845,4847,4849,4851,4853,4855],{"class":453,"line":566},[451,4846,916],{"class":854},[451,4848,715],{"class":514},[451,4850,577],{"class":461},[451,4852,580],{"class":514},[451,4854,2163],{"class":583},[451,4856,587],{"class":514},[451,4858,4859,4861,4863,4865],{"class":453,"line":590},[451,4860,931],{"class":854},[451,4862,715],{"class":514},[451,4864,357],{"class":854},[451,4866,938],{"class":514},[451,4868,4869,4871],{"class":453,"line":601},[451,4870,906],{"class":457},[451,4872,938],{"class":514},[451,4874,4875,4877,4879,4881,4883,4885,4887,4889,4892,4894,4896,4898,4900,4902],{"class":453,"line":615},[451,4876,952],{"class":510},[451,4878,1198],{"class":514},[451,4880,989],{"class":854},[451,4882,715],{"class":514},[451,4884,621],{"class":461},[451,4886,580],{"class":514},[451,4888,650],{"class":968},[451,4890,4891],{"class":626},"key1",[451,4893,650],{"class":968},[451,4895,890],{"class":514},[451,4897,978],{"class":968},[451,4899,4150],{"class":626},[451,4901,650],{"class":968},[451,4903,4538],{"class":514},[451,4905,4906,4908,4910,4912,4914,4916,4918,4920,4922,4924,4926,4928,4930,4932,4934,4936,4938,4940,4942],{"class":453,"line":656},[451,4907,545],{"class":514},[451,4909,673],{"class":461},[451,4911,580],{"class":514},[451,4913,650],{"class":968},[451,4915,3776],{"class":626},[451,4917,650],{"class":968},[451,4919,890],{"class":514},[451,4921,1016],{"class":854},[451,4923,715],{"class":514},[451,4925,684],{"class":461},[451,4927,580],{"class":514},[451,4929,819],{"class":854},[451,4931,715],{"class":514},[451,4933,555],{"class":461},[451,4935,1031],{"class":514},[451,4937,1034],{"class":854},[451,4939,715],{"class":514},[451,4941,555],{"class":461},[451,4943,1041],{"class":514},[451,4945,4946],{"class":453,"line":662},[451,4947,501],{"emptyLinePlaceholder":500},[451,4949,4950],{"class":453,"line":668},[451,4951,4952],{"class":532},"\u002F\u002F fromBuilder is @JvmOverloads over (builder, config, initialWallClockTime);\n",[451,4954,4955],{"class":453,"line":998},[451,4956,4957],{"class":532},"\u002F\u002F pass the config explicitly to set the starting instant from Java.\n",[451,4959,4960,4962,4965,4967,4970,4972,4974,4976,4978,4981,4983,4985,4987,4990,4992,4995,4998],{"class":453,"line":2649},[451,4961,4362],{"class":510},[451,4963,4964],{"class":854}," config",[451,4966,858],{"class":514},[451,4968,4969],{"class":854}," StreamsConfig",[451,4971,715],{"class":514},[451,4973,1301],{"class":461},[451,4975,580],{"class":514},[451,4977,650],{"class":968},[451,4979,4980],{"class":626},"test-app",[451,4982,650],{"class":968},[451,4984,890],{"class":514},[451,4986,978],{"class":968},[451,4988,4989],{"class":626},"localhost:9092",[451,4991,650],{"class":968},[451,4993,4994],{"class":514},").",[451,4996,4997],{"class":461},"build",[451,4999,866],{"class":514},[451,5001,5002,5004,5007],{"class":453,"line":3268},[451,5003,4291],{"class":510},[451,5005,5006],{"class":854}," driver",[451,5008,4174],{"class":514},[451,5010,5011,5014,5016,5018,5020,5022,5024,5026,5028,5031,5033,5035,5037,5039],{"class":453,"line":4626},[451,5012,5013],{"class":854},"    TopologyTestDriver",[451,5015,715],{"class":514},[451,5017,4347],{"class":461},[451,5019,580],{"class":514},[451,5021,1301],{"class":510},[451,5023,890],{"class":514},[451,5025,4964],{"class":510},[451,5027,890],{"class":514},[451,5029,5030],{"class":854}," Instant",[451,5032,715],{"class":514},[451,5034,4530],{"class":461},[451,5036,580],{"class":514},[451,5038,4535],{"class":583},[451,5040,1407],{"class":514},[451,5042,5043,5045],{"class":453,"line":4645},[451,5044,4543],{"class":457},[451,5046,2461],{"class":514},[451,5048,5049,5052,5054,5056,5058,5060,5062,5065],{"class":453,"line":4663},[451,5050,5051],{"class":510},"    TestOutputTopic",[451,5053,551],{"class":514},[451,5055,555],{"class":885},[451,5057,890],{"class":514},[451,5059,893],{"class":885},[451,5061,896],{"class":514},[451,5063,5064],{"class":854}," output",[451,5066,4174],{"class":514},[451,5068,5069,5072,5074,5076,5078,5080,5082,5084,5086,5088,5090,5092,5094,5096,5098,5100],{"class":453,"line":4674},[451,5070,5071],{"class":854},"        driver",[451,5073,715],{"class":514},[451,5075,4561],{"class":461},[451,5077,580],{"class":514},[451,5079,650],{"class":968},[451,5081,3776],{"class":626},[451,5083,650],{"class":968},[451,5085,890],{"class":514},[451,5087,1034],{"class":854},[451,5089,715],{"class":514},[451,5091,555],{"class":461},[451,5093,1031],{"class":514},[451,5095,1034],{"class":854},[451,5097,715],{"class":514},[451,5099,555],{"class":461},[451,5101,2540],{"class":514},[451,5103,5104],{"class":453,"line":4684},[451,5105,501],{"emptyLinePlaceholder":500},[451,5107,5109],{"class":453,"line":5108},27,[451,5110,4585],{"class":532},[451,5112,5114,5117,5119,5121,5123,5125,5127,5129],{"class":453,"line":5113},28,[451,5115,5116],{"class":854},"    driver",[451,5118,715],{"class":514},[451,5120,4593],{"class":461},[451,5122,580],{"class":514},[451,5124,650],{"class":968},[451,5126,1085],{"class":626},[451,5128,650],{"class":968},[451,5130,2495],{"class":514},[451,5132,5134],{"class":453,"line":5133},29,[451,5135,501],{"emptyLinePlaceholder":500},[451,5137,5139],{"class":453,"line":5138},30,[451,5140,4623],{"class":532},[451,5142,5144,5146,5148,5150,5152,5154,5156,5158,5160,5162],{"class":453,"line":5143},31,[451,5145,5116],{"class":854},[451,5147,715],{"class":514},[451,5149,4631],{"class":461},[451,5151,580],{"class":514},[451,5153,401],{"class":854},[451,5155,715],{"class":514},[451,5157,577],{"class":461},[451,5159,580],{"class":514},[451,5161,2163],{"class":583},[451,5163,1407],{"class":514},[451,5165,5167,5169,5172],{"class":453,"line":5166},32,[451,5168,647],{"class":514},[451,5170,5171],{"class":457}," finally",[451,5173,2461],{"class":514},[451,5175,5177,5179,5181,5183],{"class":453,"line":5176},33,[451,5178,5116],{"class":854},[451,5180,715],{"class":514},[451,5182,4679],{"class":461},[451,5184,866],{"class":514},[451,5186,5188],{"class":453,"line":5187},34,[451,5189,4687],{"class":514},[392,5191,5193],{"id":5192},"execution-semantics","Execution semantics",[320,5195,5196],{},"A few behaviours worth knowing when you write an emitter:",[331,5198,5199,5205,5217,5228],{},[334,5200,5201,5204],{},[337,5202,5203],{},"One run at a time."," Each scheduled source uses locked-run semantics: if a previous invocation is still running when the next fire is due, the new fire is skipped rather than overlapped. Keep emitters reasonably quick, or expect skipped ticks under load.",[334,5206,5207,5210,5211,5213,5214,715],{},[337,5208,5209],{},"Records flow through the engine like any source."," Emitted records participate in the same exactly-once commit boundaries as Kafka-sourced records — see ",[388,5212,52],{"href":53}," and the ",[388,5215,5216],{"href":48},"architecture overview",[334,5218,5219,5222,5223,5227],{},[337,5220,5221],{},"State access is read-only."," Use a scheduled source to ",[5224,5225,5226],"em",{},"observe"," state and emit derived events; mutate state from the processors that handle those events, not from the emitter.",[334,5229,5230,5235,5236,5238,5239,5241],{},[337,5231,5232,5234],{},[323,5233,353],{}," is data-driven."," A ",[323,5237,353],{}," source only fires as the watermark advances, so it won't fire at all when no records are flowing. Choose ",[323,5240,357],{}," or a cron schedule when you need firing independent of throughput.",[392,5243,5245],{"id":5244},"see-also","See also",[331,5247,5248,5256,5268,5274,5283],{},[334,5249,5250,5252,5253,5255],{},[388,5251,92],{"href":111}," — ",[323,5254,785],{}," entry points and operator naming.",[334,5257,5258,5261,5262,5264,5265,5267],{},[388,5259,5260],{"href":68},"Event time & watermarks"," — what ",[323,5263,353],{}," vs ",[323,5266,357],{}," mean.",[334,5269,5270,5273],{},[388,5271,5272],{"href":136},"Processor API"," — punctuators and timers, the per-record analogue of scheduled sources.",[334,5275,5276,5279,5280,5282],{},[388,5277,5278],{"href":106},"Testing"," — the full ",[323,5281,4291],{}," reference.",[334,5284,5285,5287],{},[388,5286,301],{"href":302}," — where scheduled sources sit relative to the Kafka Streams DSL.",[5289,5290,5291],"style",{},"html pre.shiki code .sbBg2, html code.shiki .sbBg2{--shiki-default:#1E754F}html pre.shiki code .sySUi, html code.shiki .sySUi{--shiki-default:#59873A}html pre.shiki code .suHK_, html code.shiki .suHK_{--shiki-default:#393A34}html pre.shiki code .sYZai, html code.shiki .sYZai{--shiki-default:#999999}html pre.shiki code .s8zF2, html code.shiki .s8zF2{--shiki-default:#A0ADA0}html pre.shiki code .sUxyF, html code.shiki .sUxyF{--shiki-default:#2E8F82}html pre.shiki code .s-TwI, html code.shiki .s-TwI{--shiki-default:#2F798A}html pre.shiki code .spphp, html code.shiki .spphp{--shiki-default:#B56959}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 .svycV, html code.shiki .svycV{--shiki-default:#B07D48}html pre.shiki code .si04Y, html code.shiki .si04Y{--shiki-default:#AB5959}html pre.shiki code .sSP4y, html code.shiki .sSP4y{--shiki-default:#B5695977}",{"title":447,"searchDepth":465,"depth":465,"links":5293},[5294,5297,5300,5304,5305,5306,5307],{"id":394,"depth":465,"text":395,"children":5295},[5296],{"id":1072,"depth":473,"text":1073},{"id":1410,"depth":465,"text":1411,"children":5298},[5299],{"id":1869,"depth":473,"text":1870},{"id":2021,"depth":465,"text":2022,"children":5301},[5302,5303],{"id":2035,"depth":473,"text":2036},{"id":2655,"depth":473,"text":2656},{"id":3333,"depth":465,"text":3334},{"id":4282,"depth":465,"text":4283},{"id":5192,"depth":465,"text":5193},{"id":5244,"depth":465,"text":5245},"Generate records on an interval or a cron schedule with StreamsBuilder.scheduled() — a topology source that emits without consuming from Kafka.","md",{},{"icon":143},"how-to",{"title":140,"description":5308},"NGo7XrT9qwdYvt-vTLSlpnfk_TmbP1xyqFmalBUodOg",[5316,5318],{"title":135,"path":136,"stem":137,"description":5317,"icon":138,"children":-1},"Write custom record-by-record logic with Processor and FixedKeyProcessor — forward, access state, schedule punctuators, and register key-based timers.",{"title":145,"path":146,"stem":147,"description":5319,"icon":148,"children":-1},"Configure default and per-operator serdes, use the built-in Serdes, write custom serdes, serialize windowed keys, and wire up Avro with Confluent Schema Registry.",1783713359596]