<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Documentation on KioMQ</title><link>http://kiomq.dev/docs/</link><description>Recent content in Documentation on KioMQ</description><generator>Hugo</generator><language>en-US</language><atom:link href="http://kiomq.dev/docs/index.xml" rel="self" type="application/rss+xml"/><item><title>Getting started</title><link>http://kiomq.dev/docs/getting-started/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://kiomq.dev/docs/getting-started/</guid><description>&lt;h2 id="requirements"&gt;Requirements&lt;a class="heading-anchor" href="#requirements" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rust 2024 edition&lt;/strong&gt; (the crate is built with &lt;code&gt;edition = &amp;quot;2024&amp;quot;&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Tokio multi-thread runtime&lt;/strong&gt;. Workers spawn tasks and, for sync processors, blocking threads.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Redis&lt;/strong&gt; only if you use the &lt;code&gt;redis-store&lt;/code&gt; backend.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation"&gt;Installation&lt;a class="heading-anchor" href="#installation" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo add kiomq
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Or add it by hand:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;kiomq&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.2.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;tokio&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;features&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;rt-multi-thread&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;macros&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="cargo-features"&gt;Cargo features&lt;a class="heading-anchor" href="#cargo-features" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Feature&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;What it enables&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;redis-store&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;RedisStore&lt;/code&gt;, &lt;code&gt;SharedRedis&lt;/code&gt;, &lt;code&gt;Config&lt;/code&gt; — durable, distributed queues&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;tracing&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
					&lt;td&gt;Emits &lt;a href="https://docs.rs/tracing" target="_blank" rel="noopener"&gt;&lt;code&gt;tracing&lt;/code&gt;&lt;/a&gt;
 spans and events from the internals&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;InMemoryStore&lt;/code&gt; is always available, with no feature flag and no external services.&lt;/p&gt;</description></item><item><title>Quick start</title><link>http://kiomq.dev/docs/quick-start/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://kiomq.dev/docs/quick-start/</guid><description>&lt;h2 id="async-worker"&gt;Async worker&lt;a class="heading-anchor" href="#async-worker" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The processor is a closure that receives an &lt;code&gt;Arc&amp;lt;Store&amp;gt;&lt;/code&gt; and a &lt;code&gt;Job&lt;/code&gt;, and returns
&lt;code&gt;Result&amp;lt;R, KioError&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;::&lt;span class="n"&gt;sync&lt;/span&gt;::&lt;span class="n"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kiomq&lt;/span&gt;::&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;InMemoryStore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Job&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;KioError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Queue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Worker&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;WorkerOpts&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#[tokio::main]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt; &lt;span class="nc"&gt;kiomq&lt;/span&gt;::&lt;span class="n"&gt;KioResult&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;store&lt;/span&gt;: &lt;span class="nc"&gt;InMemoryStore&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;InMemoryStore&lt;/span&gt;::&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;demo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Queue&lt;/span&gt;::&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;_store&lt;/span&gt;: &lt;span class="nc"&gt;Arc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;: &lt;span class="nc"&gt;Job&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;move&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Ok&lt;/span&gt;::&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;KioError&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unwrap_or_default&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Worker&lt;/span&gt;::&lt;span class="n"&gt;new_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WorkerOpts&lt;/span&gt;::&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bulk_add_only&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="k"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="fm"&gt;format!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;job-&lt;/span&gt;&lt;span class="si"&gt;{i}&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;updating_metrics&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current_metrics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clone&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// wait for all jobs to complete
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;updating_metrics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all_jobs_completed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tokio&lt;/span&gt;::&lt;span class="n"&gt;task&lt;/span&gt;::&lt;span class="n"&gt;yield_now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(())&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What each step does:&lt;/p&gt;</description></item><item><title>Core concepts</title><link>http://kiomq.dev/docs/core-concepts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://kiomq.dev/docs/core-concepts/</guid><description>&lt;h2 id="job-states"&gt;Job states&lt;a class="heading-anchor" href="#job-states" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Every job is in exactly one state at a time. &lt;code&gt;JobState&lt;/code&gt; also doubles as the event key you subscribe
to — see &lt;a href="../events/"&gt;Events&lt;/a&gt;
.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;State&lt;/th&gt;
					&lt;th&gt;Meaning&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Wait&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Ready to be picked up by a worker. The default.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Prioritized&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;In the priority sorted-set, waiting to be moved to active.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Delayed&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Scheduled to run at a future timestamp.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Active&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Currently being processed by a worker.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Processing&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;A worker has started executing the processor function.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Stalled&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;The worker holding the lock disappeared; pending recovery.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Completed&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;The processor returned &lt;code&gt;Ok&lt;/code&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Failed&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;The processor returned &lt;code&gt;Err&lt;/code&gt;, panicked, or stalled too many times.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Paused&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;The queue is paused; the job waits in the paused list.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Resumed&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;The queue resumed; the job is transitioning back to &lt;code&gt;Wait&lt;/code&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Progress&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;A progress-update event — not a persistent state.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Obliterated&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;The queue was obliterated and the job was deleted.&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The happy path is &lt;code&gt;Wait → Active → Completed&lt;/code&gt;. A prioritised job starts in &lt;code&gt;Prioritized&lt;/code&gt;; a delayed
or cron job starts in &lt;code&gt;Delayed&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Configuration</title><link>http://kiomq.dev/docs/configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://kiomq.dev/docs/configuration/</guid><description>&lt;p&gt;Options are layered: &lt;code&gt;QueueOpts&lt;/code&gt; sets the defaults for the whole queue, &lt;code&gt;JobOptions&lt;/code&gt; overrides them
per job, and &lt;code&gt;WorkerOpts&lt;/code&gt; tunes the process that consumes them.&lt;/p&gt;
&lt;h2 id="queue-options"&gt;Queue options&lt;a class="heading-anchor" href="#queue-options" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;QueueOpts&lt;/code&gt; is passed to &lt;code&gt;Queue::new&lt;/code&gt; and applies to every job that does not override it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kiomq&lt;/span&gt;::&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BackOffJobOptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BackOffOptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;KeepJobs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;QueueEventMode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;QueueOpts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RemoveOnCompletionOrFailure&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;queue_opts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;QueueOpts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;attempts&lt;/span&gt;: &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;default_backoff&lt;/span&gt;: &lt;span class="nb"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BackOffJobOptions&lt;/span&gt;::&lt;span class="n"&gt;Opts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BackOffOptions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;type_&lt;/span&gt;: &lt;span class="nb"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;exponential&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;into&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;delay&lt;/span&gt;: &lt;span class="nb"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;})),&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remove_on_fail&lt;/span&gt;: &lt;span class="nb"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RemoveOnCompletionOrFailure&lt;/span&gt;::&lt;span class="n"&gt;Opts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KeepJobs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;: &lt;span class="nb"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// keep for 1 hour
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;: &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;})),&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;event_mode&lt;/span&gt;: &lt;span class="nb"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;QueueEventMode&lt;/span&gt;::&lt;span class="n"&gt;PubSub&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="nb"&gt;Default&lt;/span&gt;::&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Queue&lt;/span&gt;::&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue_opts&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Field&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Notes&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;attempts&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;u64&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Default attempt limit for jobs that don&amp;rsquo;t set their own&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;default_backoff&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Option&amp;lt;BackOffJobOptions&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;None&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Retry delay strategy for the whole queue&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;remove_on_complete&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Option&amp;lt;RemoveOnCompletionOrFailure&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;None&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Retention for completed jobs; &lt;code&gt;None&lt;/code&gt; keeps them&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;remove_on_fail&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Option&amp;lt;RemoveOnCompletionOrFailure&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;None&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Retention for permanently failed jobs&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;event_mode&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Option&amp;lt;QueueEventMode&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Stream&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Stream (replayable) or pub/sub (broadcast-only) delivery&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;repeat&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Option&amp;lt;Repeat&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;None&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Default repeat policy for every job on the queue&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="job-options"&gt;Job options&lt;a class="heading-anchor" href="#job-options" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;JobOptions&lt;/code&gt; is the third argument to &lt;code&gt;add_job&lt;/code&gt;, and the second element of each &lt;code&gt;bulk_add&lt;/code&gt; tuple.
Anything left at its default falls back to the queue.&lt;/p&gt;</description></item><item><title>Scheduling &amp; priorities</title><link>http://kiomq.dev/docs/scheduling/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://kiomq.dev/docs/scheduling/</guid><description>&lt;h2 id="priorities"&gt;Priorities&lt;a class="heading-anchor" href="#priorities" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;priority&lt;/code&gt; is a score where &lt;strong&gt;lower runs first&lt;/strong&gt;, and &lt;code&gt;0&lt;/code&gt; means &amp;ldquo;no priority&amp;rdquo; — the job takes the
ordinary &lt;code&gt;Wait&lt;/code&gt; path.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kiomq&lt;/span&gt;::&lt;span class="n"&gt;JobOptions&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;urgent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JobOptions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;priority&lt;/span&gt;: &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="nb"&gt;Default&lt;/span&gt;::&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ordinary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JobOptions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;priority&lt;/span&gt;: &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="nb"&gt;Default&lt;/span&gt;::&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_job&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;password-reset&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;urgent&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_job&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;weekly-digest&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ordinary&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Prioritised jobs live in a sorted set and move to &lt;code&gt;Active&lt;/code&gt; ahead of the plain wait list.&lt;/p&gt;</description></item><item><title>Errors &amp; retries</title><link>http://kiomq.dev/docs/errors-and-retries/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://kiomq.dev/docs/errors-and-retries/</guid><description>&lt;h2 id="signalling-failure"&gt;Signalling failure&lt;a class="heading-anchor" href="#signalling-failure" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;A processor reports failure by &lt;strong&gt;returning &lt;code&gt;Err&lt;/code&gt;&lt;/strong&gt;. The worker catches it, records the reason, and
either schedules a retry or moves the job to &lt;code&gt;Failed&lt;/code&gt; depending on the attempt limit.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;::&lt;span class="n"&gt;sync&lt;/span&gt;::&lt;span class="n"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kiomq&lt;/span&gt;::&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Job&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;KioError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Store&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;store&lt;/span&gt;: &lt;span class="nc"&gt;Arc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;impl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Store&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Invoice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Receipt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;: &lt;span class="nc"&gt;Job&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Invoice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Receipt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Receipt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;KioError&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;invoice&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ok_or_else&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;::&lt;span class="n"&gt;io&lt;/span&gt;::&lt;span class="n"&gt;Error&lt;/span&gt;::&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;::&lt;span class="n"&gt;io&lt;/span&gt;::&lt;span class="n"&gt;ErrorKind&lt;/span&gt;::&lt;span class="n"&gt;InvalidData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;missing payload&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Any error that converts into KioError works — including io::Error.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;receipt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;billing&lt;/span&gt;::&lt;span class="n"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;invoice&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;receipt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;KioError&lt;/code&gt; has &lt;code&gt;From&lt;/code&gt; conversions for &lt;code&gt;io::Error&lt;/code&gt;, &lt;code&gt;ParseIntError&lt;/code&gt;, &lt;code&gt;SystemTimeError&lt;/code&gt;, JSON and Redis
errors, so &lt;code&gt;?&lt;/code&gt; usually just works. For anything else, box it into &lt;code&gt;GeneralError&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Events &amp; observability</title><link>http://kiomq.dev/docs/events/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://kiomq.dev/docs/events/</guid><description>&lt;h2 id="subscribing"&gt;Subscribing&lt;a class="heading-anchor" href="#subscribing" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Queue::on&lt;/code&gt; listens to a single state; &lt;code&gt;Queue::on_all_events&lt;/code&gt; listens to everything. Both return a
&lt;code&gt;Uuid&lt;/code&gt; you can use to detach the listener later.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kiomq&lt;/span&gt;::&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;EventParameters&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JobState&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// One state.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;listener_id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JobState&lt;/span&gt;::&lt;span class="n"&gt;Completed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;move&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;EventParameters&lt;/span&gt;::&lt;span class="n"&gt;Completed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;job_metrics&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tracing&lt;/span&gt;::&lt;span class="fm"&gt;info!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;job_metrics&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;completed&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Everything. The type parameters are &amp;lt;R, P&amp;gt; — the processor&amp;#39;s return type
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// and the progress type.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;all_id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;on_all_events&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;: &lt;span class="nc"&gt;EventParameters&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;u8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;move&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tracing&lt;/span&gt;::&lt;span class="fm"&gt;debug!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;queue event&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Detach when you no longer care.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove_event_listener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;listener_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove_event_listener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Callbacks are async: they return a future, which the queue drives. Keep them short — a slow listener
delays event delivery, so hand heavy work off to a spawned task.&lt;/p&gt;</description></item><item><title>Progress updates</title><link>http://kiomq.dev/docs/progress/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://kiomq.dev/docs/progress/</guid><description>&lt;h2 id="reporting-progress"&gt;Reporting progress&lt;a class="heading-anchor" href="#reporting-progress" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The third generic parameter of &lt;code&gt;Job&amp;lt;D, R, P&amp;gt;&lt;/code&gt; is the &lt;strong&gt;progress type&lt;/strong&gt;. It can be anything
serialisable: a percentage, a struct, an enum of named phases.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;::&lt;span class="n"&gt;sync&lt;/span&gt;::&lt;span class="n"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kiomq&lt;/span&gt;::&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Job&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;KioError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Store&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;processor&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;: &lt;span class="nc"&gt;Store&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;u8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;store&lt;/span&gt;: &lt;span class="nc"&gt;Arc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;: &lt;span class="nc"&gt;Job&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;u8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;KioError&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// update_progress persists to the store and emits a progress event.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update_progress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="k"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;as_ref&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 50% done
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unwrap_or_default&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Two things to note: the job must be &lt;strong&gt;&lt;code&gt;mut&lt;/code&gt;&lt;/strong&gt;, and the store handed to your processor is exactly what
&lt;code&gt;update_progress&lt;/code&gt; needs — pass it as &lt;code&gt;store.as_ref()&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Process &amp; worker metrics</title><link>http://kiomq.dev/docs/metrics/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://kiomq.dev/docs/metrics/</guid><description>&lt;p&gt;KioMQ collects three kinds of metrics in the background. Queue counters are in-memory and free to
read; process and worker metrics are published to the store with a TTL and refreshed by the queue&amp;rsquo;s
timer subsystem.&lt;/p&gt;
&lt;h2 id="queue-counters"&gt;Queue counters&lt;a class="heading-anchor" href="#queue-counters" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;queue.current_metrics&lt;/code&gt; is a cheap, always-live handle. The counters are refreshed from the store
whenever &lt;code&gt;get_metrics()&lt;/code&gt; is called, so between calls they may be slightly stale — prefer the helper
methods over reading raw fields.&lt;/p&gt;</description></item><item><title>Backends</title><link>http://kiomq.dev/docs/backends/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://kiomq.dev/docs/backends/</guid><description>&lt;p&gt;Every store implements the same &lt;code&gt;Store&amp;lt;D, R, P&amp;gt;&lt;/code&gt; trait, so switching backends is a change to two
lines of setup and nothing else.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Store&lt;/th&gt;
					&lt;th&gt;Feature flag&lt;/th&gt;
					&lt;th&gt;Durable&lt;/th&gt;
					&lt;th&gt;Multi-process&lt;/th&gt;
					&lt;th&gt;Best for&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;InMemoryStore&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;always available&lt;/td&gt;
					&lt;td&gt;No&lt;/td&gt;
					&lt;td&gt;No&lt;/td&gt;
					&lt;td&gt;Tests, dev loops, short-lived in-process work&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;RedisStore&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;redis-store&lt;/code&gt; &lt;em&gt;(default)&lt;/em&gt;&lt;/td&gt;
					&lt;td&gt;Yes&lt;/td&gt;
					&lt;td&gt;Yes&lt;/td&gt;
					&lt;td&gt;Production fleets spread across machines&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="in-memory"&gt;In-memory&lt;a class="heading-anchor" href="#in-memory" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Ideal for tests, development, and short-lived tasks. No external dependencies, no serialisation
