Stora batchjobb i Alfresco

Ibland uppstår behov att processa en större mängd noder i Alfresco. Till exempel att en viss operation behöver utföras på 20.000 noder. Alfresco använder Lucene i botten och ovanpå det ligger ett säkerhetslager. Resultatet blir att sannolikheten att diverse timeouter slår till och ställer till med problem är stor.
Nedan följer några anteckningar jag gjort för att komma runt dessa problem:

Till att börja med måste man känna till hur alfresco jobbar. Det är lite förenklat så här:
1) Kör fråga mot lucene.
2) Loopa igenom 1000 entries i taget (batchsize = ej samma som maxPermissionChecks), kolla rättigheter och lägg till resultatlistan. Detta körs tills
a) maxPermissionChecks gräns uppnås eller
b) maxPermissionCheckTimeMillis passeras eller
c) Lucenelistan är slut (alla resultat behandlade)
3) Presentera resultatlista

Vad som händer är vid 2 a eller b är att resultatet kommer visas för användaren, utan felmeddelande, trots att resultatet inte är fullständigt.
Minnet kan ta slut också, men då får man i regel ett exception. Med rekommenderade inställningar på XMX ska detta normalt aldrig ske.
Så för att ”batcha” över många filer så behöver man ha ett villkor så man kan hålla koll på vika man har behandlat. Sedan ta med med det som villkor i frågan. I mitt fall:
+PATH:”/app:company_home/st:sites/cm:svb401svb/cm:documentLibrary//*” AND @cm:content.mimetype:”application/x-dwg”  AND -ASPECT:”company_m:to_process
(notera minus framför sista villkoret)
Sen måste maxPermissionCheckTimeMillis ökas upp så att den hinner gå igenom en hel batch (=1000). Annars kommer man alltid få en tom resultatlista. Jag kör nu 60 sekunder istället för 10 (maxPermissionCheckTimeMillis=60000)

Vidare måste vi ha en större maxPermissionChecks är batchstorleken. Jag kör 8000 nu istället för 1000. Sedan i mitt script så behandlar jag bara efter de 800 första raderna (pga att transaktionen blir för stor annars). Sedan upprepar man scriptet tills frågan ger 0 tillbaka. Notera att man inte vet om man fått ett avhugget resultat. Är det jämt delbart på batchstorleken (=1000) så är det ju 99,9% säkerhet att så är fallet. I så fall kör man bara om scriptet tills man får ett resultat som inte är delbart på 1000 eller är 0.

Så här ser mitt script ut i helhet:
 var nodes = search.luceneSearch(”PATH:”/app:company_home/st:sites/cm:site01/cm:documentLibrary//*” AND @cm\:content.mimetype:”application/x-dwg” AND -ASPECT:”company_m:to_process””);
 model.nodes = nodes;
 
var len = 800;
if(nodes.length < len) {
len = nodes.length;
}
model.length = len;
model.tot = nodes.length;
 
 for (i=0; i< len; i++) {
 nodes[i].addAspect(”{http://www.company.com/alfresco/model/std/1.0}to_process”);
 }
 }

Kommentera

E-postadressen publiceras inte. Obligatoriska fält är märkta *