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