<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="175387" data-post-id="175387">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="smaximov" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/smaximov/120/8587_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  smaximov
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="thojanssens1" data-post="212" data-topic="22449">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/thojanssens1/48/17642_2.png" class="avatar"> thojanssens1:</div>
<blockquote>
<p>What do you mean by “composing emails” with Oban?</p>
</blockquote>
</aside>
<p>By “composing emails” I mean building a <code>Bamboo.Email</code> (or <code>Swoosh.Email</code>) struct (e.g. by <code>YourApp.UserEmail.welcome_email</code>) with all the data (<code>to:</code>, <code>subject:</code>, <code>body:</code>) necessary to send the email:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">user
|&gt; YourApp.UserEmail.welcome_email() # =&gt; composing an email here
|&gt; YourApp.Mailer.deliver_later() # =&gt; delivering the email here, maybe asynchronously
</code></pre>
<p>Composing an email often involves making additional calls to the database or third-party APIs to gather necessary data to render the body of the email. Both in Bamboo and in Swoosh, this is done in  the caller process by default, effectively blocking it. And if you’re composing an email inside a database transaction (which I believe you shouldn’t) and some error occurs, the transaction might be rolled back, which can be undesirable.</p>
<p>The other approach is to introduce a dedicated Oban worker for composing and sending emails.</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule YourApp.Workers.Mailer do
  use Oban.Worker, queue: "mailers"

  @impl Oban.Worker
  def perform(%{"module" =&gt; module, "name" =&gt; name, "args" =&gt; args}, _job) do
    module = String.to_existing_atom(module)
    name = String.to_existing_atom(name)

    module
    |&gt; apply(name, args)
    |&gt; YourApp.Mailer.deliver_now()
  end
end
</code></pre>
<p>With <code>YourApp.Workers.Mailer</code>, you can send emails like this:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">%{"module" =&gt; YouApp.UserEmail, "name" =&gt; :welcome_email, "args" =&gt; [user.id]}
|&gt; YourApp.Workers.Mailer.new()
|&gt; Oban.insert()
</code></pre>
<p>So now if composing an email fails with a transient error (e.g., a network error), it will eventually succeed because Oban will restart the job. If it fails because of a bug in the code, you can always fix the bug and restart the failed job manually (assuming your Oban pruning settings allow it). You can also safely enqueue this job inside a database transaction now.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="175387" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/oban-reliable-and-observable-job-processing/22449/213">Post #212</a>
	                </div>
	            </div>
              <div id="likers-container-175387" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="175387"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #212"></div>
  </section>
</div>
    <div class="postbit" id="175413" data-post-id="175413">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sorentwo" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sorentwo/120/37360_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sorentwo
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Oban Core Team</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p><a class="mention" href="/u/smaximov" rel="nofollow">@smaximov</a> Great example of a simple multi-purpose mail worker <img src="https://forum.elixirforum.com/images/emoji/apple/+1.png?v=15" title=":+1:" class="emoji" alt=":+1:" loading="lazy" width="20" height="20"></p>
<aside class="quote no-group" data-username="smaximov" data-post="213" data-topic="22449">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/smaximov/48/8587_2.png" class="avatar"> smaximov:</div>
<blockquote>
<p>So now if composing an email fails with a transient error (e.g., a network error), it will eventually succeed because Oban will restart the job. If it fails because of a bug in the code, you can always fix the bug and restart the failed job manually (assuming your Oban pruning settings allow it).</p>
</blockquote>
</aside>
<p>You’ll always be able to retry a job, provided there are more attempts available. Oban only prunes <code>completed</code> or <code>discarded</code> jobs and will never prune <code>retryable</code> jobs. There isn’t any chance of losing your mailer jobs this way.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="175413" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/oban-reliable-and-observable-job-processing/22449/214">Post #213</a>
	                </div>
	            </div>
              <div id="likers-container-175413" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="175413"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #213"></div>
  </section>
</div>
    <div class="postbit" id="175417" data-post-id="175417">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="smaximov" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/smaximov/120/8587_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  smaximov
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="sorentwo" data-post="214" data-topic="22449">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sorentwo/48/37360_2.png" class="avatar"> sorentwo:</div>
<blockquote>
<p>You’ll always be able to retry a job, provided there are more attempts available. Oban only prunes <code>completed</code> or <code>discarded</code> jobs and will never prune <code>retryable</code> jobs</p>
</blockquote>
</aside>
<p>Yes, this makes sense. But I was thinking about a situation when a job consistently fails because of a code bug. Assuming it may take some time for the user to fix the bug, the job can eventually reach the max number of retries and enter the <code>discarded</code> state, which makes the job subject to pruning. Though I admit with the default <code>backoff</code> and <code>retries</code> settings it will take a considerable amount of time.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="175417" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/oban-reliable-and-observable-job-processing/22449/215">Post #214</a>
	                </div>
	            </div>
              <div id="likers-container-175417" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="175417"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #214"></div>
  </section>
