<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Xavier Perez]]></title>
  <link href="http://xavier-perez.com/atom.xml" rel="self"/>
  <link href="http://xavier-perez.com/"/>
  <updated>2014-08-27T16:41:28-07:00</updated>
  <id>http://xavier-perez.com/</id>
  <author>
    <name><![CDATA[Xavier Perez]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Enqueuing Sidekiq Jobs Without Sidekiq]]></title>
    <link href="http://xavier-perez.com/blog/2014/05/25/enqueuing-sidekiq-job-without-sidekiq/"/>
    <updated>2014-05-25T05:00:00-07:00</updated>
    <id>http://xavier-perez.com/blog/2014/05/25/enqueuing-sidekiq-job-without-sidekiq</id>
    <content type="html"><![CDATA[<p>Let&rsquo;s say you have a running Sidekiq system and for whatever reason you need to enqueue
jobs from another not ruby-based environment or system. It&rsquo;s actually quite simple as you
can directly push your jobs into Redis without the Sidekiq gem.</p>

<p>First, let&rsquo;s create a very simple worker and enqueue it:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">HardWorker</span>
</span><span class='line'>  <span class="kp">include</span> <span class="ss">Sidekiq</span><span class="p">:</span><span class="ss">:Worker</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">perform</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="s2">&quot;Hey, I&#39;m a worker named </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="no">HardWorker</span><span class="o">.</span><span class="n">perform_async</span><span class="p">(</span><span class="s2">&quot;foo&quot;</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; &quot;d34299988658f23c62c178da&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Sidekiq gives us back a unique ID for that specific job. Let&rsquo;s have a look inside Redis:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">redis</span> <span class="mi">127</span><span class="o">.</span><span class="mi">0</span><span class="o">.</span><span class="mi">0</span><span class="o">.</span><span class="mi">1</span><span class="p">:</span><span class="mi">6379</span><span class="o">&gt;</span> <span class="n">type</span> <span class="s2">&quot;queues&quot;</span>
</span><span class='line'><span class="n">set</span>
</span><span class='line'>
</span><span class='line'><span class="n">redis</span> <span class="mi">127</span><span class="o">.</span><span class="mi">0</span><span class="o">.</span><span class="mi">0</span><span class="o">.</span><span class="mi">1</span><span class="p">:</span><span class="mi">6379</span><span class="o">&gt;</span> <span class="n">type</span> <span class="s2">&quot;queue:default&quot;</span>
</span><span class='line'><span class="n">list</span>
</span><span class='line'>
</span><span class='line'><span class="n">redis</span> <span class="mi">127</span><span class="o">.</span><span class="mi">0</span><span class="o">.</span><span class="mi">0</span><span class="o">.</span><span class="mi">1</span><span class="p">:</span><span class="mi">6379</span><span class="o">&gt;</span> <span class="n">smembers</span> <span class="n">queues</span>
</span><span class='line'><span class="mi">1</span><span class="p">)</span> <span class="s2">&quot;default&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now for simple jobs (as opposed to <em>scheduled</em> jobs), Sidekiq use two different keys: a list and a set. The set called <code>queues</code> by default only store the queues names. The list named <code>queue:nameofthequeue</code> actually store the job informations.  Let&rsquo;s have a closer look:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">redis</span> <span class="mi">127</span><span class="o">.</span><span class="mi">0</span><span class="o">.</span><span class="mi">0</span><span class="o">.</span><span class="mi">1</span><span class="p">:</span><span class="mi">6379</span><span class="o">&gt;</span> <span class="no">LRANGE</span> <span class="ss">queue</span><span class="p">:</span><span class="n">default</span> <span class="mi">0</span> <span class="mi">1</span>
</span><span class='line'><span class="mi">1</span><span class="p">)</span> <span class="s2">&quot;{</span><span class="se">\&quot;</span><span class="s2">retry</span><span class="se">\&quot;</span><span class="s2">:true,</span><span class="se">\&quot;</span><span class="s2">queue</span><span class="se">\&quot;</span><span class="s2">:</span><span class="se">\&quot;</span><span class="s2">default</span><span class="se">\&quot;</span><span class="s2">,</span><span class="se">\&quot;</span><span class="s2">class</span><span class="se">\&quot;</span><span class="s2">:</span><span class="se">\&quot;</span><span class="s2">HardWorker</span><span class="se">\&quot;</span><span class="s2">,</span><span class="se">\&quot;</span><span class="s2">args</span><span class="se">\&quot;</span><span class="s2">:[</span><span class="se">\&quot;</span><span class="s2">foo</span><span class="se">\&quot;</span><span class="s2">],</span><span class="se">\&quot;</span><span class="s2">jid</span><span class="se">\&quot;</span><span class="s2">:</span><span class="se">\&quot;</span><span class="s2">d34299988658f23c62c178da</span><span class="se">\&quot;</span><span class="s2">,</span><span class="se">\&quot;</span><span class="s2">enqueued_at</span><span class="se">\&quot;</span><span class="s2">:1400959039.450082}&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>A-Ha! So a job is simply a hash serialized in JSON. Those are the required keys:</p>