round-trip.&lt;/p&gt;</description></item><item><title>Changelog</title><link>http://kiomq.dev/docs/changelog/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://kiomq.dev/docs/changelog/</guid><description>&lt;p&gt;Releases follow &lt;a href="https://semver.org" target="_blank" rel="noopener"&gt;semantic versioning&lt;/a&gt;
. Entries are grouped by type — features,
bug fixes, chores — and each links to the commit it came from. Versions are published to
&lt;a href="https://crates.io/crates/kiomq" target="_blank" rel="noopener"&gt;crates.io&lt;/a&gt;
, and the matching API docs are on
&lt;a href="https://docs.rs/kiomq" target="_blank" rel="noopener"&gt;docs.rs&lt;/a&gt;
.&lt;/p&gt;

 &lt;nav class="release-index" aria-label="Releases"&gt;
 &lt;a href="#v021"&gt;v0.2.1&lt;/a&gt;
 &lt;a href="#v020"&gt;v0.2.0&lt;/a&gt;
 &lt;a href="#v013"&gt;v0.1.3&lt;/a&gt;
 &lt;a href="#v012"&gt;v0.1.2&lt;/a&gt;
 &lt;a href="#v011"&gt;v0.1.1&lt;/a&gt;
 &lt;a href="#v010"&gt;v0.1.0&lt;/a&gt;
 &lt;/nav&gt;
 &lt;section class="release" id="v021"&gt;
 &lt;div class="release__head"&gt;
 &lt;h2&gt;
 &lt;a href="#v021"&gt;v0.2.1&lt;/a&gt;
 &lt;/h2&gt;&lt;span class="release__tag"&gt;Latest&lt;/span&gt;
 &lt;span class="release__date"&gt;5 July 2026&lt;/span&gt;
 &lt;a class="release__compare" href="https://github.com/KioHQ/kiomq/releases/tag/v0.2.1" target="_blank" rel="noopener"&gt;
 release notes ↗
 &lt;/a&gt;
 &lt;/div&gt;
 &lt;div class="release__body"&gt;
 &lt;h3 id="bug-fixes"&gt;Bug Fixes&lt;a class="heading-anchor" href="#bug-fixes" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;when using sysinfo, refresh all processes by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/af127a9a61fdf0906111714016319e4b9d8dd2af" target="_blank" rel="noopener"&gt;af127a9&lt;/a&gt;
 &lt;em&gt;(process_tree_tracker)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;update existing metrics entrics instead of adding new ones if they&amp;rsquo;are expired by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/5b6716ecab644080c53d69de571ecec2ab9af4dd" target="_blank" rel="noopener"&gt;5b6716e&lt;/a&gt;
 &lt;em&gt;(inmemory-store)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;metrics::is_idle shouldn&amp;rsquo;t include last_id check by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/817d36b05586d25c8cc6ec7a4a303587aeb22998" target="_blank" rel="noopener"&gt;817d36b&lt;/a&gt;
 &lt;em&gt;(queue_metrics)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;fix logic bug in pause_or_resume_workers by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/8102a9041b8c0f7fe8e123b93aadc9fff7b0fdc9" target="_blank" rel="noopener"&gt;8102a90&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;considered timed out runs during the test for processing delayed jobs by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/8a5171b56ce02eabc3ac8103dcaa5a9daf9dcd75" target="_blank" rel="noopener"&gt;8a5171b&lt;/a&gt;
 &lt;em&gt;(worker_tests)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="chores"&gt;Chores&lt;a class="heading-anchor" href="#chores" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;remove unnecessary block_in_place call in the &lt;code&gt;RedisStore.update_job_progress_sync&lt;/code&gt; method. by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/d46e2daae115647b9167028ee73c0e2e9e64f7c7" target="_blank" rel="noopener"&gt;d46e2da&lt;/a&gt;
 &lt;em&gt;(redis-store)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;add sysinfo and heapster as dependancy for collecting Node/Process telemtry by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/6a45bfeb8755155494bab3accb514e19719a44ef" target="_blank" rel="noopener"&gt;6a45bfe&lt;/a&gt;
 &lt;em&gt;(deps)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;enable the parking_lot features for tokio by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/44aa07aacb1c54c3bdace0033c9e4da86c5a8ff8" target="_blank" rel="noopener"&gt;44aa07a&lt;/a&gt;
 &lt;em&gt;(deps)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;public expose snapshots of process monitoring essentials(metrics &amp;amp; consts) by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/6b3630114b042252dff9f617d9d477c75fe01a9f" target="_blank" rel="noopener"&gt;6b36301&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;expose process-metrics store and fetch methods via the &lt;code&gt;Queue&lt;/code&gt; instance by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/2cacd74656361bfaf2cd3dd40c895143674b2949" target="_blank" rel="noopener"&gt;2cacd74&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;run all timers in one task globally by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/5afacdbb5cc4759423b96c53e56a3534a8e61fbf" target="_blank" rel="noopener"&gt;5afacdb&lt;/a&gt;
 &lt;em&gt;(timers)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;use flume as the channel instead of tokio::mspc by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/d660cab67bba7b3ac9ec39b301707644b5701a26" target="_blank" rel="noopener"&gt;d660cab&lt;/a&gt;
 &lt;em&gt;(deps)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;reduce Worker_state_ttl to 100 seconds by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/da7c0dfa87d0b30fc39236d2dd0292a7627191f3" target="_blank" rel="noopener"&gt;da7c0df&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add cpu-thread-count to &lt;code&gt;ProcessMetricsCollector&lt;/code&gt; struct and memory &amp;amp; cpu usage to &lt;code&gt;ProcessMetrics struct&lt;/code&gt; by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/1f9e0a759796dca773489bd56edb99525d5f64f8" target="_blank" rel="noopener"&gt;1f9e0a7&lt;/a&gt;
 &lt;em&gt;(process-metrics)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;running Re-register timer for even idle workers by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/7d850bea5fe6298c7f53d39898f72eec615fc83c" target="_blank" rel="noopener"&gt;7d850be&lt;/a&gt;
 &lt;em&gt;(timers)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;add tokio-stream as a dependency to create useful stream on tokio utils by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/5dc632080c4739811236a23ddee1b81b6b9abf54" target="_blank" rel="noopener"&gt;5dc6320&lt;/a&gt;
 &lt;em&gt;(deps)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;remove flume in favour of tokio-broadcast by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/2aa3befd2a59d5f6da00bce8db8cb93a48b5ff9a" target="_blank" rel="noopener"&gt;2aa3bef&lt;/a&gt;
 &lt;em&gt;(deps)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Reduce channel buffers and simplify streams by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/7c9ed08b28c63a66edffdc79cddc99f2f7551063" target="_blank" rel="noopener"&gt;7c9ed08&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;remove dashmap and add parking_lot by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/f206257823b58d32449bf434dd71d7c210544f50" target="_blank" rel="noopener"&gt;f206257&lt;/a&gt;
 &lt;em&gt;(deps)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;add compact_str as dependancy to reduce memory usage by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/f09fc11c263614392b740cecebb5720100de19cc" target="_blank" rel="noopener"&gt;f09fc11&lt;/a&gt;
 &lt;em&gt;(deps)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;add hostname crate and use it to get the machine&amp;rsquo;s name instead by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/53f0f0b0e2a8cf230c1135dffa1fd75600383588" target="_blank" rel="noopener"&gt;53f0f0b&lt;/a&gt;
 &lt;em&gt;(deps)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;fix compile errors when tracing is enabled caused by compact_str refactor by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/e7babde6f27c095cc38765a3fd67e5684cbf831f" target="_blank" rel="noopener"&gt;e7babde&lt;/a&gt;
 &lt;em&gt;(tracing)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;clean up errors by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/c173c3fd516cbc386903dde90e0a44bbaf74dfca" target="_blank" rel="noopener"&gt;c173c3f&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;fix error in redis-queue-tests, use to_string instead of to_compact_string by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/2c71a523420cb3b4bb9d69b367c400a46ba41c75" target="_blank" rel="noopener"&gt;2c71a52&lt;/a&gt;
 &lt;em&gt;(tests)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;add a timer existence check for queues by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/05357f051aa7d584b807972b843dc3fd8549a5e6" target="_blank" rel="noopener"&gt;05357f0&lt;/a&gt;
 &lt;em&gt;(timers)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;put individual queue_timer tasks to sleep for n millis where there is no work by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/89a6208fc48286e605f5837a52e499ba103b8320" target="_blank" rel="noopener"&gt;89a6208&lt;/a&gt;
 &lt;em&gt;(timers)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;remove triggerpromotion timers by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/3f1ea4579c0af128dd96064e44ffc4aed0ea77ba" target="_blank" rel="noopener"&gt;3f1ea45&lt;/a&gt;
 &lt;em&gt;(timers)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;add a worker to global registry on creation but register it&amp;rsquo;s timers later. by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/490d37643ed42f933e2677b6faa47ea04894a659" target="_blank" rel="noopener"&gt;490d376&lt;/a&gt;
 &lt;em&gt;(timers)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;add more metadata about workers to the process_metrics by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/e3dd09e176f65eeb5cda9e08d91ee01c8ec2b51b" target="_blank" rel="noopener"&gt;e3dd09e&lt;/a&gt;
 &lt;em&gt;(process_metrics)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;remove lock checks in queue::move_to_finish_or_failed. by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/7c71b0de3fc927ed6fbf741b089b4633fad5e965" target="_blank" rel="noopener"&gt;7c71b0d&lt;/a&gt;
 &lt;em&gt;(queue)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="documentation"&gt;Documentation&lt;a class="heading-anchor" href="#documentation" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;add detailed documentation for the process-metrics module by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/be703b868bb45a7357ceaa9fe28e1fc379f34ead" target="_blank" rel="noopener"&gt;be703b8&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add ProcessMetrics section to README and fix rustdoc warnings by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/3f9e1e9c3e9d7f80f32ae2297656a9f436bce3d9" target="_blank" rel="noopener"&gt;3f9e1e9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="features"&gt;Features&lt;a class="heading-anchor" href="#features" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Add node/process metrics using the heapster and systinfo crates by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/7b508978d547ac4f5077030e2ade6195419e2d17" target="_blank" rel="noopener"&gt;7b50897&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add publish process metrics to worker-timers and a dedicated health check for each worker by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/4a7ec8d2db8aa2399e27c317d2458627141d7427" target="_blank" rel="noopener"&gt;4a7ec8d&lt;/a&gt;
 &lt;em&gt;(Timers)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;add process metrics collection and fetching to &lt;code&gt;RedisStore&lt;/code&gt; and &lt;code&gt;InMemoryStore&lt;/code&gt; stores by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/772217aaa6948d970ceab0480f40aea13d878512" target="_blank" rel="noopener"&gt;772217a&lt;/a&gt;
 &lt;em&gt;(stores)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;add a lazy better timed_map implementation without locking on purged_expired method by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/9795f023307d6263fbe83f2e094144c02642ed28" target="_blank" rel="noopener"&gt;9795f02&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="refactoring"&gt;Refactoring&lt;a class="heading-anchor" href="#refactoring" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Extract worker metrics into metrics module by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/1c053f76d589e7948a18144d7c52422a91abd8dd" target="_blank" rel="noopener"&gt;1c053f7&lt;/a&gt;
 &lt;em&gt;(metrics)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;rename the &lt;code&gt;node_metrics&lt;/code&gt; module &amp;amp;&amp;amp; &lt;code&gt;NodeMetrics&lt;/code&gt; struct to &lt;code&gt;process_metrics&lt;/code&gt; &amp;amp; &lt;code&gt;ProcessMetrics&lt;/code&gt; respectively by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/1e0153faac7ad3610483ba44254b165d1d36861f" target="_blank" rel="noopener"&gt;1e0153f&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;process metrics collector and add serde support by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/3f1f0b8b58c63459ec631d857e649f8e201b4c5e" target="_blank" rel="noopener"&gt;3f1f0b8&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;move timers(stall_check,extend_lock&amp;amp; collect_metrics) to the queue instead of workers by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/bda760b625283fbca4b3976db57b1197a612dbd9" target="_blank" rel="noopener"&gt;bda760b&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;move all timer-logic to a singleton processor by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/2522114e154a34d33f66967dacb5ca47b4dd54bc" target="_blank" rel="noopener"&gt;2522114&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;move fetching scheduled delayed jobs to a dedicated timer by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/e471aa31ae79d320df742d380d4b1ff6affcf3fe" target="_blank" rel="noopener"&gt;e471aa3&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;move worker pausing logic from the timer_reciever-task to each worker&amp;rsquo;s main loop. by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/a98d90cb39eaa1080bbdc5ea73df975b7c43fab5" target="_blank" rel="noopener"&gt;a98d90c&lt;/a&gt;
 &lt;em&gt;(worker)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Queue::add_worker&lt;/code&gt; now also registers existing workers by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/182037224f346a55bf6b39f0d46cb91cf0210537" target="_blank" rel="noopener"&gt;1820372&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Switch queues to SkipMap instead of a ttl-timed map by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/9490dbfe2c58d640ea42f42f487afc5070d3b523" target="_blank" rel="noopener"&gt;9490dbf&lt;/a&gt;
 &lt;em&gt;(ProcessMetricsCollector)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;use a tokio::watch channel for process-metrics updates instead of the same flume channel as timers by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/5efc7a66cd7109a83ebefc3ec54b9198e64f9f75" target="_blank" rel="noopener"&gt;5efc7a6&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;remove usages of dashmap in favour of parking_lot by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/e31bf3749262e68be0aa321e5dd88456923160f9" target="_blank" rel="noopener"&gt;e31bf37&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use std::process::id() instead of the sysinfo&amp;rsquo;s method by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/2ba550b88ae703c84de7a42433f37431c8e06f19" target="_blank" rel="noopener"&gt;2ba550b&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use different strategies for cpu metrics for linux and other platforms by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/3364fe93d22487787e42bbb3fa6bd142ac5661e6" target="_blank" rel="noopener"&gt;3364fe9&lt;/a&gt;
 &lt;em&gt;(process_metrics)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;use tokio::utils::DelayQueue instead of futures-intrusive &amp;amp;&amp;amp; futures-delay-queue by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/3715a2255c1f3dc55876f7c6a4ba919441b79b80" target="_blank" rel="noopener"&gt;3715a22&lt;/a&gt;
 &lt;em&gt;(delay_queue_map)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;remove module delay_queue_map.rs to concurrent_timed_map.rs by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/4f3ca578f09545602002d7e0c6759fb91158acf0" target="_blank" rel="noopener"&gt;4f3ca57&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;merge the event_stream_task and the timer_task_listener task into one background task. by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/32d8c7cba19bc70870986efac1ff8c3f81804e02" target="_blank" rel="noopener"&gt;32d8c7c&lt;/a&gt;
 &lt;em&gt;(stores)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;use tokio::join instead of a tokio::select to run both the stream_listener_task and timer_task. by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/9d75cf2482ef4d82624d795b0b3b84cd17a6518c" target="_blank" rel="noopener"&gt;9d75cf2&lt;/a&gt;
 &lt;em&gt;(queue_timer)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;periodically update queue metrics inside the worker_metrics collection timers instead of within stores(redis-store for instance). by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/8af8891b250984d42179829ee15804aa19fa956f" target="_blank" rel="noopener"&gt;8af8891&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Flattened down the worker&amp;rsquo;s reactor loop to a single cleanly controlled loop. by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/9e54443474488c623a3f388505abda3f4155dd27" target="_blank" rel="noopener"&gt;9e54443&lt;/a&gt;
 &lt;em&gt;(worker_reactor_loop)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;replace numeric as casts with num_traits::AsPrimitive. by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/653c9429a3c916a655e8f849a91e0d71ef2d0f11" target="_blank" rel="noopener"&gt;653c942&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="release"&gt;Release&lt;a class="heading-anchor" href="#release" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;0.2.0 (#80) by @github-actions[bot] (&lt;a href="https://github.com/KioHQ/kiomq/pull/80" target="_blank" rel="noopener"&gt;#80&lt;/a&gt;
) &lt;em&gt;(release)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="contributors"&gt;Contributors&lt;a class="heading-anchor" href="#contributors" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;@github-actions[bot]&lt;/li&gt;
&lt;li&gt;@spencerjibz&lt;/li&gt;
&lt;/ul&gt;

 &lt;/div&gt;
 &lt;/section&gt;
 &lt;section class="release" id="v020"&gt;
 &lt;div class="release__head"&gt;
 &lt;h2&gt;
 &lt;a href="#v020"&gt;v0.2.0&lt;/a&gt;
 &lt;/h2&gt;
 &lt;span class="release__date"&gt;6 May 2026&lt;/span&gt;
 &lt;a class="release__compare" href="https://github.com/KioHQ/kiomq/releases/tag/v0.2.0" target="_blank" rel="noopener"&gt;
 release notes ↗
 &lt;/a&gt;
 &lt;/div&gt;
 &lt;div class="release__body"&gt;
 &lt;h3 id="bug-fixes"&gt;Bug Fixes&lt;a class="heading-anchor" href="#bug-fixes" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;yield in busy-wait loops and use saturating_sub by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/d88463bdaddd48a6a2ed4a91c64ecc4cde383940" target="_blank" rel="noopener"&gt;d88463b&lt;/a&gt;
 &lt;em&gt;(worker_test_helper)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="chores"&gt;Chores&lt;a class="heading-anchor" href="#chores" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;remove atomig as dependency by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/b2125087423daef2c250f68ff2fad2aaccbd3d75" target="_blank" rel="noopener"&gt;b212508&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;make dotenv an optional dependency by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/75" target="_blank" rel="noopener"&gt;#75&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;remove trailing comma by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/182eacf910eccc9d1aaff075ba1fda217f71ae08" target="_blank" rel="noopener"&gt;182eacf&lt;/a&gt;
 &lt;em&gt;(clippy)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;remove static counters (id-counter &amp;amp;&amp;amp; pc-counter) by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/8b525b76da5880f0c7c693c2e5c45f9576c7aedb" target="_blank" rel="noopener"&gt;8b525b7&lt;/a&gt;
 &lt;em&gt;(redis-store)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;update tests and examples to use a shared redis connection by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/052af3fd5d1decafe37fbbca7985c7a22722b846" target="_blank" rel="noopener"&gt;052af3f&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;update README.md to reflect updates to the &lt;code&gt;RedisStore&lt;/code&gt; and &lt;code&gt;update_progress&lt;/code&gt; method by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/3ae61daea1e8444af24a8ebc81316c80db203182" target="_blank" rel="noopener"&gt;3ae61da&lt;/a&gt;
 &lt;em&gt;(docs)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;update redis &amp;amp; deadpool-redis to v1.2.0 and v0.230 respectively; update everything to reflect this by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/c6237d7b1420b3372b277d0e534e9a1b32830da0" target="_blank" rel="noopener"&gt;c6237d7&lt;/a&gt;
 &lt;em&gt;(deps)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;bump rustls-webpki from 0.103.10 to 0.103.12 by @dependabot[bot] (&lt;a href="https://github.com/KioHQ/kiomq/pull/76" target="_blank" rel="noopener"&gt;#76&lt;/a&gt;
) &lt;em&gt;(deps)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="features"&gt;Features&lt;a class="heading-anchor" href="#features" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;redis connection sharing between different store instance by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/e827431c98c4be499aea661eb684a880a8645555" target="_blank" rel="noopener"&gt;e827431&lt;/a&gt;
 &lt;em&gt;(RedisStore)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;add a better implementation of skipmap based deque. by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/419f62ea01f6e93bff6ad359c68f8b2acd9ce092" target="_blank" rel="noopener"&gt;419f62e&lt;/a&gt;
 &lt;em&gt;(InMemoryStore)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="other"&gt;Other&lt;a class="heading-anchor" href="#other" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Merge branch &amp;lsquo;redis-improvements&amp;rsquo; of &lt;a href="https://github.com/KioHQ/kiomq" target="_blank" rel="noopener"&gt;https://github.com/KioHQ/kiomq&lt;/a&gt;
 into redis-improvements by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/1f6c69931b939089aa84094e3463e36d2e83a7b0" target="_blank" rel="noopener"&gt;1f6c699&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Merge branch &amp;lsquo;main&amp;rsquo; into redis-improvements by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/a7858ba8abb0dcd6a6df1d60c85aa5fd8e4329d8" target="_blank" rel="noopener"&gt;a7858ba&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Merge pull request #78 from KioHQ/redis-improvements by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/78" target="_blank" rel="noopener"&gt;#78&lt;/a&gt;
)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="refactoring"&gt;Refactoring&lt;a class="heading-anchor" href="#refactoring" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;replace of all usages for atomig::Atomic with crossbeam::atomic::AtomicCell by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/2709ba6d17b02e71903b25260248a078a956b1dc" target="_blank" rel="noopener"&gt;2709ba6&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use &lt;code&gt;crossbeam::atomic::AtomicCell&lt;/code&gt; instead of manual Atomics(AtomicUsize, AtomicBool &amp;amp; AtomicU64) by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/71bb7afff5d7f8910c61e7f2a0c141077074e388" target="_blank" rel="noopener"&gt;71bb7af&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;remove mutex usage to guard per task metrics-histogram by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/25580cf863bdfeec714daacace8daf07dcd3017d" target="_blank" rel="noopener"&gt;25580cf&lt;/a&gt;
 &lt;em&gt;(worker)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;replace boolean flags with &lt;code&gt;TimerState&lt;/code&gt; by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/a6a826f7a52dede3df65bca740a1b5029000b05e" target="_blank" rel="noopener"&gt;a6a826f&lt;/a&gt;
 &lt;em&gt;(timers)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;convert Store trait methods to async by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/2d87eab82991309ef489eb24560513292b0783bd" target="_blank" rel="noopener"&gt;2d87eab&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use redis-transactions for atomic job insertion and remove counters per store by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/5ba4a3d1312af73b10b116209541b18181cf6f92" target="_blank" rel="noopener"&gt;5ba4a3d&lt;/a&gt;
 &lt;em&gt;(redis)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;use redis-transactions for atomic job insertion and remove counters per store by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/8ae1b7e074dd2cc0de471b3985395969f864581a" target="_blank" rel="noopener"&gt;8ae1b7e&lt;/a&gt;
 &lt;em&gt;(redis)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="release"&gt;Release&lt;a class="heading-anchor" href="#release" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;0.1.3 by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/74" target="_blank" rel="noopener"&gt;#74&lt;/a&gt;
) &lt;em&gt;(release)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="tests"&gt;Tests&lt;a class="heading-anchor" href="#tests" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;fix doc-test errors included by shared-redis-connection feature by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/219a61fc22014f2fc3ea91e7574621317bc71725" target="_blank" rel="noopener"&gt;219a61f&lt;/a&gt;
 &lt;em&gt;(doc-test)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="contributors"&gt;Contributors&lt;a class="heading-anchor" href="#contributors" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;@dependabot[bot]&lt;/li&gt;