</div>
    <div class="postbit" id="177038" data-post-id="177038">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Ludwik" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Ludwik/120/16919_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Ludwik
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Hey <a class="mention" href="/u/sorentwo" rel="nofollow">@sorentwo</a> !<br>
I have one striking issue regarding jobs execution in multi node environment.<br>
Please, correct me if Im wrong but I assumed that Oban guarantees that single job will be not executed by multiple nodes, i.e evey job will be run only once.<br>
In our case, during cluster startup, each node creates Oban <em>unique</em> job.<br>
We observe that only one job was inserted into oban table (which is as expected) but then we also observe that sometimes multiple nodes executes that job. Hence, we have a job that is run multiple times!<br>
Isn’t Oban’s responsibility to prevent such scenarios with locking mechanism?</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="177038" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/oban-reliable-and-observable-job-processing/22449/216">Post #215</a>
	                </div>
	            </div>
              <div id="likers-container-177038" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="177038"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #215"></div>
  </section>
</div>
    <div class="postbit" id="177125" data-post-id="177125">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sorentwo" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sorentwo/120/37360_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sorentwo
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Oban Core Team</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="Ludwik" data-post="216" data-topic="22449">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/ludwik/48/16919_2.png" class="avatar"> Ludwik:</div>
<blockquote>
<p>We observe that only one job was inserted into oban table (which is as expected) but then we also observe that sometimes multiple nodes executes that job. Hence, we have a job that is run multiple times!</p>
<p>Isn’t Oban’s responsibility to prevent such scenarios with locking mechanism?</p>
</blockquote>
</aside>
<p>That shouldn’t be possible. There are various locking mechanisms in play to enforce uniqueness. It handles all of that within the database queries. If there is some situation that makes it possible I definitely want to track it down. Will you open an issue and include some more details (oban version, pg version, worker options, etc)?</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="177125" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/oban-reliable-and-observable-job-processing/22449/217">Post #216</a>
	                </div>
	            </div>
              <div id="likers-container-177125" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="177125"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #216"></div>
  </section>
</div>
    <div class="postbit" id="177342" data-post-id="177342">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Ludwik" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Ludwik/120/16919_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Ludwik
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="Ludwik" data-post="216" data-topic="22449">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/ludwik/48/16919_2.png" class="avatar"> Ludwik:</div>
<blockquote>
<p>In our case, during cluster startup, each node creates Oban <em>unique</em> job.<br>
We observe that only one job was inserted into oban table (which is as expected) but then we also observe that sometimes multiple nodes executes that job. Hence, we have a job that is run multiple times!</p>
</blockquote>
</aside>
<p>Sure! I believe it may be some misunderstandment from my side so I leave an issue with tech details and configuration: <a href="https://github.com/sorentwo/oban/issues/250" class="inline-onebox" rel="noopener nofollow ugc">Job processed by multiple nodes · Issue #250 · oban-bg/oban · GitHub</a></p>
<p>Thanks!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="177342" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/oban-reliable-and-observable-job-processing/22449/218">Post #217</a>
	                </div>
	            </div>
              <div id="likers-container-177342" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="177342"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #217"></div>
  </section>
