diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/rule/bestpractices/QueueableShouldAttachFinalizerRule.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/rule/bestpractices/QueueableWithoutFinalizerRule.java similarity index 97% rename from pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/rule/bestpractices/QueueableShouldAttachFinalizerRule.java rename to pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/rule/bestpractices/QueueableWithoutFinalizerRule.java index dad3ebfc94..a3f349615f 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/rule/bestpractices/QueueableShouldAttachFinalizerRule.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/rule/bestpractices/QueueableWithoutFinalizerRule.java @@ -18,7 +18,7 @@ import net.sourceforge.pmd.lang.apex.rule.AbstractApexRule; * * @author mitchspano */ -public class QueueableShouldAttachFinalizerRule extends AbstractApexRule { +public class QueueableWithoutFinalizerRule extends AbstractApexRule { private static final String EXECUTE = "execute"; private static final String QUEUEABLE = "queueable"; diff --git a/pmd-apex/src/main/resources/category/apex/bestpractices.xml b/pmd-apex/src/main/resources/category/apex/bestpractices.xml index f69949af4a..836894f3b5 100644 --- a/pmd-apex/src/main/resources/category/apex/bestpractices.xml +++ b/pmd-apex/src/main/resources/category/apex/bestpractices.xml @@ -285,29 +285,54 @@ Detects when a local variable is declared and/or assigned but not used. - + message="This Queueable doesn't attach a Finalizer" + class="net.sourceforge.pmd.lang.apex.rule.bestpractices.QueueableWithoutFinalizerRule" + externalInfoUrl="${pmd.website.baseurl}/pmd_rules_apex_bestpractices.html#queueablewithoutfinalizer"> Detects when the Queueable interface is used but a Finalizer is not attached. +It is best practice to call the `System.attachFinalizer(Finalizer f)` method within the `execute` method of a class which implements the `Queueable` interface. +Without attaching a Finalizer, there is no way of designing error recovery actions should the Queueable action fail. 5 usersToUpdate; +// Incorrect code, does not attach a finalizer. +public class UserUpdater implements Queueable { + public List usersToUpdate; - public UserUpdater(List usersToUpdate) { - this.usersToUpdate = usersToUpdate; - } + public UserUpdater(List usersToUpdate) { + this.usersToUpdate = usersToUpdate; + } - public void execute(QueueableContext context) { // no Finalizer is attached - update usersToUpdate; + public void execute(QueueableContext context) { // no Finalizer is attached + update usersToUpdate; + } +} + +// Proper code, attaches a finalizer. +public class UserUpdater implements Queueable, Finalizer { + public List usersToUpdate; + + public UserUpdater(List usersToUpdate) { + this.usersToUpdate = usersToUpdate; + } + + public void execute(QueueableContext context) { + System.attachFinalizer(this); + update usersToUpdate; + } + + public void execute(FinalizerContext ctx) { + if (ctx.getResult() == ParentJobResult.SUCCESS) { + // Handle success + } else { + // Handle failure } } +} ]]> diff --git a/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/rule/bestpractices/QueueableShouldAttachFinalizerTest.java b/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/rule/bestpractices/QueueableWithoutFinalizerTest.java similarity index 78% rename from pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/rule/bestpractices/QueueableShouldAttachFinalizerTest.java rename to pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/rule/bestpractices/QueueableWithoutFinalizerTest.java index f24a3d94f5..35d20e8d9c 100644 --- a/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/rule/bestpractices/QueueableShouldAttachFinalizerTest.java +++ b/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/rule/bestpractices/QueueableWithoutFinalizerTest.java @@ -6,6 +6,6 @@ package net.sourceforge.pmd.lang.apex.rule.bestpractices; import net.sourceforge.pmd.test.PmdRuleTst; -class QueueableShouldAttachFinalizerTest extends PmdRuleTst { +class QueueableWithoutFinalizerTest extends PmdRuleTst { // no additional unit tests } diff --git a/pmd-apex/src/test/resources/net/sourceforge/pmd/lang/apex/rule/bestpractices/xml/QueueableShouldAttachFinalizer.xml b/pmd-apex/src/test/resources/net/sourceforge/pmd/lang/apex/rule/bestpractices/xml/QueueableWithoutFinalizer.xml similarity index 87% rename from pmd-apex/src/test/resources/net/sourceforge/pmd/lang/apex/rule/bestpractices/xml/QueueableShouldAttachFinalizer.xml rename to pmd-apex/src/test/resources/net/sourceforge/pmd/lang/apex/rule/bestpractices/xml/QueueableWithoutFinalizer.xml index 207b2bb5cc..41145ef966 100644 --- a/pmd-apex/src/test/resources/net/sourceforge/pmd/lang/apex/rule/bestpractices/xml/QueueableShouldAttachFinalizer.xml +++ b/pmd-apex/src/test/resources/net/sourceforge/pmd/lang/apex/rule/bestpractices/xml/QueueableWithoutFinalizer.xml @@ -5,7 +5,7 @@ xsi:schemaLocation="http://pmd.sourceforge.net/rule-tests http://pmd.sourceforge.net/rule-tests_1_0_0.xsd"> - [apex] Queueable Should Attach Finalizer - positive test case #5302 + [apex] Queueable Without Finalizer - positive test case #5302 1 8 - [apex] Queueable Should Attach Finalizer - negative test case #5302 + [apex] Queueable Without Finalizer - negative test case #5302 0