&lt;li&gt;@spencerjibz&lt;/li&gt;
&lt;/ul&gt;

 &lt;/div&gt;
 &lt;/section&gt;
 &lt;section class="release" id="v013"&gt;
 &lt;div class="release__head"&gt;
 &lt;h2&gt;
 &lt;a href="#v013"&gt;v0.1.3&lt;/a&gt;
 &lt;/h2&gt;
 &lt;span class="release__date"&gt;5 April 2026&lt;/span&gt;
 &lt;a class="release__compare" href="https://github.com/KioHQ/kiomq/releases/tag/v0.1.3" target="_blank" rel="noopener"&gt;
 release notes ↗
 &lt;/a&gt;
 &lt;/div&gt;
 &lt;div class="release__body"&gt;
 &lt;h3 id="bug-fixes"&gt;Bug Fixes&lt;a class="heading-anchor" href="#bug-fixes" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;fix typo in cargo.toml and fmt the file by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/42499eb326e9d92cd0b0a2f03f71c703124924e4" target="_blank" rel="noopener"&gt;42499eb&lt;/a&gt;
 &lt;em&gt;(cargo)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;add derive debug and display to fix rebase issues by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/9f253abae927a6507ea17a8bafb44e713b88a007" target="_blank" rel="noopener"&gt;9f253ab&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;logic bug in end-to-end benchmarks by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/73" target="_blank" rel="noopener"&gt;#73&lt;/a&gt;
)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="chores"&gt;Chores&lt;a class="heading-anchor" href="#chores" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;add hdrhistogram for poll_duration_metrics collection by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/9ec9193bcdb64feca8ab4d65733a10d6fa22c72f" target="_blank" rel="noopener"&gt;9ec9193&lt;/a&gt;
 &lt;em&gt;(deps)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;implement deref &amp;amp; deref_mut traits for the &lt;code&gt;HistogramWrapper&lt;/code&gt; by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/04b4484e305a473ad7d2b393eebe4ff78611cdab" target="_blank" rel="noopener"&gt;04b4484&lt;/a&gt;
 &lt;em&gt;(WorkerMetrics)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;make poll_duration_history public in &lt;code&gt;TaskInfo&lt;/code&gt; by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/36c45bc935e4736d75131f5c05627cc376844c14" target="_blank" rel="noopener"&gt;36c45bc&lt;/a&gt;
 &lt;em&gt;(WorkerMetrics)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;export &lt;code&gt;TaskInfo&lt;/code&gt; publicly by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/1cd7176dcffe0bf9c81f5fc307c0803385c7f468" target="_blank" rel="noopener"&gt;1cd7176&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use async-mutex only for guarding Histogram per task by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/828fbc3e55379bd0a16059d9321960a93b98cf32" target="_blank" rel="noopener"&gt;828fbc3&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;adhere to clippy::depantic by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/66" target="_blank" rel="noopener"&gt;#66&lt;/a&gt;
) &lt;em&gt;(clippy)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;update release name format in release GitHub Actions workflow by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/4b455b42b796267c3582eede57919dbee3577e6a" target="_blank" rel="noopener"&gt;4b455b4&lt;/a&gt;
 &lt;em&gt;(ci)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;remove buildjet cache usage from action-workflows by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/54b98985d7e089fab9c869c170424587041f8c0b" target="_blank" rel="noopener"&gt;54b9898&lt;/a&gt;
 &lt;em&gt;(actions)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;delay-queue-wip by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/82e57bc85734aa36c5f668d5389121204a219527" target="_blank" rel="noopener"&gt;82e57bc&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add futures-intrusive &amp;amp;&amp;amp; futures-delay-queue by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/576844b56e95801d1a8fa323f03625b7edb4c1ab" target="_blank" rel="noopener"&gt;576844b&lt;/a&gt;
 &lt;em&gt;(deps)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;apply clippy lint recommendations by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/b94c0a9b7e5206efb4407443319085b9e2a7c9ea" target="_blank" rel="noopener"&gt;b94c0a9&lt;/a&gt;
 &lt;em&gt;(lints)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;reinstate job promotion timer and move delayed job pick up logic to the worker main_loop instead of timers by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/2b672287a8d702faf8b733b552293fce921169ad" target="_blank" rel="noopener"&gt;2b67228&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;chore: log job state transitions in the queue(when tracing is enabled) &amp;amp; by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/67" target="_blank" rel="noopener"&gt;#67&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;bump rustls-webpki from 0.103.4 to 0.103.10 by @dependabot[bot] (&lt;a href="https://github.com/KioHQ/kiomq/pull/68" target="_blank" rel="noopener"&gt;#68&lt;/a&gt;
) &lt;em&gt;(deps)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;bump tar from 0.4.44 to 0.4.45 by @dependabot[bot] (&lt;a href="https://github.com/KioHQ/kiomq/pull/72" target="_blank" rel="noopener"&gt;#72&lt;/a&gt;
) &lt;em&gt;(deps)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;bump slab from 0.4.10 to 0.4.12 by @dependabot[bot] (&lt;a href="https://github.com/KioHQ/kiomq/pull/71" target="_blank" rel="noopener"&gt;#71&lt;/a&gt;
) &lt;em&gt;(deps)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;bump bytes from 1.10.1 to 1.11.1 by @dependabot[bot] (&lt;a href="https://github.com/KioHQ/kiomq/pull/69" target="_blank" rel="noopener"&gt;#69&lt;/a&gt;
) &lt;em&gt;(deps)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;remove xutex as dependency; use tokio&amp;rsquo;s mutex for async cases by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/6940d76b63a58574ab030c864f28027bcb7887a5" target="_blank" rel="noopener"&gt;6940d76&lt;/a&gt;
 &lt;em&gt;(dep)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="documentation"&gt;Documentation&lt;a class="heading-anchor" href="#documentation" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;add refactor as a type of change in pull request template by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/b76b5a57b19293467db78cbe37deeb1cc5353855" target="_blank" rel="noopener"&gt;b76b5a5&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="features"&gt;Features&lt;a class="heading-anchor" href="#features" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;add a poll_duration histogram for get collect statistcs by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/312b12af594ee8db5410fd4d43e1bce0d0ba47b6" target="_blank" rel="noopener"&gt;312b12a&lt;/a&gt;
 &lt;em&gt;(WorkerMetrics)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;add redis-version checking and the field to the redis-store by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/82406a712f3e15f324164f79dcfd88c0b2ebd8a3" target="_blank" rel="noopener"&gt;82406a7&lt;/a&gt;
 &lt;em&gt;(RedisStore)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="other"&gt;Other&lt;a class="heading-anchor" href="#other" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;chore(deps) add dashmap as a new dependency by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/ce97639542dec6e94dc36bac0bf013a491e20db5" target="_blank" rel="noopener"&gt;ce97639&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="performance"&gt;Performance&lt;a class="heading-anchor" href="#performance" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;use early returns when fetch jobs from empty collections by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/0b2a56388b990a1bc67b5fa910b634e8e5727c95" target="_blank" rel="noopener"&gt;0b2a563&lt;/a&gt;
 &lt;em&gt;(InMemoryStore)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;store worker_metrics in redis as a hash instead of individual values by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/70" target="_blank" rel="noopener"&gt;#70&lt;/a&gt;
) &lt;em&gt;(RedisStore)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="refactoring"&gt;Refactoring&lt;a class="heading-anchor" href="#refactoring" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;add the last_updated_time and ttl fields to worker_metrics by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/935f68033fb3d2ffb3d088f6ce7c7b08730f3558" target="_blank" rel="noopener"&gt;935f680&lt;/a&gt;
 &lt;em&gt;(WorkerMetrics)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;add a clean lockfree timer design based off channels by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/20f97597ce3a3a3c2a78e05574d6df671614de50" target="_blank" rel="noopener"&gt;20f9759&lt;/a&gt;
 &lt;em&gt;(DelayedQueue)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;require Sync trait for Data type and Store type (D&amp;amp;S) by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/43d3e2d149475ade23fa8eb90c0dc471d4724ff8" target="_blank" rel="noopener"&gt;43d3e2d&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;move job promotion from this DelayQueue to an independent tasks with a dedicated track by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/383b7c5e27fda57562a5af1c9f949c2733f1fb2c" target="_blank" rel="noopener"&gt;383b7c5&lt;/a&gt;
 &lt;em&gt;(DelayTimer)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;use a channel based delayed-queue from futures-delayed-queue crate &amp;amp;&amp;amp; remove usage of block_in_place in this module too by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/7b76f819302aa0cae29f998dae7c259229c5dad7" target="_blank" rel="noopener"&gt;7b76f81&lt;/a&gt;
 &lt;em&gt;(TimedMap)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;use the same channel queue instead of tokio::util::DelayQueue by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/7e088c33985144e55a0d48f0c2ddb75ba431fb1b" target="_blank" rel="noopener"&gt;7e088c3&lt;/a&gt;
 &lt;em&gt;(DelayQueueTimer)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;simplify delay_queue_timer and include job promotion in it too by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/5c0f0e5a7b07a44255ee9c9c41c13d6ecbccfd8a" target="_blank" rel="noopener"&gt;5c0f0e5&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use dashmap::HashMap in timedmap &amp;amp; delayed_queue-map by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/0685cdfc705b2da6e8663c64a226672a3f13b822" target="_blank" rel="noopener"&gt;0685cdf&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use dashmap::Hashmap instead crossbeam::skipmap to store runnings in the worker by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/3f308a290137ae1b9462efdc631d80730b15675f" target="_blank" rel="noopener"&gt;3f308a2&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="release"&gt;Release&lt;a class="heading-anchor" href="#release" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;0.1.2 by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/65" target="_blank" rel="noopener"&gt;#65&lt;/a&gt;
) &lt;em&gt;(release)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="contributors"&gt;Contributors&lt;a class="heading-anchor" href="#contributors" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;@dependabot[bot]&lt;/li&gt;
&lt;li&gt;@spencerjibz&lt;/li&gt;
&lt;/ul&gt;

 &lt;/div&gt;
 &lt;/section&gt;
 &lt;section class="release" id="v012"&gt;
 &lt;div class="release__head"&gt;
 &lt;h2&gt;
 &lt;a href="#v012"&gt;v0.1.2&lt;/a&gt;
 &lt;/h2&gt;
 &lt;span class="release__date"&gt;14 March 2026&lt;/span&gt;
 &lt;a class="release__compare" href="https://github.com/KioHQ/kiomq/releases/tag/v0.1.2" target="_blank" rel="noopener"&gt;
 release notes ↗
 &lt;/a&gt;
 &lt;/div&gt;
 &lt;div class="release__body"&gt;
 &lt;h3 id="bug-fixes"&gt;Bug Fixes&lt;a class="heading-anchor" href="#bug-fixes" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;update metrics after pausing queue and fix inmemorystore pause behaviour by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/7a12cea3fe57684cffc2d9d8d2770bccb1ede123" target="_blank" rel="noopener"&gt;7a12cea&lt;/a&gt;
 &lt;em&gt;(queue)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ci"&gt;CI&lt;a class="heading-anchor" href="#ci" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;use &amp;ndash;offline instead of &amp;ndash;locked for tests in ci by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/54247c52cb049efdac8d15d4441f27b4ad85241b" target="_blank" rel="noopener"&gt;54247c5&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;update git-cliff config to generate well-grouped change and release notes by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/9388bc16b79d78c881420ac7ebec91ae13d46e7a" target="_blank" rel="noopener"&gt;9388bc1&lt;/a&gt;
 &lt;em&gt;(release-pipline)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="chores"&gt;Chores&lt;a class="heading-anchor" href="#chores" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;revert usage of &amp;ndash;offline flag in ci by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/120babaf345fbdd75161647e716b895fd9b67153" target="_blank" rel="noopener"&gt;120baba&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;regenerate changelog with updated git-cliff configuration by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/7a076abf3cafdfcfe285312e2d8762ab968bec5f" target="_blank" rel="noopener"&gt;7a076ab&lt;/a&gt;
 &lt;em&gt;(changelog)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;remove parking_lot in favour of xutex (only one is needed) by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/5045bb60e09dfc64d7c450b72818ba831fee69d8" target="_blank" rel="noopener"&gt;5045bb6&lt;/a&gt;
 &lt;em&gt;(deps)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;make simd-json as optional dependancy by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/25f5b59c08eb276e9815ac6af121c316d98808a1" target="_blank" rel="noopener"&gt;25f5b59&lt;/a&gt;
 &lt;em&gt;(deps)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;fix a typo in readme, &amp;amp;&amp;amp; ignore some code-snippets in docs tests by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/df0c42a00f83fdf0ecdcc0d4f1887d67037c8bb7" target="_blank" rel="noopener"&gt;df0c42a&lt;/a&gt;
 &lt;em&gt;(README)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;add more useful keywords for the crates by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/01635313e47ec3c39d85b58197cabe77ecfb299a" target="_blank" rel="noopener"&gt;0163531&lt;/a&gt;
 &lt;em&gt;(crates.io)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;fix missing commas in cargo.toml by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/94c3d64674ed94282eabadf572d66085292e63a6" target="_blank" rel="noopener"&gt;94c3d64&lt;/a&gt;
 &lt;em&gt;(cargo.toml)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;limited the crate keywords to five(publish limit) by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/ca26156f6d33901c34fb18ce28cb81165370771a" target="_blank" rel="noopener"&gt;ca26156&lt;/a&gt;
 &lt;em&gt;(crates.io)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="refactoring"&gt;Refactoring&lt;a class="heading-anchor" href="#refactoring" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;restart all timers instead of resuming with stored state by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/2ab4cd055432bf3a34dea607e472e7a5ee289640" target="_blank" rel="noopener"&gt;2ab4cd0&lt;/a&gt;
 &lt;em&gt;(delayed_queue_timer)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="release"&gt;Release&lt;a class="heading-anchor" href="#release" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;0.1.1 by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/63" target="_blank" rel="noopener"&gt;#63&lt;/a&gt;
) &lt;em&gt;(release)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="contributors"&gt;Contributors&lt;a class="heading-anchor" href="#contributors" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;@spencerjibz&lt;/li&gt;
&lt;/ul&gt;

 &lt;/div&gt;
 &lt;/section&gt;
 &lt;section class="release" id="v011"&gt;
 &lt;div class="release__head"&gt;
 &lt;h2&gt;
 &lt;a href="#v011"&gt;v0.1.1&lt;/a&gt;
 &lt;/h2&gt;
 &lt;span class="release__date"&gt;7 March 2026&lt;/span&gt;
 &lt;a class="release__compare" href="https://github.com/KioHQ/kiomq/releases/tag/v0.1.1" target="_blank" rel="noopener"&gt;
 release notes ↗
 &lt;/a&gt;
 &lt;/div&gt;
 &lt;div class="release__body"&gt;
 &lt;h3 id="bug-fixes"&gt;Bug Fixes&lt;a class="heading-anchor" href="#bug-fixes" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;lint warning about links by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/916016b10afe2adf41196afdc0f461b6ea1f75fd" target="_blank" rel="noopener"&gt;916016b&lt;/a&gt;
 &lt;em&gt;(rustdoc)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ci"&gt;CI&lt;a class="heading-anchor" href="#ci" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;exclude unnecessary folders and files from cargo publish by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/9c88c323dfb6e561ae8c744b21736a9163bd1fe9" target="_blank" rel="noopener"&gt;9c88c32&lt;/a&gt;
 &lt;em&gt;(Crates.io)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;workflow should references to the old library version in the readme by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/62" target="_blank" rel="noopener"&gt;#62&lt;/a&gt;
) &lt;em&gt;(cd-workflow)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="chores"&gt;Chores&lt;a class="heading-anchor" href="#chores" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;clippy fix (unused) by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/68f67e5ca787b7f52dcd34b7e1f578ebee72fdc1" target="_blank" rel="noopener"&gt;68f67e5&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="documentation"&gt;Documentation&lt;a class="heading-anchor" href="#documentation" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;add ci-build, crates.io, docs.rs &amp;amp; licence badges to readme by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/55a4caaf0b0ec4ac349977c2e2e93738bba3aa57" target="_blank" rel="noopener"&gt;55a4caa&lt;/a&gt;
 &lt;em&gt;(readme)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;update code snippets to include waiting for job completion by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/770f85cf3c53eb8ed13c29d03b516fa7c48e6bb4" target="_blank" rel="noopener"&gt;770f85c&lt;/a&gt;
 &lt;em&gt;(readme)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;add example code-snippet of redis and rocksdb usage by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/0d45ff900e7e62fdd711b2082085fc5a709bb50e" target="_blank" rel="noopener"&gt;0d45ff9&lt;/a&gt;
 &lt;em&gt;(readme)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;use readme in lib.rs, correct links in docs by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/25ba74bc5dc698915aa1accde790ffba6fa0dd70" target="_blank" rel="noopener"&gt;25ba74b&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;minor tweak in rocksdb usage example by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/3ce01a799ef0f6abdb23340f80e6cba4cde4bcbc" target="_blank" rel="noopener"&gt;3ce01a7&lt;/a&gt;
 &lt;em&gt;(readme)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="release"&gt;Release&lt;a class="heading-anchor" href="#release" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;0.1.0 by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/61" target="_blank" rel="noopener"&gt;#61&lt;/a&gt;
) &lt;em&gt;(release)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="contributors"&gt;Contributors&lt;a class="heading-anchor" href="#contributors" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;@spencerjibz&lt;/li&gt;
&lt;/ul&gt;

 &lt;/div&gt;
 &lt;/section&gt;
 &lt;section class="release" id="v010"&gt;
 &lt;div class="release__head"&gt;
 &lt;h2&gt;
 &lt;a href="#v010"&gt;v0.1.0&lt;/a&gt;
 &lt;/h2&gt;
 &lt;span class="release__date"&gt;7 March 2026&lt;/span&gt;
 &lt;a class="release__compare" href="https://github.com/KioHQ/kiomq/releases/tag/v0.1.0" target="_blank" rel="noopener"&gt;
 release notes ↗
 &lt;/a&gt;
 &lt;/div&gt;
 &lt;div class="release__body"&gt;
 &lt;h3 id="bug-fixes"&gt;Bug Fixes&lt;a class="heading-anchor" href="#bug-fixes" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;fix support for job prioritization by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/8e514e24087b9d59c4ea82dfdd64ea36d65b26a1" target="_blank" rel="noopener"&gt;8e514e2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;fix job retrial after failure by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/11" target="_blank" rel="noopener"&gt;#11&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;fix retrials &amp;amp; remove crossbeam-skiplist by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/800fb39b61efb50a8308e23cad3667cd1d5aefdd" target="_blank" rel="noopener"&gt;800fb39&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;failing missed deadline jobs by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/8595655da331a303dc78eeec0833752ed44690ad" target="_blank" rel="noopener"&gt;8595655&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;fix serializing redis-stream-event by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/71c0ccd4e0e119675428c90d48b370607980a5a1" target="_blank" rel="noopener"&gt;71c0ccd&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;skipmap.len is just an len appromixation, use atomic counter for this instead by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/14" target="_blank" rel="noopener"&gt;#14&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;fix flaky test by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/15" target="_blank" rel="noopener"&gt;#15&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;correctly serialize queue-events by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/f09e065af8c5e7386936e7a34e4aa75cfae7fef4" target="_blank" rel="noopener"&gt;f09e065&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;promoting delayed jobs by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/0d36fa86b51d225e2acc07c56575de17df332659" target="_blank" rel="noopener"&gt;0d36fa8&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;fix complete rocksdb-store::add_bulk methods by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/01b2f3db0f956339e74eca2c4c19899e3c800d67" target="_blank" rel="noopener"&gt;01b2f3d&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;counter bugs in in-memory and rocksdb store by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/85c20ed886e48b65b21bf91f3c5ea4dce574b666" target="_blank" rel="noopener"&gt;85c20ed&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;fix overflow and simple clean up by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/234f7f50287c4f0da6fd067e47e40ec8059e363e" target="_blank" rel="noopener"&gt;234f7f5&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;fix out of range errors by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/17" target="_blank" rel="noopener"&gt;#17&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;fix typo by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/b0852f43f7e17fb3112feb8dc13d894e2baf21f0" target="_blank" rel="noopener"&gt;b0852f4&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;bug fix by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/5f089803a42d91f7d7d7f1a4386ba7875cc4c89b" target="_blank" rel="noopener"&gt;5f08980&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;correct naming of metrics by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/9b1e9c7615474ead4680bb2258b4313a8900f1c3" target="_blank" rel="noopener"&gt;9b1e9c7&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;bug fixes by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/2fd910f68e82f504d8f6cf81fb4d56d7bf9c5f9b" target="_blank" rel="noopener"&gt;2fd910f&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;set return value &amp;amp; add timeout to listening to events by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/e71a2d30fcddb1f5cdd55766c9054c4c4f56152e" target="_blank" rel="noopener"&gt;e71a2d3&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;timedmap tests by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/152e2f52606fceb6027648737a69faeafa1f94da" target="_blank" rel="noopener"&gt;152e2f5&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;bug fix: locks.len_exnpire is async by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/c71823e317cf72e068704a107a74a8d79a9eb824" target="_blank" rel="noopener"&gt;c71823e&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;inmemory-store, only update stored-metrics from publish_event by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/6ff80a40600674171c3f27cd8d844314243047a4" target="_blank" rel="noopener"&gt;6ff80a4&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;updating prioritized and failed job counts in queue-metrics by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/cdd272658707421298f6b14dcb06cc7752ffcc43" target="_blank" rel="noopener"&gt;cdd2726&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;pass the right attempt for failed jobs by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/e6724232f4fe76fbb0ad4b6dc133dca8338c5e46" target="_blank" rel="noopener"&gt;e672423&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;redis-store returns pause_count instead of failed_job cout by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/0f027d5c10d17e5516b25277f54933fc00ee3e54" target="_blank" rel="noopener"&gt;0f027d5&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;typo in fetch_worker_metrics in redis-store by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/9d17207c23648028cde030f86c10bdd273029fd6" target="_blank" rel="noopener"&gt;9d17207&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;cargo fmt by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/3ab26ed59a9d952aa8fb0aa44b7df35853f062dc" target="_blank" rel="noopener"&gt;3ab26ed&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;fetching_metrics from redis-store by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/0173d57dc9f6c7957d1d46f1ea7c20f65b87b427" target="_blank" rel="noopener"&gt;0173d57&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;fix flawky tests by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/9e84dee51732ecf47db1942dbe424ac60ae15daf" target="_blank" rel="noopener"&gt;9e84dee&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;fix tests by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/49" target="_blank" rel="noopener"&gt;#49&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;tracing::Instrument::instrument is ambigious to TaskMonitor.instrument by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/6e6f3422fbf3cd8eaaf589cba06ed7e1fa1a86e6" target="_blank" rel="noopener"&gt;6e6f342&lt;/a&gt;
 &lt;em&gt;(method-ambiguity)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;stop relying on timestamps to generate release.md by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/3b573406679d7bc47746f2ac664e642638f8fed7" target="_blank" rel="noopener"&gt;3b57340&lt;/a&gt;
 &lt;em&gt;(ci)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ci"&gt;CI&lt;a class="heading-anchor" href="#ci" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;add ci tests by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/04c41100e364163b23a1c1acab8d366d1c4973ec" target="_blank" rel="noopener"&gt;04c4110&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Merge pull request #2 from spencerjibz/add-ci by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/2" target="_blank" rel="noopener"&gt;#2&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;re-export both backtrace tracing macros by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/3d797caab91da8256332e578038f84119b42639b" target="_blank" rel="noopener"&gt;3d797ca&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;pass down removal options from queue if not specified for a job by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/be9473face1d4f14dca07a3027885fc058ef4935" target="_blank" rel="noopener"&gt;be9473f&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;efficiently pausing workers with global activity count, let workers finished all their work before pausing by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/12" target="_blank" rel="noopener"&gt;#12&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;batch pipeline commands by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/fac9673ecfce13d063b5f8830b0f4ac1845ef1a4" target="_blank" rel="noopener"&gt;fac9673&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;format spacing in readme by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/79cc9acd7a335992f5c6a872f3c05de78b3c8143" target="_blank" rel="noopener"&gt;79cc9ac&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;fix and improve ci with caching &amp;amp; using nextest by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/c696b5ce1780c70d1e0be0f72cb3765506c15b80" target="_blank" rel="noopener"&gt;c696b5c&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;don&amp;rsquo;t use release flag in ci by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/740cdda967075c814d55733ce6e8815f58d16468" target="_blank" rel="noopener"&gt;740cdda&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use keydb and improved workflow by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/62e06c4d62775a6ca74a01affdbfccad08eb3d43" target="_blank" rel="noopener"&gt;62e06c4&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use redis instead of keydb in ci by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/4bfbd339d0f3d4c5fa9453b7f6d19ecca8ff675d" target="_blank" rel="noopener"&gt;4bfbd33&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;fix ci by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/d671d70d830ca4fe1e7e0126a9431c28a275c398" target="_blank" rel="noopener"&gt;d671d70&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add the tracing crate by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/26b15a0e5886075d823cdca99a3a78021401f62c" target="_blank" rel="noopener"&gt;26b15a0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add tracing and tracing-subscriber to examples by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/67196aba48084adc5d6b31e9c95d77378a1810da" target="_blank" rel="noopener"&gt;67196ab&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;clean and add tracing to examples by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/aec1a40b61b531e17d7140d13c273314798a2e9b" target="_blank" rel="noopener"&gt;aec1a40&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;gate tracing under a feature flag and make dep optional by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/34" target="_blank" rel="noopener"&gt;#34&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;Apply code review feedback: remove explicit type in loop, drop unused return value assignment by @Copilot &lt;a href="https://github.com/KioHQ/kiomq/commit/223ecab2257574aff45ec1ac717aa7e740966ded" target="_blank" rel="noopener"&gt;223ecab&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Migrate workflows to Blacksmith by @blacksmith-sh[bot] &lt;a href="https://github.com/KioHQ/kiomq/commit/18f8dc2ce56fc8bf739bebb7a0add7a3918e617a" target="_blank" rel="noopener"&gt;18f8dc2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;run store tests in concurreny in ci by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/1386a802468fa87090c9f505cc5885673414e08e" target="_blank" rel="noopener"&gt;1386a80&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add a release-workflow by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/aab3e02b40bd704c3797c380fc5620482ea28955" target="_blank" rel="noopener"&gt;aab3e02&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;populated CD workflow file by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/51" target="_blank" rel="noopener"&gt;#51&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;add create generation to workflow by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/7b856136c8bcfbbc6dfa850860fd02e7d36f3310" target="_blank" rel="noopener"&gt;7b85613&lt;/a&gt;
 &lt;em&gt;(cd-workflow)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Fix remaining clippy errors and incorporate release-pipeline lint relaxation by @Copilot &lt;a href="https://github.com/KioHQ/kiomq/commit/652c1b6d88e4438ccd7afb63ab637289839b0827" target="_blank" rel="noopener"&gt;652c1b6&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;fix cd pipeline by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/9da2cb8ef06ab936e7458660e58a322ba4f1ad28" target="_blank" rel="noopener"&gt;9da2cb8&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add rocks build time system dependencies for publishing job by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/73c036f0f5b1619dcb68e933154f23d5a2c2c1ca" target="_blank" rel="noopener"&gt;73c036f&lt;/a&gt;
 &lt;em&gt;(cd-pipeline)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;chose better category slugs for publishing crate by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/a7a847841fcb0785f6757f8b075ecb6f78c1d75d" target="_blank" rel="noopener"&gt;a7a8478&lt;/a&gt;
 &lt;em&gt;(cd)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="chores"&gt;Chores&lt;a class="heading-anchor" href="#chores" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;cargo fmt by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/a7eb8211fdfcb66e129dde991afe5662a33b08be" target="_blank" rel="noopener"&gt;a7eb821&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add changelong with git-cliff by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/165824e6ef7485bbe9dde56bd2fe4185fff8141b" target="_blank" rel="noopener"&gt;165824e&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add author, description, links and licence metadata by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/09dfba97a0cdd7f0bde2302e13e48c19b3b280bf" target="_blank" rel="noopener"&gt;09dfba9&lt;/a&gt;
 &lt;em&gt;(cargo.toml)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;add best practice library clint protections by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/f28968cfc78f1d5a8c5da4b68ff2c26e2f183511" target="_blank" rel="noopener"&gt;f28968c&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;unused/dead_code elimination by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/dac2919540958f7e11310bdf1f1a74a225c95995" target="_blank" rel="noopener"&gt;dac2919&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add missing debug implementations by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/6015372f105c8ff4b78eb5de348c2b1dccf109ae" target="_blank" rel="noopener"&gt;6015372&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;only expose few methods publicity &amp;amp; tracing vital calls by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/2b79b7cb48f5dbed997da908e6d602f2ee9a9578" target="_blank" rel="noopener"&gt;2b79b7c&lt;/a&gt;
 &lt;em&gt;(queue)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;add more tracing spans by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/fa75a53365b629caf6fdca1417ce9176e45d8cbe" target="_blank" rel="noopener"&gt;fa75a53&lt;/a&gt;
 &lt;em&gt;(tracing)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;manual clippy &amp;ndash;fix by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/31456a6d4d353d6b888f29a2f78a19a5bf46d5fe" target="_blank" rel="noopener"&gt;31456a6&lt;/a&gt;
 &lt;em&gt;(clippy)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;more docs in worker_opts by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/d5618261f095ff1c5355bc72f1cb8a03da478f42" target="_blank" rel="noopener"&gt;d561826&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;relax some lint constricts by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/0967db795f046d34f70e1c349dab4286d440c389" target="_blank" rel="noopener"&gt;0967db7&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;fix lint warnings in tests by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/24dd862eead2ca49a8cacb7d05af6297d3ef750a" target="_blank" rel="noopener"&gt;24dd862&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add clippy:nursery recommendation &amp;amp; fmt by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/52" target="_blank" rel="noopener"&gt;#52&lt;/a&gt;
) &lt;em&gt;(clippy)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;use the right branch for releases by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/f4f4c63b509edf4238c7958e3a3d12c8dc54aad3" target="_blank" rel="noopener"&gt;f4f4c63&lt;/a&gt;
 &lt;em&gt;(cd)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;use real sermver version of crates by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/a6e8f5847f7bb26e805a4cf812082b6438737066" target="_blank" rel="noopener"&gt;a6e8f58&lt;/a&gt;
 &lt;em&gt;(cargo)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;use real sermver version of crates by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/5c96437bd46317bbb7af6a4bb608200f6bb9e539" target="_blank" rel="noopener"&gt;5c96437&lt;/a&gt;
 &lt;em&gt;(cargo)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="documentation"&gt;Documentation&lt;a class="heading-anchor" href="#documentation" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;add readme by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/7458a6a0b784d1eab39ef0da31edba0916087380" target="_blank" rel="noopener"&gt;7458a6a&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;update readme by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/4ea95576f5a74b2ede636c4c25a191a0c54aa9df" target="_blank" rel="noopener"&gt;4ea9557&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Update README.md by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/69c92b5aff4628353b59b8c84cd2c1933963ac3b" target="_blank" rel="noopener"&gt;69c92b5&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Update README.md by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/2c1749af1ad00a02329a6e7872fbe0da6df60bc2" target="_blank" rel="noopener"&gt;2c1749a&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;update readme to reflect current developement progress by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/d19d9cc15b9640b28fc3c4dbee5618aedfb81c59" target="_blank" rel="noopener"&gt;d19d9cc&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Update README.md for clarity and formatting by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/975378240136b6fdc44c774f5c4cbc5476529bb0" target="_blank" rel="noopener"&gt;9753782&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;update Readme by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/f5836691ad49548a13621cc6cb8e19b6faa7b507" target="_blank" rel="noopener"&gt;f583669&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add extras to readme by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/45" target="_blank" rel="noopener"&gt;#45&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;Add logo and project overview to README by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/6e40043bbd61bd757bd7557fed656e607660777b" target="_blank" rel="noopener"&gt;6e40043&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Add comprehensive Rustdoc documentation across the kiomq codebase by @Copilot &lt;a href="https://github.com/KioHQ/kiomq/commit/a62c4b7e2333c291bb60ae7bd3e1a768127c0c45" target="_blank" rel="noopener"&gt;a62c4b7&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Add Rustdoc for RedisStore struct, fields, and public methods; doc fetch_redis_pass and get_queue_metrics by @Copilot &lt;a href="https://github.com/KioHQ/kiomq/commit/b9c4640d5baffa74b6469ed0b3924eb7094478d6" target="_blank" rel="noopener"&gt;b9c4640&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Fix updating_metrics bug in README examples and add panics/framed section by @Copilot &lt;a href="https://github.com/KioHQ/kiomq/commit/decbf13a49993061803aac4670eed58f748337ca" target="_blank" rel="noopener"&gt;decbf13&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add doc comment and example to the framed re-export in lib.rs by @Copilot &lt;a href="https://github.com/KioHQ/kiomq/commit/7c1eb18f799c1ee329b18d1263222822614722b8" target="_blank" rel="noopener"&gt;7c1eb18&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;condense README to match lib.rs conciseness (44% shorter) by @Copilot &lt;a href="https://github.com/KioHQ/kiomq/commit/4fbc36347436c0bcb581ef2284620d7d1a05d030" target="_blank" rel="noopener"&gt;4fbc363&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;restore Progress updates section and improve Panics &amp;amp; errors wording by @Copilot &lt;a href="https://github.com/KioHQ/kiomq/commit/71c7dc7569bdbc8360f3bc461170c85cd77612bb" target="_blank" rel="noopener"&gt;71c7dc7&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add compact table of contents to README by @Copilot (&lt;a href="https://github.com/KioHQ/kiomq/pull/50" target="_blank" rel="noopener"&gt;#50&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;Fix clippy warnings: visibility, casts, docs, match arms, async, and more by @Copilot &lt;a href="https://github.com/KioHQ/kiomq/commit/db811ff53f93256270d894b10e4161f735120a60" target="_blank" rel="noopener"&gt;db811ff&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;typo by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/d221802c14cb494da1afa1ab1e786129c9c59684" target="_blank" rel="noopener"&gt;d221802&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="features"&gt;Features&lt;a class="heading-anchor" href="#features" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;add basic required deps by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/3405f0a26b87c07ab8e102383302496a159b8cdc" target="_blank" rel="noopener"&gt;3405f0a&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add simple queue impl with a job queue too by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/7ee4ec852d3575f54a154db188be45c5ecdb9e8f" target="_blank" rel="noopener"&gt;7ee4ec8&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add job progress updating by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/f64948eb8aa89d6fafc9dc2077fb1e8e4d06ba75" target="_blank" rel="noopener"&gt;f64948e&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add base worker by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/db9b270cf5a02d054971e03d6dfa0e0fb4516c2c" target="_blank" rel="noopener"&gt;db9b270&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add timer implementation by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/34188fa9c49bd904a53f2dc0f64c32356c30ad43" target="_blank" rel="noopener"&gt;34188fa&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add worker options by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/7519a91256dcc5920251d0a07d3546ea10035564" target="_blank" rel="noopener"&gt;7519a91&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add backtrace_capture utils by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/8626a5a3f7950f897f33669df514f10e33a1d915" target="_blank" rel="noopener"&gt;8626a5a&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add more utils to wokrer by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/694ecf3ba8f91526d729a11568e8a8445c150d5c" target="_blank" rel="noopener"&gt;694ecf3&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add timer queue functions by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/cbed76ebc1d877b7c3ebedf772f255110f560267" target="_blank" rel="noopener"&gt;cbed76e&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add timers to worker by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/9121195f45478183d2436abf06d2ff7a0d09da46" target="_blank" rel="noopener"&gt;9121195&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add support for storing stacktraces and errors separately by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/6677dd6821346d7fe5d0e4e706fa3cc0ec9b56e2" target="_blank" rel="noopener"&gt;6677dd6&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add events to queue &amp;amp; worker by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/4" target="_blank" rel="noopener"&gt;#4&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;support queue-obliteration by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/c15895571f7923ed60973f1ceebb84e65289ea18" target="_blank" rel="noopener"&gt;c158955&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add backoff utils by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/dabd8f13ee23fe33b714f3002d8c6d2375b21c70" target="_blank" rel="noopener"&gt;dabd8f1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add joinError to KioError type by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/e09d35be247edfc10b1eb7246c3c976efc945a4c" target="_blank" rel="noopener"&gt;e09d35b&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add working video_transcoding-example by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/9dd62c4075b735cd89b3b92e6660c2ccea566235" target="_blank" rel="noopener"&gt;9dd62c4&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add job options with delay by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/d90d537178bacb90b5c34ce921a1d6c924ccd1d7" target="_blank" rel="noopener"&gt;d90d537&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add priority to job_data and priority helpers by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/922e358bed10e265313c66daef1b2d8fa53f7ed6" target="_blank" rel="noopener"&gt;922e358&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;enable scheduling without a seperate timer by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/8aa3e2cc3c02389cdce81dc60f9fa8c011c99cbf" target="_blank" rel="noopener"&gt;8aa3e2c&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add the right job status for delayed jobs by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/9" target="_blank" rel="noopener"&gt;#9&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;add delay field to event_stream by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/b73346ee0ce83b90dc87e2debe1df8164b884d7d" target="_blank" rel="noopener"&gt;b73346e&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add and move events into their own module by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/75d93f1e3654e5d837f54ae19baca588c21c80c0" target="_blank" rel="noopener"&gt;75d93f1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add stream-listener-task by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/1474263cff8a28ab3032422f058475ac4ae33187" target="_blank" rel="noopener"&gt;1474263&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add queue-stream-event by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/6ab4b9a3f0d0e50d518e6b6c2b6c247ce6fffcc3" target="_blank" rel="noopener"&gt;6ab4b9a&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add job-removal options by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/b2d6bb20d39b97400998f69f2a3a34cdf4ff58d8" target="_blank" rel="noopener"&gt;b2d6bb2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add tokio-console by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/65e8fb1134f7d355b743b18e3e7443842b3b2009" target="_blank" rel="noopener"&gt;65e8fb1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add queue options to example by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/839faac9a1591fe6c5ba8507ce4340b8ad834271" target="_blank" rel="noopener"&gt;839faac&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add support for bulk_add by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/4840b76b2bbb4c2e5677e7e92804c44780447f52" target="_blank" rel="noopener"&gt;4840b76&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add task-notifiers &amp;amp; waiting-job-count to metrics by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/edcf098e5fb688f05b5476cf983252f93b0829e7" target="_blank" rel="noopener"&gt;edcf098&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add methods to bulk add jobs with returning them by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/a1b9d6754fe442c35cf85dddf287a443d2ad2f62" target="_blank" rel="noopener"&gt;a1b9d67&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add proesssing to JobState and clean up events by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/855f64cb6f7e8becd5c4da4bbcba0f29b9321c30" target="_blank" rel="noopener"&gt;855f64c&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add repeat opts with cron support and test them in example by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/2504142d2e756b109c1fdc986c4f472c384cf05c" target="_blank" rel="noopener"&gt;2504142&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add support for cron as inital delay by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/c20932c87e9b268d16a34386fd626486b0c6e894" target="_blank" rel="noopener"&gt;c20932c&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add obliterate as an event, rm prioritized collection on obliteration by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/7e20e2be4a880e6878650ee050abf90e95aed4db" target="_blank" rel="noopener"&gt;7e20e2b&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add sample queue tests by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/8aab52feff5ce833addffc550bedc1e3ecd42cbb" target="_blank" rel="noopener"&gt;8aab52f&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add worker state as an enum by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/dc542d3116c461bbd2d5ee90e8d6b252210e09cb" target="_blank" rel="noopener"&gt;dc542d3&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add worker tests by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/6ebecf2030f31434442c165457ee99be413bf449" target="_blank" rel="noopener"&gt;6ebecf2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add client to queue, support both favours of processors (sync and async) by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/9039e2b599f53da7d95011c8dac839a3fca48a5f" target="_blank" rel="noopener"&gt;9039e2b&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add nextest-config file by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/28b11cc14179153ff3cc849c6f476148fbf9d613" target="_blank" rel="noopener"&gt;28b11cc&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add async-trait by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/981a0ce40e783eb7a3856da48aeccaef3fbec6a1" target="_blank" rel="noopener"&gt;981a0ce&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add store to examples by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/c1e630863443d1bad200aa66b96a9d208d155e70" target="_blank" rel="noopener"&gt;c1e6308&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add rocksdb as a store with a feature flag by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/74f9a921e2347c20e58d7eb3e24c6a8ac50aa41f" target="_blank" rel="noopener"&gt;74f9a92&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add basic example with redis-store by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/c2020691c2b06fc296117ffe7a87e69bff8f6a8d" target="_blank" rel="noopener"&gt;c202069&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add an in-memory-store and its example by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/0ed568d855b3dcca3a7c7fae07effc60a2242c15" target="_blank" rel="noopener"&gt;0ed568d&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add timed-map to use in the in-memory-store by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/26b8169d9b5b95342cc0c8bbf0ed94792fa9925a" target="_blank" rel="noopener"&gt;26b8169&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add timed locks to both stores by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/101be3d5c43b263185dca2a05819b91585448bb5" target="_blank" rel="noopener"&gt;101be3d&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;implement store.remove for in-memory-store &amp;amp;&amp;amp; fix typo in JobState enum&amp;quot; by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/1725ff9e3433af8ef1026ff115b0ed94af0a24b1" target="_blank" rel="noopener"&gt;1725ff9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add some utility functions by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/da06fb8e38ea8af6b12161c08fbf7d60749698bd" target="_blank" rel="noopener"&gt;da06fb8&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add more fields to job-metrics by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/8bf8942b3f2a66b55ef6796605f3e6afb3809cee" target="_blank" rel="noopener"&gt;8bf8942&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add support for purging expired entries for store by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/0f0f12bd44283addfb6a741bf82e5c2ab286901f" target="_blank" rel="noopener"&gt;0f0f12b&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add job metrics to complated event by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/64b6b6d6efd8d3b317988f5bfcd5d902eef297c9" target="_blank" rel="noopener"&gt;64b6b6d&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;enable disabling expirations on customTimedMap by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/0a84fded42fc21617f54cd69cf01ba5554033787" target="_blank" rel="noopener"&gt;0a84fde&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add delay from options to job_metrics by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/30" target="_blank" rel="noopener"&gt;#30&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;add resoure span to the worker by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/b152f984b7981b2e602a0a30b73f87a47d944224" target="_blank" rel="noopener"&gt;b152f98&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add logging to main_task and bug fix: stop main_loop on cancellation by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/c3d861381e85d575a1a7b8316b6592567a5b8c4e" target="_blank" rel="noopener"&gt;c3d8613&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add logging to timers by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/dcf507011c5f6b936649f6996c45befdd7d1e60c" target="_blank" rel="noopener"&gt;dcf5070&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add logs and remodel loop and timer to promote delayed jobs too by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/d2b096fe7e07bcfb0904f9bebca96d8646b61521" target="_blank" rel="noopener"&gt;d2b096f&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add a resource-span to queue by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/e9b0caedc8fb94e6136cf2da33024af0cbaf9b2c" target="_blank" rel="noopener"&gt;e9b0cae&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;issue-templates by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/b4c02df07810c216afb965e6d50bd2521fba718a" target="_blank" rel="noopener"&gt;b4c02df&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add criterion benchmarks using inmemory-store by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/75c342772da85081983c3624354bc9f8436e1ac4" target="_blank" rel="noopener"&gt;75c3427&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add an action for crition benchmarks by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/8bdaca11f8f35c1006a7eac6f06a955a73489cf2" target="_blank" rel="noopener"&gt;8bdaca1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add missing meta-data for action by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/0c911e173a7b0baeb9df95ffebbde7cd4edeec3b" target="_blank" rel="noopener"&gt;0c911e1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add permissions for action to post results by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/39" target="_blank" rel="noopener"&gt;#39&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;add tests for panics in processors by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/893fc3392fbf37e6cd15515c0e4a4d234d514d78" target="_blank" rel="noopener"&gt;893fc33&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add tokio-metrics as a dependency by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/639e34a52a1a650ed9bf74c2bdd0255b1a0bb362" target="_blank" rel="noopener"&gt;639e34a&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add worker_metrics collection to worker and setup periodic heartbeat/collection timer by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/8c760dce47ca28c5db7cf37a158388528aaf06dc" target="_blank" rel="noopener"&gt;8c760dc&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add metrics collection to in-memory-store by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/a11d63c0470675de5f351daf1ed3a2822ccb73ab" target="_blank" rel="noopener"&gt;a11d63c&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add metrics collection for redis-store by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/e0c6a4e4c26bd8a050401dc32dcf0e807754660c" target="_blank" rel="noopener"&gt;e0c6a4e&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add timestamps to track metrics updates by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/cab75f0e1597f924fffb3ee17a938be46bb28046" target="_blank" rel="noopener"&gt;cab75f0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add asset folder with logo by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/5ec1bf93e6673a4af00eeb786abcebf70b66a50e" target="_blank" rel="noopener"&gt;5ec1bf9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add a helper macro for worker_tests by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/2a6158d319f4f1ad497c2d85464ba92fe2575134" target="_blank" rel="noopener"&gt;2a6158d&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add isolated tests for each store (inmemory or redis-store) by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/2aeedc956f5fd327e2d712e375762cfd40c60ead" target="_blank" rel="noopener"&gt;2aeedc9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add helper macros for queue-tests for diffrent stores by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/e970dc649a9e890c89f32b452ad66fb78f97d3d9" target="_blank" rel="noopener"&gt;e970dc6&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="other"&gt;Other&lt;a class="heading-anchor" href="#other" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Initial commit by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/0da1a6c4b2f8cfe3d37d282fe1a52a23920ac031" target="_blank" rel="noopener"&gt;0da1a6c&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;rust library template &lt;a href="https://github.com/KioHQ/kiomq/commit/32dfa0a3a97be89cd2768744693eeedc7fe66f47" target="_blank" rel="noopener"&gt;32dfa0a&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;base job impl by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/c1646b9a8c331cc8e96b74fa9804f9d96e3add15" target="_blank" rel="noopener"&gt;c1646b9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;remove custom field-serializers by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/aae3824d9b660488d3e872daa8166b2e2aa18cdc" target="_blank" rel="noopener"&gt;aae3824&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use dashmap and use owned values by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/fad0c4d28445e045d83a9826e0331bc7679fd8d2" target="_blank" rel="noopener"&gt;fad0c4d&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use some generics for queue methods by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/43a7b4739f293a5f8142dd84ab4138b1299bf4fc" target="_blank" rel="noopener"&gt;43a7b47&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;wip by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/82c12f1de50ef80a5f4d2f96c76609aecaf44f06" target="_blank" rel="noopener"&gt;82c12f1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;reorganise modules and supplement worker by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/c414985b2af3082628572102076a4fcb7039a232" target="_blank" rel="noopener"&gt;c414985&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;clippy fix by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/110e3b92240a0e8e3df5cfaa8f105dda00e8c313" target="_blank" rel="noopener"&gt;110e3b9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Merge pull request #1 from spencerjibz/base-impl by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/1" target="_blank" rel="noopener"&gt;#1&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;ignore panic_test in backtrace_utils by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/ad436a99e15b21e0dfa653a1364b83d53dab5f77" target="_blank" rel="noopener"&gt;ad436a9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;make timer simple by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/6e4830a04be573e71dc0a0c5a5ab2140831d35c9" target="_blank" rel="noopener"&gt;6e4830a&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;minor fixes by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/d1d36de0fa5f3e5b9bc0a41fdba23277f3ad9fb5" target="_blank" rel="noopener"&gt;d1d36de&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;complete running worker with panic catches by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/4c13f3fe6f6191695d399daec5130dc5e8297117" target="_blank" rel="noopener"&gt;4c13f3f&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use an serializable backtrace by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/26830bf87d8989a512cecf22f82dc8ec477fca16" target="_blank" rel="noopener"&gt;26830bf&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;remove unecessary deps and use std version of backtrace by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/3bba1778859baa24e24879cf0523533f55ac1be8" target="_blank" rel="noopener"&gt;3bba177&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;create similar stacktraces by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/61f9702b6714ea5f96843f755defce5bff265351" target="_blank" rel="noopener"&gt;61f9702&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;clippy fix by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/19267d77493f2ab088ecf70fb139cc8220e7b963" target="_blank" rel="noopener"&gt;19267d7&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Merge pull request #3 from spencerjibz/working-runner by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/3" target="_blank" rel="noopener"&gt;#3&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;readme edit by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/1d6a267359d5c74720b87ba044336ce9688f9748" target="_blank" rel="noopener"&gt;1d6a267&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;make job_state serializable from redis by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/77d94a640f6048feb38cd41c26c475e209b0ee27" target="_blank" rel="noopener"&gt;77d94a6&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;remove arc-swap by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/570f33edc97a6090d2c3b0c7ef472a5057c06799" target="_blank" rel="noopener"&gt;570f33e&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;expose the worker&amp;rsquo;s cancellation token by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/6474c44ef78e22bdf347c2e3cd417b846718f965" target="_blank" rel="noopener"&gt;6474c44&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;access the current job count from queue by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/d95fabfb6212f15260367cfe381ad0cba7e8fa18" target="_blank" rel="noopener"&gt;d95fabf&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;serialize datetimes as microsecond timestamps by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/de2ccfe0777579e34d29c585b7ec47a4359458b5" target="_blank" rel="noopener"&gt;de2ccfe&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ignore video files by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/d79837d3290207ed9cef1fd493871d8cd35cde8d" target="_blank" rel="noopener"&gt;d79837d&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;improve backoff and add a method to fetch metrics to a job by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/149862b62130454fb05d9da7dc2510b9c3358a08" target="_blank" rel="noopener"&gt;149862b&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;create a sample video file if none exists by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/5" target="_blank" rel="noopener"&gt;#5&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;Next stage (#6) by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/6" target="_blank" rel="noopener"&gt;#6&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;clean up after running transcoding by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/cc9af5145459fbffe73621fceafbed37f08522d1" target="_blank" rel="noopener"&gt;cc9af51&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;download and install ffmpeg if its not available (#8) by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/8" target="_blank" rel="noopener"&gt;#8&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;simple code refactor by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/5a73a8ffa16f1711c793c3dfd4ab961dcedf2602" target="_blank" rel="noopener"&gt;5a73a8f&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add support for skipping first_tick by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/dfd8f298078330ba2e3179e991026328a264521c" target="_blank" rel="noopener"&gt;dfd8f29&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;job-schedulering-timer template by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/6379443cb45caeaf867740600d04c290199bba33" target="_blank" rel="noopener"&gt;6379443&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;set concurrency to number of logical cpus by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/c3601b89b68b5c26ad1ca6ada44804be520e4cdc" target="_blank" rel="noopener"&gt;c3601b8&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;set number of cpus as default concurrency option by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/bd26ab4e17b3c2259c62242658ebc905119881fc" target="_blank" rel="noopener"&gt;bd26ab4&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;better delay support by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/1fa6f20a83a52ed16aa052f558a713bc02b0d65d" target="_blank" rel="noopener"&gt;1fa6f20&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;completed impl by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/732da55c865f364e5b002508d1bc97984c453148" target="_blank" rel="noopener"&gt;732da55&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;only remove jobs if found by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/a1ef2b3baa6cff78cb996494ec94944dc84a4678" target="_blank" rel="noopener"&gt;a1ef2b3&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;make move_to_active_result debug printable by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/375f1e7ed99d4cc8a490c657742821a83b35077c" target="_blank" rel="noopener"&gt;375f1e7&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;re-use timer for scheduling delayed jobs, remove futures_concurrency primitive for running task by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/345de475f5aa28ee8902d9975cd1779dedbe5e97" target="_blank" rel="noopener"&gt;345de47&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use crossbeam queue, yield in busy loops to prevent race conditions by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/c3aa1159ae14322c702fc4df41f66f92a0d7259e" target="_blank" rel="noopener"&gt;c3aa115&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;emit progress to stream when it&amp;rsquo;s updated by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/a9c9c52bed06e6fdadd22f4cb37ce53ec1c7d121" target="_blank" rel="noopener"&gt;a9c9c52&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;emit events directly from redis-streams by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/10" target="_blank" rel="noopener"&gt;#10&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;rebase conflict fix by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/de77c24b00795a52d1aa66961874fcea691a2665" target="_blank" rel="noopener"&gt;de77c24&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;add live metrics and opts to the queue by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/85368ce08e685c4b0e6c5fb91dc83469546575d7" target="_blank" rel="noopener"&gt;85368ce&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;remove dashmap, completely lockfree impl by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/0a0159b039dfdf226fcae8d3a060727d9f831e57" target="_blank" rel="noopener"&gt;0a0159b&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;update example to support all job features: delaying, prioritization by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/1f2bac8299eb4458b58be80ad67f8d433bcb9c94" target="_blank" rel="noopener"&gt;1f2bac8&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;clean up by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/18feb2da06cd11d69bdcee4d1130bf4a847c408b" target="_blank" rel="noopener"&gt;18feb2d&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use lockfree version of typed-emitter by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/23964208093b68e318a996dd670d065c1735bb1b" target="_blank" rel="noopener"&gt;2396420&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;update uuid:dep by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/53322e2ed7956eca0d947c08295f47cd249eab9d" target="_blank" rel="noopener"&gt;53322e2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;boxed some futures to reduce their size by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/b05890eb4d5342d6cb5817eb2a6d6e934cd09746" target="_blank" rel="noopener"&gt;b05890e&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;wip by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/f5ba7b020fad25fc9afc864796aaae0c690c1e9d" target="_blank" rel="noopener"&gt;f5ba7b0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;only return joinhandle if timer is running by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/a7254fc551e541b5906d54c754bb011b0d6d39d2" target="_blank" rel="noopener"&gt;a7254fc&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Revert &amp;ldquo;fix retrials &amp;amp; remove crossbeam-skiplist&amp;rdquo; by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/d9a236eb30a25d244ee276e42ef1bb240d84f206" target="_blank" rel="noopener"&gt;d9a236e&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;prioritize delayed jobs by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/c28393597ee4bfefe9623f638e82f55c3906eccd" target="_blank" rel="noopener"&gt;c283935&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;fail jobs that miss delay reschedule by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/34982c9ea884fef218913e505272dfa938d6a5a4" target="_blank" rel="noopener"&gt;34982c9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;reduce cpu usage during idle times by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/ba7b4413a759b70d82acfe7949899213a04cfd79" target="_blank" rel="noopener"&gt;ba7b441&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;make timers pausable by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/569b4233c59f943d81baea40e3705e28b6c2a7ae" target="_blank" rel="noopener"&gt;569b423&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;pause both timer when queue and worker are idle by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/8a6e9b950b914adfe68ad3d68c9a67fe01b4adef" target="_blank" rel="noopener"&gt;8a6e9b9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;improve examples by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/7856f22837563fcc7b3e57bb2bc5b3142fab139c" target="_blank" rel="noopener"&gt;7856f22&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;reduce string usage by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/979c1e094b7662f3cefd8f7f59fd888183d08819" target="_blank" rel="noopener"&gt;979c1e0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Support either pubsub or redis_stream as queue-event-stream by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/68c16dc0ef205853adeef416d92f8beae3e1e1ae" target="_blank" rel="noopener"&gt;68c16dc&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;wip by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/ab5da6ae371233f0627a6ba9143465c132460cd0" target="_blank" rel="noopener"&gt;ab5da6a&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;refactor and cleanup by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/a1104efc7de68310656828235ac787e6d2ef9445" target="_blank" rel="noopener"&gt;a1104ef&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;support for both modes by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/39457969b938e94a5f722bbcf6f1f3781ceeb2b5" target="_blank" rel="noopener"&gt;3945796&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use simple types in job and queue by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/a7733f13cf5154d9489fd03edf9a7c62f75aa922" target="_blank" rel="noopener"&gt;a7733f1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;wip by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/6754e9f78be8adc58f0c955eaf0707e08e6f375c" target="_blank" rel="noopener"&gt;6754e9f&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use simd_json by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/693813307f273c15a58635040e860e057d041cae" target="_blank" rel="noopener"&gt;6938133&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;cheap parsing when using redis-stream-events by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/4144ac22450dc463313c440561ceb1521abeb3b4" target="_blank" rel="noopener"&gt;4144ac2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;restore examples by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/e4c15775d2bb43ad857445a1601db95be7034b74" target="_blank" rel="noopener"&gt;e4c1577&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;make bulk_add faster by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/5c8ff95b105fbf72f349ae04a3f302f06e8efd5c" target="_blank" rel="noopener"&gt;5c8ff95&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;clippy fix by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/06521b4af96736d5917218c0041a26402b2b9dc4" target="_blank" rel="noopener"&gt;06521b4&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;repeat-opts-working progress by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/38f3a4f758ec769be1175f5ccbc671533d216502" target="_blank" rel="noopener"&gt;38f3a4f&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;simple fixes by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/1592c5af5bac3b70e9d3c7d3649bdbd2aa43e4b4" target="_blank" rel="noopener"&gt;1592c5a&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;increment ids correctly by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/6d44ee71747af38c5d538894a8508d9e301ac072" target="_blank" rel="noopener"&gt;6d44ee7&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;update examples by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/00129bf17d8c200bf116baee3cda618e3b76cd49" target="_blank" rel="noopener"&gt;00129bf&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;code refactor by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/13" target="_blank" rel="noopener"&gt;#13&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;update the job_id after addition by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/f27f96e9893e1c29cb7053f7bee792c599489eaf" target="_blank" rel="noopener"&gt;f27f96e&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;more queue tests by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/339f4d8ab745aeb995cddb34d7f9a41f81a3c78a" target="_blank" rel="noopener"&gt;339f4d8&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;:emitter_on is not an async function: correct this by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/538a2819d5bea1d5a36ed8d13d6681d6cc31c188" target="_blank" rel="noopener"&gt;538a281&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;remove tokio_shared_rt and use a multithread runtime for worker tests by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/060620ac395f713024e9ae677638cba822865d30" target="_blank" rel="noopener"&gt;060620a&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;fetch number of cpus by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/3ed68b13c2084399523b3bbfbcd7db3aa0b809f4" target="_blank" rel="noopener"&gt;3ed68b1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;support both sync and async callbacks by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/a26d72f581a04f4e3e8a303edb2b9f69486ea46d" target="_blank" rel="noopener"&gt;a26d72f&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;update examples and tests by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/44d9e7590fafc86b9d9596257f8b3b61fbaed0ed" target="_blank" rel="noopener"&gt;44d9e75&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;reorganise code structure by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/e72038a9b8c725ac3f983e14b49765e5cb4c8012" target="_blank" rel="noopener"&gt;e72038a&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;make job-update progress sync by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/54ab3a461d3c914f29b5d790fda479c97f5f476d" target="_blank" rel="noopener"&gt;54ab3a4&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;update examples by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/0efb189c1ca560bba54cb57bded0247f1457c3e0" target="_blank" rel="noopener"&gt;0efb189&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;restore connection-example by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/0728dcc65ba86f8a93e22c0421c938db7eefc7b8" target="_blank" rel="noopener"&gt;0728dcc&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Format README.md with proper headings and lists by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/b83ec7e0ba77358d9b2dc0e4faa87eaeaaff96c0" target="_blank" rel="noopener"&gt;b83ec7e&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;make all errors public and the worker&amp;rsquo;id by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/8ef613feea67fad962486bf103fd7da0ed23705b" target="_blank" rel="noopener"&gt;8ef613f&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;return an error if a worker is already running and a called to run is made by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/23dc2cdb8a69dfc871638e6a52f7f455d40054c1" target="_blank" rel="noopener"&gt;23dc2cd&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;make CollectionSuffix enum and worker_state field pub by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/5c07d40465fb5ceef6e3ab72d3de6d0c7793959b" target="_blank" rel="noopener"&gt;5c07d40&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;create a store trait and a redis store by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/438f627c5c4ab9ad50e57c276ded250b5280ad58" target="_blank" rel="noopener"&gt;438f627&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;clean up and use dynamic store logic in queue-impl by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/a131a23e0ae78bff10d888637bc4d0312d108836" target="_blank" rel="noopener"&gt;a131a23&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;refactor to use dynamic stores by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/ddae040fcbfeddfa7f25337507b5dfedfc8441df" target="_blank" rel="noopener"&gt;ddae040&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Integrate the Store trait into queue, worker and utils function by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/60ccf6e8068d20552793dd0784df505c943fb37c" target="_blank" rel="noopener"&gt;60ccf6e&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;update tests with store by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/8d2cd80d2241b7074b1b7b6cf325194a5a4021ad" target="_blank" rel="noopener"&gt;8d2cd80&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;clippy fix by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/47f6a30d9dddd1876e2d89101eec6b47001af465" target="_blank" rel="noopener"&gt;47f6a30&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;make collectionSuffix serialized as an u64 tag by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/86efd8bd6a20c298db9558a2974556c3fd5baa2c" target="_blank" rel="noopener"&gt;86efd8b&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;move event-stream-handle creating from store implementations by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/2762b503b5ff36c7dc3de83aff6448dfb3436b0a" target="_blank" rel="noopener"&gt;2762b50&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;complete Store trait impl for redis-store by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/eee2409005179bf3426be9a66e206bfb19e360d5" target="_blank" rel="noopener"&gt;eee2409&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;dont run rocksdb-example in tests by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/29ffc9970eaa3852707626f79261585c575656e4" target="_blank" rel="noopener"&gt;29ffc99&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;yield in task picker by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/e32a34fdfe10b00e038108d42786301ddf0f7aee" target="_blank" rel="noopener"&gt;e32a34f&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use parking_lot primitives instead by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/16" target="_blank" rel="noopener"&gt;#16&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;simple improvement to in-memory-store by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/41b36546cfcc357516877884df2fdc7918b0b446" target="_blank" rel="noopener"&gt;41b3654&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;refactor store.set_fields and move the &lt;code&gt;move_to_state&lt;/code&gt; method out of the store by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/2b1467a98980fa7530ba57dbdb4d7a625046ea70" target="_blank" rel="noopener"&gt;2b1467a&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;clean and reduce store methods by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/ecb50b4848dca2bae982f14ad9fe7dab8f3aa9ad" target="_blank" rel="noopener"&gt;ecb50b4&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;expose important methods from store by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/51f8715cd98e7ed23da62e3a4361890ed61f83ce" target="_blank" rel="noopener"&gt;51f8715&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;clean up events &amp;amp;&amp;amp; split functions in utils by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/61aebeba576a4400e73c447af55448aea664e5f6" target="_blank" rel="noopener"&gt;61aebeb&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;remove stream-handle, use emiiter directly to publish events for rocksdb and in-memory-store by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/506da8bce14dfceb7d4ebe5ab641500d20c6f9b2" target="_blank" rel="noopener"&gt;506da8b&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;clippy fix@ by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/61d5a389b1452453e45dd083121523eca5451121" target="_blank" rel="noopener"&gt;61d5a38&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use a checked insert method by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/fc8040156e901aa0a9fad15545a118b9c1322834" target="_blank" rel="noopener"&gt;fc80401&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use a delay-queue for timers instead of spawning task (previous timer) by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/18" target="_blank" rel="noopener"&gt;#18&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;use tasktracker, add graceful shutdown by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/19" target="_blank" rel="noopener"&gt;#19&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;make redis-store optional by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/88c960ee24846e58443629d87f9c1df114140f7b" target="_blank" rel="noopener"&gt;88c960e&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;make redis-store a default feature by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/a6cfee36c0fdc0b2d85f075dda9eeb40dd0ea336" target="_blank" rel="noopener"&gt;a6cfee3&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;merge similar examples into a few with feature flags by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/21" target="_blank" rel="noopener"&gt;#21&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;use new timedmap by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/183a2f953aa422af6825cdc7e58505eb4cb2ee0b" target="_blank" rel="noopener"&gt;183a2f9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;only purge expired when ther e is some expiring soon by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/9f762972e5f9c850c6bf1dc2a65001d544b2784b" target="_blank" rel="noopener"&gt;9f76297&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use atomiccell instead of arc-swap and use tokio-mutex for timed-map by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/183919d4402112a384977830f9874ecab4f2080c" target="_blank" rel="noopener"&gt;183919d&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Refactor set_key to use Key directly by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/f14b97c6a2844493123cd0cfcac686876df3bd95" target="_blank" rel="noopener"&gt;f14b97c&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;clippy fix &amp;amp;&amp;amp; reduce critical section for race condtion (when both mutexes are held by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/785879bdc9a1d5c41d4bea69548a490e9fba50e7" target="_blank" rel="noopener"&gt;785879b&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;purge both locks and jobs concurrenctly by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/923ecd3fcc785ff614fd5a13f47751fc58dee6ee" target="_blank" rel="noopener"&gt;923ecd3&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use length in purge_expired: inMemory by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/f13468e9d30ada653544b82e2f0cdfdbf5e9e508" target="_blank" rel="noopener"&gt;f13468e&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use a better and faster mutex by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/22" target="_blank" rel="noopener"&gt;#22&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;remove job from events, update examples and tests to reflct this by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/0e09ab3a0b9484d08064eebcf6a5539bab3980d5" target="_blank" rel="noopener"&gt;0e09ab3&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;minor bug fixes(panics) too by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/d34e460c4a436d2ec5299a66038f925a4e60312a" target="_blank" rel="noopener"&gt;d34e460&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;update tests by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/23" target="_blank" rel="noopener"&gt;#23&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;clippy fix in examples by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/6872fb591198714a16078e9dfdcfe3e294416248" target="_blank" rel="noopener"&gt;6872fb5&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;minor changes by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/24" target="_blank" rel="noopener"&gt;#24&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;only use async version of xutex::Mutex by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/ad0c3706e1fb1f05314a9603fae208b718db1526" target="_blank" rel="noopener"&gt;ad0c370&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use semaphore to limit concurrency by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/25" target="_blank" rel="noopener"&gt;#25&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;update queue-metrics in rocksdb-store by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/33" target="_blank" rel="noopener"&gt;#33&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;clean up main loop by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/7a98d6f0fa30b1d9dbf1e459af218ecf65ead20f" target="_blank" rel="noopener"&gt;7a98d6f&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;wip by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/6d761d94ed1407bd71af6d0f2ae60287d3c699f3" target="_blank" rel="noopener"&gt;6d761d9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;clippy fix by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/2e420b5e12c83429b71c8a9c9e083dc18d34927f" target="_blank" rel="noopener"&gt;2e420b5&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;reduce verbosity of logging and refactor smt by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/85e4b7241e4353df89f5cf884c6497b857b97230" target="_blank" rel="noopener"&gt;85e4b72&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;more logging by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/aab3733b86230db2e906aa516c7a4436d03e3ede" target="_blank" rel="noopener"&gt;aab3733&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;uncomment tokio-console directives by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/f60217fa80b40a866c836883d66029ad99da32b9" target="_blank" rel="noopener"&gt;f60217f&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;store joinhandle of running tasks instead of their ids only by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/8545cd5c56fb7a6b46dd9d5b6e730dc232a10dca" target="_blank" rel="noopener"&gt;8545cd5&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;better debug formating for TimerType::PromoteJob by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/36f672ae28512abfdaea8b6e788120ac80b92a06" target="_blank" rel="noopener"&gt;36f672a&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PR template by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/36" target="_blank" rel="noopener"&gt;#36&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;main_loop fix: only proceed processing if a permit is available by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/37" target="_blank" rel="noopener"&gt;#37&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;make Timer public by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/a08e0a93c6a3971ddb18258a10640d8ac713706a" target="_blank" rel="noopener"&gt;a08e0a9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;make a worker_opts a copy type by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/98a2c35fa52491bfd557afcac467bedf554466ba" target="_blank" rel="noopener"&gt;98a2c35&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;clippy fix by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/d2bbefef79a1f54ebac482ddf9ed74787c54f75c" target="_blank" rel="noopener"&gt;d2bbefe&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;clean &amp;amp; better usage of atomic ordering by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/989189c7b2fc27289308ff8dd21940c2a19d3847" target="_blank" rel="noopener"&gt;989189c&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;guard data in timed_maps with a parking_lot primitives by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/83d01789d9f8ad5761d7012c067b6eb95298b649" target="_blank" rel="noopener"&gt;83d0178&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use parking_lot mutex instead rwlock for in-memory-store by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/38" target="_blank" rel="noopener"&gt;#38&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;maintain Acquire-Release ordering by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/68a851829e5c1d3a6449030276c97ab0a447937a" target="_blank" rel="noopener"&gt;68a8518&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;exclude library tests from benchmarks by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/77b695e7389f7a9ed248a14ba90222c0e87740a9" target="_blank" rel="noopener"&gt;77b695e&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use the latest stable for benchmarks by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/ebe2dbc9357a2284d3a5713717be47558509836c" target="_blank" rel="noopener"&gt;ebe2dbc&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;wip by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/7552a704e69b75c1550d45d87d763beeecba24ad" target="_blank" rel="noopener"&gt;7552a70&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;exclude library tests in benchmarks &amp;amp;&amp;amp; fix caching by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/faed406d1d0b47a217421f0315b18136b1583742" target="_blank" rel="noopener"&gt;faed406&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;catch panics from sync_processors by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/a2008020c0312e0967b6cb84a0c8f0358f083483" target="_blank" rel="noopener"&gt;a200802&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;expose worker-metrics methods from store by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/31e60e160317d19bcc198f6d235bd6d453e783d0" target="_blank" rel="noopener"&gt;31e60e1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;collect metrics from timers by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/4449e3634fbbed643ab2d44e95470888dd07e0e1" target="_blank" rel="noopener"&gt;4449e36&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;minor metrics updates by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/9c209a9808c5b32c489edcf19ec2354c78dff038" target="_blank" rel="noopener"&gt;9c209a9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;a clippy fix by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/41" target="_blank" rel="noopener"&gt;#41&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;make all fields in WorkerMetrics pub by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/be3a0a16e7e159a494e3309367f2644ccbc82fbc" target="_blank" rel="noopener"&gt;be3a0a1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;make worker_metrics clonable and comparable by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/b4653a67c5445ab4d5e96c03a9f06e8aa6d94598" target="_blank" rel="noopener"&gt;b4653a6&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;export our timedmap implementation to the library users by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/2d843cd207d9023e1093888cd238f02ede87435a" target="_blank" rel="noopener"&gt;2d843cd&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;make the &lt;code&gt;insert_expirable&lt;/code&gt; method sync by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/b76a039ab4d6d4623ce77c2354f6bbea76771e3b" target="_blank" rel="noopener"&gt;b76a039&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;don&amp;rsquo;t hold on to mutex for long by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/a0c8b10ee2ed983ae518b0692d42cbcf096e0b2a" target="_blank" rel="noopener"&gt;a0c8b10&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;strictly use async-mutex event in sync code by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/55654f60c02db1b7f4d84ff847a529f23e0343f9" target="_blank" rel="noopener"&gt;55654f6&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;collective metrics for the user&amp;rsquo;s processor function instead of the worker task by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/5dc9271cf48ea1cc4437d9bb8b8133be443fd6a9" target="_blank" rel="noopener"&gt;5dc9271&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Fix task metrics collection: instrument spawned future, fix TTL bug, fallback task_id, add test by @Copilot &lt;a href="https://github.com/KioHQ/kiomq/commit/910ca349e8f2c9d1ff15d2731c1d7126eeb43db8" target="_blank" rel="noopener"&gt;910ca34&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;comments clean up by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/80d6f37361372dc634974bbf74ba0465c17bac5e" target="_blank" rel="noopener"&gt;80d6f37&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;clippy clean-up by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/43" target="_blank" rel="noopener"&gt;#43&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;library-rename by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/6b573d67b542116cf0404596a40917ce12174c9d" target="_blank" rel="noopener"&gt;6b573d6&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;library name correction in readme by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/585e1b250f35fa54f65cfb0e798cc9b27430231c" target="_blank" rel="noopener"&gt;585e1b2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;replace crossbeam-sub-crates(queue&amp;amp; utils) by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/48af5ca19d978c794a3ef94eee20675f891f23e0" target="_blank" rel="noopener"&gt;48af5ca&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;replace usage of atomic_ref_cell by @spencerjibz &lt;a href="https://github.com/KioHQ/kiomq/commit/eabf62b5dc0420e8999b62cb7c21c20b6028799c" target="_blank" rel="noopener"&gt;eabf62b&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;clippy fixes by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/47" target="_blank" rel="noopener"&gt;#47&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;fix clippy warnings by @spencerjibz (&lt;a href="https://github.com/KioHQ/kiomq/pull/46" target="_blank" rel="noopener"&gt;#46&lt;/a&gt;
)&lt;/li&gt;
&lt;li&gt;Complete documentation coverage: all public items documented, no missing-docs gaps by @Copilot &lt;a href="https://github.com/KioHQ/kiomq/commit/55274f2743f4ede17dfab455911fcc4d14fd6f4e" target="_blank" rel="noopener"&gt;55274f2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Center lib.rs header with div align=center and downshift all heading levels by one by @Copilot &lt;a href="https://github.com/KioHQ/kiomq/commit/a8731ce75e3150331374afc855450254224e1584" target="_blank" rel="noopener"&gt;a8731ce&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Add logo image to lib.rs centered header block by @Copilot &lt;a href="https://github.com/KioHQ/kiomq/commit/11c134d045aac7d0f66c93f0ab9e15ad8cd4c92d" target="_blank" rel="noopener"&gt;11c134d&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Link RedisStore in top description alongside InMemoryStore by @Copilot &lt;a href="https://github.com/KioHQ/kiomq/commit/bad5147ab7c0bf2b686bb44d24470be6d9ed7c79" target="_blank" rel="noopener"&gt;bad5147&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Move Tokio runtime requirements section before Installation in lib.rs docs by @Copilot &lt;a href="https://github.com/KioHQ/kiomq/commit/1ec88cd22df36ea89664f612bcc53205082eea6b" target="_blank" rel="noopener"&gt;1ec88cd&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;fix updating_metrics bug and add panics section to README by @Copilot &lt;a href="https://github.com/KioHQ/kiomq/commit/11063e6706457e630109856ff13b75a73522f85f" target="_blank" rel="noopener"&gt;11063e6&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="contributors"&gt;Contributors&lt;a class="heading-anchor" href="#contributors" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;@Copilot&lt;/li&gt;
&lt;li&gt;@blacksmith-sh[bot]&lt;/li&gt;
&lt;li&gt;@spencerjibz&lt;/li&gt;
&lt;/ul&gt;

 &lt;/div&gt;
 &lt;/section&gt;</description></item><item><title>Benchmarks</title><link>http://kiomq.dev/docs/benchmarks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://kiomq.dev/docs/benchmarks/</guid><description>&lt;h2 id="running-the-suite"&gt;Running the suite&lt;a class="heading-anchor" href="#running-the-suite" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Benchmarks use &lt;a href="https://docs.rs/criterion" target="_blank" rel="noopener"&gt;Criterion&lt;/a&gt;
:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo bench
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Criterion writes an HTML report with plots and regression analysis:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;target/criterion/report/index.html
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="what-is-measured"&gt;What is measured&lt;a class="heading-anchor" href="#what-is-measured" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;queue_bench&lt;/code&gt; harness covers the hot paths:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Benchmark&lt;/th&gt;
					&lt;th&gt;What it exercises&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;queue_bulk_add&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Enqueue throughput via &lt;code&gt;bulk_add&lt;/code&gt; at several batch sizes&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;queue_end_to_end_throughput&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Enqueue → reserve → process → settle, with a worker running&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;queue_single_job_latency&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Time for one job to travel from &lt;code&gt;add_job&lt;/code&gt; to &lt;code&gt;Completed&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Run one group at a time by name:&lt;/p&gt;</description></item><item><title>Testing</title><link>http://kiomq.dev/docs/testing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://kiomq.dev/docs/testing/</guid><description>&lt;h2 id="running-the-suite"&gt;Running the suite&lt;a class="heading-anchor" href="#running-the-suite" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Use &lt;a href="https://nexte.st/" target="_blank" rel="noopener"&gt;&lt;code&gt;cargo nextest&lt;/code&gt;&lt;/a&gt;
:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo nextest run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="callout callout--warning"&gt;
 &lt;span class="callout__icon"&gt;&lt;svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"&gt;&lt;path d="M12 4.5 21 19H3l9-14.5Z"/&gt;&lt;path d="M12 10v4m0 2.5v.5"/&gt;&lt;/svg&gt;&lt;/span&gt;
 &lt;div class="callout__body"&gt;
 &lt;span class="callout__title"&gt;Warning&lt;/span&gt;&lt;p&gt;Use &lt;code&gt;cargo nextest run&lt;/code&gt;, &lt;strong&gt;not&lt;/strong&gt; &lt;code&gt;cargo test&lt;/code&gt;. The integration tests share process-global state (the
metrics collector), so they must each run in their own process — which nextest does by default.
Under &lt;code&gt;cargo test&lt;/code&gt; (a single process) they interfere with one another and fail. CI runs nextest;
local development should too.&lt;/p&gt;</description></item><item><title>Contributing</title><link>http://kiomq.dev/docs/contributing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://kiomq.dev/docs/contributing/</guid><description>&lt;p&gt;KioMQ is MIT licensed and developed in the open. Issues, discussion, and pull requests are all
welcome.&lt;/p&gt;
&lt;h2 id="getting-set-up"&gt;Getting set up&lt;a class="heading-anchor" href="#getting-set-up" aria-label="Link to this section"&gt;&lt;/a&gt;
&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/KioHQ/kiomq
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; kiomq
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config core.hooksPath .githooks &lt;span class="c1"&gt;# enable the repo&amp;#39;s git hooks&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo install cargo-nextest &lt;span class="c1"&gt;# the test runner CI uses&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;pre-push&lt;/code&gt; hook runs the same checks as CI, so failures surface before you open a pull request:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo fmt --all -- --check
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo clippy --locked --all-targets --features tracing,redis-store -- -D warnings
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo nextest run --locked --features tracing,redis-store
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo &lt;span class="nb"&gt;test&lt;/span&gt; --locked --doc --features tracing,redis-store &lt;span class="c1"&gt;# nextest skips doctests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo doc --locked --workspace --no-deps --features tracing,redis-store
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note that clippy runs with &lt;code&gt;-D warnings&lt;/code&gt; — a lint is a build failure. Run it before you push and save
yourself a round trip.&lt;/p&gt;</description></item></channel></rss>