<div dir="ltr">Heya, not exactly sure if this is the place for this, but thought I'd share how I'm currently using SC with JDK 20 as a backend dev. <div><br></div><div>For some non-critical services and some side projects, I've been refactored from reactive to imperative style. Normally when I use SC it's to orchestrate multiple API/DB calls and to cancel the tasks if a subtasks fail. The underlying resources are usually managed by my DI framework (usually Spring or Avaje), so I don't really have custom logic to clean up resources. </div><div><br></div><div>The only (admittedly minor) complaints I have are the lack of a runnable fork variation and the annoying checked exceptions. Other than that, works like a dream.</div><div><br></div><div>Below is a ShutdownOnFailure wrapper class I typically use to get around the 2 complaints.</div><div><br clear="all"><div><div style="background-color:rgb(28,31,34);padding:0px 0px 0px 2px"><div style="font-family:Consolas;white-space:pre"><p style="color:rgb(207,191,173);margin:0px"><span style="color:rgb(255,0,127)">public</span> <span style="color:rgb(255,0,127)">class</span> <span style="color:rgb(82,227,246);background-color:rgb(65,65,4)">UncheckedShutdownOnFailure</span> <span style="color:rgb(255,0,127)">implements</span> <span style="color:rgb(82,227,246)">AutoCloseable</span> <span style="color:rgb(249,250,244)">{</span></p><p style="color:rgb(207,191,173);margin:0px"><br></p><p style="color:rgb(207,191,173);margin:0px"> <span style="color:rgb(255,0,127)">private</span> <span style="color:rgb(255,0,127)">final</span> <span style="color:rgb(82,227,246)">ShutdownOnFailure</span> scope <span style="color:rgb(255,0,127)">=</span> <span style="color:rgb(255,0,127)">new</span> <span style="color:rgb(167,236,33)">ShutdownOnFailure</span><span style="color:rgb(249,250,244)">()</span><span style="color:rgb(255,0,127)">;</span></p><p style="color:rgb(207,191,173);margin:0px"><br></p><p style="color:rgb(207,191,173);margin:0px"> <span style="color:rgb(255,0,127)">public</span> <span style="color:rgb(255,0,127)"><</span><span style="color:rgb(191,164,164)">T</span><span style="color:rgb(255,0,127)">></span> <span style="color:rgb(82,227,246)">Future</span><span style="color:rgb(255,0,127)"><</span><span style="color:rgb(191,164,164)">T</span><span style="color:rgb(255,0,127)">></span> <span style="color:rgb(167,236,33)">fork</span><span style="color:rgb(249,250,244)">(</span><span style="color:rgb(82,227,246)">Callable</span><span style="color:rgb(255,0,127)"><?</span> <span style="color:rgb(255,0,127)">extends</span> <span style="color:rgb(191,164,164)">T</span><span style="color:rgb(255,0,127)">></span> <span style="color:rgb(121,171,255)">task</span><span style="color:rgb(249,250,244)">)</span> <span style="color:rgb(249,250,244)">{</span></p><p style="color:rgb(207,191,173);margin:0px"><br></p><p style="color:rgb(207,191,173);margin:0px"> <span style="color:rgb(255,0,127)">return</span> scope<span style="color:rgb(255,0,127)">.</span><span style="color:rgb(167,236,33)">fork</span><span style="color:rgb(249,250,244)">(</span><span style="color:rgb(121,171,255)">task</span><span style="color:rgb(249,250,244)">)</span><span style="color:rgb(255,0,127)">;</span></p><p style="color:rgb(207,191,173);margin:0px"> <span style="color:rgb(249,250,244)">}</span></p><p style="color:rgb(207,191,173);margin:0px"><br></p><p style="color:rgb(207,191,173);margin:0px"> <span style="color:rgb(255,0,127)">public</span> <span style="color:rgb(82,227,246)">Future</span><span style="color:rgb(255,0,127)"><</span><span style="color:rgb(191,164,164)">Object</span><span style="color:rgb(255,0,127)">></span> <span style="color:rgb(167,236,33)">fork</span><span style="color:rgb(249,250,244)">(</span><span style="color:rgb(82,227,246)">Runnable</span> <span style="color:rgb(121,171,255)">task</span><span style="color:rgb(249,250,244)">)</span> <span style="color:rgb(249,250,244)">{</span></p><p style="color:rgb(207,191,173);margin:0px"><br></p><p style="color:rgb(207,191,173);margin:0px"> <span style="color:rgb(255,0,127)">return</span> scope<span style="color:rgb(255,0,127)">.</span><span style="color:rgb(167,236,33)">fork</span><span style="color:rgb(249,250,244)">(</span><span style="color:rgb(82,227,246)">Executors</span><span style="color:rgb(255,0,127)">.</span><span style="color:rgb(167,236,33)">callable</span><span style="color:rgb(249,250,244)">(</span><span style="color:rgb(121,171,255)">task</span><span style="color:rgb(249,250,244)">))</span><span style="color:rgb(255,0,127)">;</span></p><p style="color:rgb(207,191,173);margin:0px"> <span style="color:rgb(249,250,244)">}</span></p><p style="color:rgb(207,191,173);margin:0px"><br></p><p style="color:rgb(207,191,173);margin:0px"> <span style="color:rgb(255,0,127)">public</span> <span style="color:rgb(255,0,127)">void</span> <span style="color:rgb(167,236,33)">join</span><span style="color:rgb(249,250,244)">()</span> <span style="color:rgb(249,250,244)">{</span></p><p style="color:rgb(207,191,173);margin:0px"><br></p><p style="color:rgb(207,191,173);margin:0px"> <span style="color:rgb(255,0,127)">try</span> <span style="color:rgb(249,250,244)">{</span></p><p style="color:rgb(207,191,173);margin:0px"><br></p><p style="color:rgb(207,191,173);margin:0px"> scope<span style="color:rgb(255,0,127)">.</span><span style="color:rgb(167,236,33)">join</span><span style="color:rgb(249,250,244)">()</span><span style="color:rgb(255,0,127)">.</span><span style="color:rgb(167,236,33)">throwIfFailed</span><span style="color:rgb(249,250,244)">(</span><span style="color:rgb(255,0,127)">this::</span><span style="color:rgb(167,236,33)">uncheck</span><span style="color:rgb(249,250,244)">)</span><span style="color:rgb(255,0,127)">;</span></p><p style="color:rgb(207,191,173);margin:0px"><br></p><p style="color:rgb(207,191,173);margin:0px"> <span style="color:rgb(249,250,244)">}</span> <span style="color:rgb(255,0,127)">catch</span> <span style="color:rgb(249,250,244)">(</span><span style="color:rgb(255,0,127)">final</span> <span style="color:rgb(82,227,246)">InterruptedException</span> e<span style="color:rgb(249,250,244)">)</span> <span style="color:rgb(249,250,244)">{</span></p><p style="color:rgb(207,191,173);margin:0px"><br></p><p style="color:rgb(207,191,173);margin:0px"> <span style="color:rgb(82,227,246)">Thread</span><span style="color:rgb(255,0,127)">.</span><span style="color:rgb(167,236,33)">currentThread</span><span style="color:rgb(249,250,244)">()</span><span style="color:rgb(255,0,127)">.</span><span style="color:rgb(167,236,33)">interrupt</span><span style="color:rgb(249,250,244)">()</span><span style="color:rgb(255,0,127)">;</span></p><p style="color:rgb(207,191,173);margin:0px"><br></p><p style="color:rgb(207,191,173);margin:0px"> <span style="color:rgb(255,0,127)">throw</span> <span style="color:rgb(255,0,127)">new</span> <span style="color:rgb(167,236,33)">IllegalStateException</span><span style="color:rgb(249,250,244)">(</span>e<span style="color:rgb(249,250,244)">)</span><span style="color:rgb(255,0,127)">;</span></p><p style="color:rgb(207,191,173);margin:0px"> <span style="color:rgb(249,250,244)">}</span></p><p style="color:rgb(207,191,173);margin:0px"> <span style="color:rgb(249,250,244)">}</span></p><p style="margin:0px"><font color="#cfbfad">
</font><font color="#cfbfad"> </font><span style="color:rgb(255,0,127)">private</span><font color="#cfbfad"> </font><span style="color:rgb(82,227,246)">RuntimeException</span><font color="#cfbfad"> </font><span style="color:rgb(167,236,33)">uncheck</span><span style="color:rgb(249,250,244)">(</span><span style="color:rgb(82,227,246)">Throwable</span><font color="#cfbfad"> </font><span style="color:rgb(121,171,255)">t</span><span style="color:rgb(249,250,244)">)</span><font color="#cfbfad"> </font><span style="color:rgb(249,250,244)">{</span></p><p style="color:rgb(207,191,173);margin:0px"><br></p><p style="color:rgb(207,191,173);margin:0px"> <span style="color:rgb(255,0,127)">if</span> <span style="color:rgb(249,250,244)">(</span><span style="color:rgb(121,171,255)">t</span> <span style="color:rgb(255,0,127)">instanceof</span> <span style="color:rgb(255,0,127)">final</span> <span style="color:rgb(82,227,246)">RuntimeException</span> ex<span style="color:rgb(249,250,244)">)</span> <span style="color:rgb(249,250,244)">{</span></p><p style="color:rgb(207,191,173);margin:0px"> <span style="color:rgb(255,0,127)">return</span> ex<span style="color:rgb(255,0,127)">;</span></p><p style="color:rgb(207,191,173);margin:0px"> <span style="color:rgb(249,250,244)">}</span></p><p style="color:rgb(207,191,173);margin:0px"><br></p><p style="color:rgb(207,191,173);margin:0px"> <span style="color:rgb(255,0,127)">return</span> <span style="color:rgb(255,0,127)">new</span> <span style="color:rgb(167,236,33)">IllegalStateException</span><span style="color:rgb(249,250,244)">(</span><span style="color:rgb(121,171,255)">t</span><span style="color:rgb(249,250,244)">)</span><span style="color:rgb(255,0,127)">;</span></p><p style="color:rgb(207,191,173);margin:0px"> <span style="color:rgb(249,250,244)">}</span></p><p style="color:rgb(207,191,173);margin:0px"><br></p><p style="color:rgb(207,191,173);margin:0px"> <span style="color:rgb(255,255,255)">@</span><span style="color:rgb(255,255,255)">Override</span></p><p style="color:rgb(207,191,173);margin:0px"> <span style="color:rgb(255,0,127)">public</span> <span style="color:rgb(255,0,127)">void</span> <span style="color:rgb(167,236,33)">close</span><span style="color:rgb(249,250,244)">()</span> <span style="color:rgb(249,250,244)">{</span></p><p style="color:rgb(207,191,173);margin:0px"><br></p><p style="color:rgb(207,191,173);margin:0px"> scope<span style="color:rgb(255,0,127)">.</span><span style="color:rgb(167,236,33)">close</span><span style="color:rgb(249,250,244)">()</span><span style="color:rgb(255,0,127)">;</span></p><p style="color:rgb(207,191,173);margin:0px"> <span style="color:rgb(249,250,244)">}</span></p><p style="color:rgb(207,191,173);margin:0px"><span style="color:rgb(249,250,244)">}</span></p></div></div></div><span class="gmail_signature_prefix"><div><span class="gmail_signature_prefix"><br></span></div>-- </span><br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">Cheers, Josiah.</div></div><input name="virtru-metadata" type="hidden" value="{"email-policy":{"disableCopyPaste":false,"disablePrint":false,"disableForwarding":false,"enableNoauth":false,"expandedWatermarking":false,"expires":false,"sms":false,"expirationNum":1,"expirationUnit":"days","isManaged":false,"persistentProtection":false},"attachments":{},"compose-id":"1","compose-window":{"secure":false}}"></div></div>