<ul>
<li><code>retry</code> (boolean): tells Sidekiq whether to retry or not a failed job</li>
<li><code>queue</code> (string): self-explanatory!</li>
<li><code>class</code> (string): the class of the worker that will be instantiated by Sidekiq</li>
<li><code>args</code> (array): the arguments that will passed to the worker&rsquo;s contructor</li>
<li><code>jid</code> (string): the unique ID of the job</li>
<li><code>enqueued_at</code> (float): the timestamp when the job was enqueued</li>
</ul>


<p>Pretty simple, huh? So, to enqueue a job yourself you have to:</p>

<ul>
<li>Generate a unique ID.</li>
<li>Serialize the payload using JSON.</li>
<li>Add the name of the queue to the <code>queues</code> set (using <code>SADD</code>).</li>
<li>Push the payload to the <code>queue:myqueue</code> list (using <code>LPUSH</code>).</li>
</ul>


<p>Pretty simple, eh? Now you might be wondering, what about scheduled job? Well it&rsquo;s not that much more complicated! First let&rsquo;s push a scheduled job:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">irb</span><span class="o">&gt;</span> <span class="no">HardWorker</span><span class="o">.</span><span class="n">perform_in</span><span class="p">(</span><span class="mi">10</span><span class="o">.</span><span class="n">minutes</span><span class="p">,</span> <span class="s2">&quot;foo&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="o">=&gt;</span> <span class="s2">&quot;672512fcf9ba85078d73bd77&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then have a look at what&rsquo;s inside Redis:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">redis</span> <span class="mi">127</span><span class="o">.</span><span class="mi">0</span><span class="o">.</span><span class="mi">0</span><span class="o">.</span><span class="mi">1</span><span class="p">:</span><span class="mi">6379</span><span class="o">&gt;</span> <span class="n">keys</span> <span class="o">*</span>
</span><span class='line'><span class="mi">1</span><span class="p">)</span> <span class="s2">&quot;schedule&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="n">redis</span> <span class="mi">127</span><span class="o">.</span><span class="mi">0</span><span class="o">.</span><span class="mi">0</span><span class="o">.</span><span class="mi">1</span><span class="p">:</span><span class="mi">6379</span><span class="o">&gt;</span> <span class="n">type</span> <span class="s2">&quot;schedule&quot;</span>
</span><span class='line'><span class="n">zset</span>
</span><span class='line'>
</span><span class='line'><span class="n">redis</span> <span class="mi">127</span><span class="o">.</span><span class="mi">0</span><span class="o">.</span><span class="mi">0</span><span class="o">.</span><span class="mi">1</span><span class="p">:</span><span class="mi">6379</span><span class="o">&gt;</span> <span class="n">zrange</span> <span class="n">schedule</span> <span class="mi">0</span> <span class="mi">1</span>
</span><span class='line'><span class="mi">1</span><span class="p">)</span> <span class="s2">&quot;{</span><span class="se">\&quot;</span><span class="s2">retry</span><span class="se">\&quot;</span><span class="s2">:true,</span><span class="se">\&quot;</span><span class="s2">queue</span><span class="se">\&quot;</span><span class="s2">:</span><span class="se">\&quot;</span><span class="s2">default</span><span class="se">\&quot;</span><span class="s2">,</span><span class="se">\&quot;</span><span class="s2">class</span><span class="se">\&quot;</span><span class="s2">:</span><span class="se">\&quot;</span><span class="s2">HardWorker</span><span class="se">\&quot;</span><span class="s2">,</span><span class="se">\&quot;</span><span class="s2">args</span><span class="se">\&quot;</span><span class="s2">:[</span><span class="se">\&quot;</span><span class="s2">foo</span><span class="se">\&quot;</span><span class="s2">],</span><span class="se">\&quot;</span><span class="s2">jid</span><span class="se">\&quot;</span><span class="s2">:</span><span class="se">\&quot;</span><span class="s2">672512fcf9ba85078d73bd77</span><span class="se">\&quot;</span><span class="s2">,</span><span class="se">\&quot;</span><span class="s2">enqueued_at</span><span class="se">\&quot;</span><span class="s2">:1400959918.936842}&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>At first sight, there&rsquo;s not much difference besides the fact that the job is stored in a sorted set (<code>zset</code>) instead of a list. But it&rsquo;s in a sorted set, that means it must have score:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">redis</span> <span class="mi">127</span><span class="o">.</span><span class="mi">0</span><span class="o">.</span><span class="mi">0</span><span class="o">.</span><span class="mi">1</span><span class="p">:</span><span class="mi">6379</span><span class="o">&gt;</span> <span class="n">zscore</span> <span class="s2">&quot;schedule&quot;</span> <span class="s2">&quot;{</span><span class="se">\&quot;</span><span class="s2">retry</span><span class="se">\&quot;</span><span class="s2">:true,</span><span class="se">\&quot;</span><span class="s2">queue</span><span class="se">\&quot;</span><span class="s2">:</span><span class="se">\&quot;</span><span class="s2">default</span><span class="se">\&quot;</span><span class="s2">,</span><span class="se">\&quot;</span><span class="s2">class</span><span class="se">\&quot;</span><span class="s2">:</span><span class="se">\&quot;</span><span class="s2">HardWorker</span>
</span><span class='line'><span class="s2">  &quot;</span><span class="mi">1400959928</span><span class="o">.</span><span class="mi">9367521</span><span class="s2">&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The score is actually the time at which the job is supposed to be executed! This allow Sidekiq to use <code>ZRANGEBYSCORE</code> to simply pop the jobs that should be executed <sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup>. Now if you want to enqueue a scheduled job, you just have to add it to the <code>schedule</code> sorted set using <code>ZADD</code>!</p>