</div>
    <div class="postbit" id="179382" data-post-id="179382">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sorentwo" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sorentwo/120/37360_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sorentwo
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Oban Core Team</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Oban 2.0.0-rc.1 is out today, along with some big news about the <a href="https://sorentwo.com/2020/06/12/announcing-oban-pro.html" rel="noopener nofollow ugc">introduction of Oban Web+Pro</a>!</p>
<p>Highlights from the Oban CHANGELOG are in the post along with a breakdown of what’s gone into the new Oban Pro. Oban 2.0.0-rc.0 was silently released last week as part of the Web+Pro development process and didn’t get any fanfare <img src="https://forum.elixirforum.com/images/emoji/apple/tada.png?v=15" title=":tada:" class="emoji" alt=":tada:" loading="lazy" width="20" height="20"></p>
<p>The changeset for 2.0.0 is <em>massive</em> and seems like too much to drop in this thread, so I’ll leave it at a link to the <a href="https://github.com/sorentwo/oban/blob/master/CHANGELOG.md#200-rc1--2020-06-12" rel="noopener nofollow ugc">CHANGELOG</a>.</p>
<p>Please leave any questions about the blog post, changes in Oban 2.0, or the Web+Pro package here. Alternatively, you can find me in <a class="hashtag-cooked" href="/tag/oban/1833" data-type="tag" data-slug="oban" data-id="1833" data-style-type="icon" data-icon="tag" rel="nofollow"><span class="hashtag-icon-placeholder"><svg class="fa d-icon d-icon-square-full svg-icon svg-node"><use href="#square-full"></use></svg></span><span>oban</span></a> on elixir-slack.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="179382" data-batch-url="/posts/batch_likers">
                        13
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/oban-reliable-and-observable-job-processing/22449/219">Post #218</a>
	                </div>
	            </div>
              <div id="likers-container-179382" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="179382"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #218"></div>
  </section>
</div>
    <div class="postbit" id="179401" data-post-id="179401">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="dom" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/dom/120/9313_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  dom
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Congratulations! <img src="https://forum.elixirforum.com/images/emoji/apple/tada.png?v=15" title=":tada:" class="emoji" alt=":tada:" loading="lazy" width="20" height="20"></p>
<p>One question about Batch. Let’s say we want to run a batch where we retry each subtask N times, then give up if it still fails. At the end of the batch, we’d send an email report showing which tasks succeeded and which failed.</p>
<p>Would it make sense to use the <code>discarded</code> state and Batch callbacks to implement this? It sounds like we would need an equivalent to <code>handle_completed</code> that’s fired once all tasks are either completed <em>or</em> permanently discarded - I get the impression it can’t be done with the current callbacks.</p>
<p>Or would it be better to have a catch-all within the task (or do the actual work in a separate process), so that it “completes” (from Oban’s POV) no matter what, and store the fact that it failed ourselves in DB?</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="179401" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/oban-reliable-and-observable-job-processing/22449/220">Post #219</a>
	                </div>
	            </div>
              <div id="likers-container-179401" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="179401"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #219"></div>
  </section>
</div>
    <div class="postbit" id="179450" data-post-id="179450">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sorentwo" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sorentwo/120/37360_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sorentwo
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Oban Core Team</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="dom" data-post="220" data-topic="22449">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/dom/48/9313_2.png" class="avatar"> dom:</div>
<blockquote>
<p>Would it make sense to use the <code>discarded</code> state and Batch callbacks to implement this? It sounds like we would need an equivalent to <code>handle_completed</code> that’s fired once all tasks are either completed <em>or</em> permanently discarded - I get the impression it can’t be done with the current callbacks.</p>
</blockquote>
</aside>
<p>You’re correct, that can’t be done with the current callbacks. The best way to accomplish what you’re requesting is with a different callback, say <code>handle_exhausted</code>, which is fires when <em>all</em> jobs are either completed or discarded. I can see the utility in an additional callback here because there isn’t anything else to hook into at that point. I’ll add it as a feature request.</p>
<p>Note that depending on how aggressively you are pruning discarded jobs, or how long you’re waiting before discarding, that callback may never fire.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="179450" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/oban-reliable-and-observable-job-processing/22449/221">Post #220</a>
	                </div>
	            </div>
              <div id="likers-container-179450" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="179450"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #220"></div>
  </section>
</div>
    <div class="postbit" id="180562" data-post-id="180562">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sorentwo" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sorentwo/120/37360_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sorentwo
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Oban Core Team</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Oban 2.0.0.rc-2 is now available. It has some important bug fixes related to stability and a few breaking changes / features that enable local only pause/resume/scale operations .</p>
<p>Here is the complete <a href="https://github.com/sorentwo/oban/blob/master/CHANGELOG.md#200-rc2--2020-06-23" rel="noopener nofollow ugc">CHANGELOG</a> on GitHub, or on <a href="https://hexdocs.pm/oban/2.0.0-rc.2/changelog.html#2-0-0-rc-2-2020-06-23" rel="noopener nofollow ugc">HexDocs</a> if you prefer.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="180562" data-batch-url="/posts/batch_likers">
                        5
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/oban-reliable-and-observable-job-processing/22449/222">Post #221</a>
	                </div>
	            </div>
              <div id="likers-container-180562" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="180562"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #221"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <a class="load-more-button" data-turbo-stream="true" href="/topics/22449/load_more?page=23">Load more posts (91 remaining)</a>
</div></template></turbo-stream>