diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/alfresco-global.properties b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/alfresco-global.properties
index 0df8fa38c8..5c3ba95bde 100644
--- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/alfresco-global.properties
+++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/alfresco-global.properties
@@ -52,6 +52,11 @@ rm.autocompletesuggestion.nodeParameterSuggester.aspectsAndTypes=rma:record,cm:c
#
rm.dispositionlifecycletrigger.cronexpression=0 0/5 * * * ?
+#
+# Global RM retention lifecycle cron job execution batch size
+#
+rm.dispositionlifecycletrigger.batchsize=500
+
#
# Global RM notify of records due for review cron job expression
#
diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-job-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-job-context.xml
index 047aaa4a70..139ffbd577 100644
--- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-job-context.xml
+++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-job-context.xml
@@ -80,6 +80,7 @@
+
diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java
index a19913db4e..b44cf229d3 100644
--- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java
+++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java
@@ -60,6 +60,9 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
/** logger */
private static Log logger = LogFactory.getLog(DispositionLifecycleJobExecuter.class);
+ /** batching properties */
+ private int batchSize;
+
/** list of disposition actions to automatically execute */
private List dispositionActions;
@@ -88,6 +91,11 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
this.dispositionActions = dispositionActions;
}
+ public void setBatchSize(int batchSize)
+ {
+ this.batchSize = batchSize;
+ }
+
/**
* @param recordsManagementActionService records management action service
*/
@@ -167,13 +175,14 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
{
boolean hasMore = true;
int skipCount = 0;
- while(hasMore)
+ while (hasMore)
{
SearchParameters params = new SearchParameters();
params.addStore(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE);
params.setLanguage(SearchService.LANGUAGE_FTS_ALFRESCO);
params.setQuery(getQuery());
params.setSkipCount(skipCount);
+ params.setMaxItems(batchSize);
// execute search
ResultSet results = searchService.query(params);
@@ -188,13 +197,12 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
}
// process search results
- for (NodeRef node : resultNodes)
+ if (!resultNodes.isEmpty())
{
- executeAction(node);
+ executeAction(resultNodes);
}
}
}
-
logger.debug("Job Finished");
}
catch (AlfrescoRuntimeException exception)
@@ -209,57 +217,52 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
/**
* Helper method that executes a disposition action
*
- * @param actionNode - the disposition action to execute
+ * @param actionNodes - the disposition actions to execute
*/
- private void executeAction(final NodeRef actionNode)
+ private void executeAction(final List actionNodes)
{
- RetryingTransactionCallback processTranCB = new RetryingTransactionCallback()
- {
- public Boolean execute()
+ RetryingTransactionCallback processTranCB = () -> {
+ for (NodeRef actionNode : actionNodes)
{
- final String dispAction = (String) nodeService.getProperty(actionNode,
- RecordsManagementModel.PROP_DISPOSITION_ACTION);
-
- // Run disposition action
- if (dispAction != null && dispositionActions.contains(dispAction))
+ if (nodeService.exists(actionNode))
{
- ChildAssociationRef parent = nodeService.getPrimaryParent(actionNode);
- if (parent.getTypeQName().equals(RecordsManagementModel.ASSOC_NEXT_DISPOSITION_ACTION))
+ final String dispAction = (String) nodeService
+ .getProperty(actionNode, RecordsManagementModel.PROP_DISPOSITION_ACTION);
+
+ // Run disposition action
+ if (dispAction != null && dispositionActions.contains(dispAction))
{
- Map props = new HashMap<>(1);
- props.put(RMDispositionActionExecuterAbstractBase.PARAM_NO_ERROR_CHECK,
- Boolean.FALSE);
-
- try
+ ChildAssociationRef parent = nodeService.getPrimaryParent(actionNode);
+ if (parent.getTypeQName().equals(RecordsManagementModel.ASSOC_NEXT_DISPOSITION_ACTION))
{
- // execute disposition action
- recordsManagementActionService.executeRecordsManagementAction(
- parent.getParentRef(), dispAction, props);
+ Map props = new HashMap<>(1);
+ props.put(RMDispositionActionExecuterAbstractBase.PARAM_NO_ERROR_CHECK, Boolean.FALSE);
- if (logger.isDebugEnabled())
+ try
{
- logger.debug("Processed action: " + dispAction + "on" + parent);
+ // execute disposition action
+ recordsManagementActionService
+ .executeRecordsManagementAction(parent.getParentRef(), dispAction, props);
+
+ if (logger.isDebugEnabled())
+ {
+ logger.debug("Processed action: " + dispAction + "on" + parent);
+ }
}
- }
- catch (AlfrescoRuntimeException exception)
- {
- if (logger.isDebugEnabled())
+ catch (AlfrescoRuntimeException exception)
{
- logger.debug(exception);
+ if (logger.isDebugEnabled())
+ {
+ logger.debug(exception);
+ }
}
}
}
}
-
- return Boolean.TRUE;
}
+ return Boolean.TRUE;
};
-
- // if exists
- if (nodeService.exists(actionNode))
- {
- retryingTransactionHelper.doInTransaction(processTranCB);
- }
+ retryingTransactionHelper.doInTransaction(processTranCB, false, true);
}
public PersonService getPersonService()
diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuterUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuterUnitTest.java
index 08c40e50b4..d1cb4d4e77 100644
--- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuterUnitTest.java
+++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuterUnitTest.java
@@ -33,6 +33,7 @@ import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyMap;
import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
@@ -56,8 +57,8 @@ import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks;
+import org.mockito.Matchers;
import org.mockito.Mock;
-import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
/**
@@ -73,7 +74,7 @@ public class DispositionLifecycleJobExecuterUnitTest extends BaseUnitTest
private static final String RETAIN = "retain";
private static final String DESTROY = "destroy";
- /** test query snipit */
+ /** test query snippet */
private static final String QUERY = "\"" + CUTOFF + "\" OR \"" + RETAIN + "\"";
/** mocked result set */
@@ -91,9 +92,18 @@ public class DispositionLifecycleJobExecuterUnitTest extends BaseUnitTest
{
super.before();
+ // Because of the fix implemented in MNT-22310, a new setup for retrying transaction helper is required.
+ Answer