<p>And really, that&rsquo;s all there is to it! As long as you know the worker&rsquo;s class name and the arguments it takes, you can enqueue jobs from any programming language. Or even directly inside Redis if you wish so!</p>

<p>For the sake of completion, here&rsquo;s a naive implementation in Go:</p>

<figure class='code'><figcaption><span>Enqueue a Sidekiq job in Go</span><a href='https://gist.github.com/DuoSRX/8f3290d3d93e0054fe35'>Gist</a></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'><span class="kn">package</span> <span class="nx">main</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="p">(</span>
</span><span class='line'>  <span class="s">&quot;crypto/rand&quot;</span>
</span><span class='line'>  <span class="s">&quot;encoding/hex&quot;</span>
</span><span class='line'>  <span class="s">&quot;encoding/json&quot;</span>
</span><span class='line'>  <span class="s">&quot;fmt&quot;</span>
</span><span class='line'>  <span class="s">&quot;github.com/garyburd/redigo/redis&quot;</span>
</span><span class='line'>  <span class="s">&quot;io&quot;</span>
</span><span class='line'>  <span class="s">&quot;time&quot;</span>
</span><span class='line'><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="kd">type</span> <span class="nx">Job</span> <span class="kd">struct</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">JID</span>        <span class="kt">string</span>   <span class="s">`json:&quot;jid&quot;`</span>
</span><span class='line'>  <span class="nx">Retry</span>      <span class="kt">bool</span>     <span class="s">`json:&quot;retry&quot;`</span>
</span><span class='line'>  <span class="nx">Queue</span>      <span class="kt">string</span>   <span class="s">`json:&quot;queue&quot;`</span>
</span><span class='line'>  <span class="nx">Class</span>      <span class="kt">string</span>   <span class="s">`json:&quot;class&quot;`</span>
</span><span class='line'>  <span class="nx">Args</span>       <span class="p">[]</span><span class="kt">string</span> <span class="s">`json:&quot;args&quot;`</span>
</span><span class='line'>  <span class="nx">EnqueuedAt</span> <span class="kt">int64</span>    <span class="s">`json:&quot;enqueued_at&quot;`</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">func</span> <span class="nx">randomHex</span><span class="p">(</span><span class="nx">n</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">string</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">id</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">([]</span><span class="kt">byte</span><span class="p">,</span> <span class="nx">n</span><span class="p">)</span>
</span><span class='line'>  <span class="nx">io</span><span class="p">.</span><span class="nx">ReadFull</span><span class="p">(</span><span class="nx">rand</span><span class="p">.</span><span class="nx">Reader</span><span class="p">,</span> <span class="nx">id</span><span class="p">)</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">hex</span><span class="p">.</span><span class="nx">EncodeToString</span><span class="p">(</span><span class="nx">id</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">func</span> <span class="p">(</span><span class="nx">job</span> <span class="o">*</span><span class="nx">Job</span><span class="p">)</span> <span class="nx">Enqueue</span><span class="p">()</span> <span class="kt">string</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">conn</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">redis</span><span class="p">.</span><span class="nx">Dial</span><span class="p">(</span><span class="s">&quot;tcp&quot;</span><span class="p">,</span> <span class="s">&quot;:6379&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class='line'>    <span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">encoded</span><span class="p">,</span> <span class="nx">_</span> <span class="o">:=</span> <span class="nx">json</span><span class="p">.</span><span class="nx">Marshal</span><span class="p">(</span><span class="nx">job</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">conn</span><span class="p">.</span><span class="nx">Send</span><span class="p">(</span><span class="s">&quot;SADD&quot;</span><span class="p">,</span> <span class="s">&quot;queues&quot;</span><span class="p">,</span> <span class="nx">job</span><span class="p">.</span><span class="nx">Queue</span><span class="p">)</span>
</span><span class='line'>  <span class="nx">conn</span><span class="p">.</span><span class="nx">Send</span><span class="p">(</span><span class="s">&quot;LPUSH&quot;</span><span class="p">,</span> <span class="s">&quot;queue:&quot;</span><span class="o">+</span><span class="nx">job</span><span class="p">.</span><span class="nx">Queue</span><span class="p">,</span> <span class="nb">string</span><span class="p">(</span><span class="nx">encoded</span><span class="p">))</span>
</span><span class='line'>  <span class="nx">conn</span><span class="p">.</span><span class="nx">Flush</span><span class="p">()</span>
</span><span class='line'>  <span class="nx">conn</span><span class="p">.</span><span class="nx">Close</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">job</span><span class="p">.</span><span class="nx">JID</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">func</span> <span class="nx">NewJob</span><span class="p">(</span><span class="nx">class</span><span class="p">,</span> <span class="nx">queue</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">args</span> <span class="p">[]</span><span class="kt">string</span><span class="p">)</span> <span class="o">*</span><span class="nx">Job</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">job</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="nx">Job</span><span class="p">{</span>
</span><span class='line'>    <span class="nx">JID</span><span class="p">:</span>        <span class="nx">randomHex</span><span class="p">(</span><span class="mi">12</span><span class="p">),</span>
</span><span class='line'>    <span class="nx">Retry</span><span class="p">:</span>      <span class="kc">false</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">Queue</span><span class="p">:</span>      <span class="nx">queue</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">Class</span><span class="p">:</span>      <span class="nx">class</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">Args</span><span class="p">:</span>       <span class="nx">args</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">EnqueuedAt</span><span class="p">:</span> <span class="nx">time</span><span class="p">.</span><span class="nx">Now</span><span class="p">().</span><span class="nx">Unix</span><span class="p">(),</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">job</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">func</span> <span class="nx">main</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">job</span> <span class="o">:=</span> <span class="nx">NewJob</span><span class="p">(</span><span class="s">&quot;HardWorker&quot;</span><span class="p">,</span> <span class="s">&quot;default&quot;</span><span class="p">,</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">&quot;foo&quot;</span><span class="p">})</span>
</span><span class='line'>  <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="nx">job</span><span class="p">.</span><span class="nx">Enqueue</span><span class="p">())</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

<div class="footnotes">
<hr/>
<ol>
<li id="fn:1">
<p><a href="https://github.com/mperham/sidekiq/blob/master/lib/sidekiq/scheduled.rb#L35">Here&rsquo;s where the magic happens in the Sidekiq code</a><a href="#fnref:1" rev="footnote">&#8617;</a></p></li>
</ol>
</div>

]]></content>
  </entry>
  
</feed>
