This is an automated email from the ASF dual-hosted git repository.

juanpablo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jspwiki.git

commit 82877f4cf46f25e3ddf4e5975e451aabf57299e7
Author: juanpablo <[email protected]>
AuthorDate: Wed Oct 14 19:43:59 2020 +0200

    DefaultWorkflowManager stores only last jspwiki.workflow.completed.retain 
(defaulting to 2048) completed workflows
    
    in order to prevent a memory hog
---
 .../org/apache/wiki/workflow/DefaultWorkflowManager.java    | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git 
a/jspwiki-main/src/main/java/org/apache/wiki/workflow/DefaultWorkflowManager.java
 
b/jspwiki-main/src/main/java/org/apache/wiki/workflow/DefaultWorkflowManager.java
index 433955a..81d10dc 100644
--- 
a/jspwiki-main/src/main/java/org/apache/wiki/workflow/DefaultWorkflowManager.java
+++ 
b/jspwiki-main/src/main/java/org/apache/wiki/workflow/DefaultWorkflowManager.java
@@ -18,6 +18,7 @@
  */
 package org.apache.wiki.workflow;
 
+import org.apache.commons.collections4.queue.CircularFifoQueue;
 import org.apache.commons.lang3.time.StopWatch;
 import org.apache.log4j.Logger;
 import org.apache.wiki.api.core.Context;
@@ -29,6 +30,7 @@ import org.apache.wiki.auth.acl.UnresolvedPrincipal;
 import org.apache.wiki.event.WikiEvent;
 import org.apache.wiki.event.WikiEventEmitter;
 import org.apache.wiki.event.WorkflowEvent;
+import org.apache.wiki.util.TextUtil;
 
 import java.io.*;
 import java.security.Principal;
@@ -54,8 +56,9 @@ public class DefaultWorkflowManager implements 
WorkflowManager {
     DecisionQueue m_queue = new DecisionQueue();
     Set< Workflow > m_workflows;
     final Map< String, Principal > m_approvers;
-    List< Workflow > m_completed;
+    Queue< Workflow > m_completed;
     private Engine m_engine = null;
+    private int retainCompleted;
 
     /**
      * Constructs a new WorkflowManager, with an empty workflow cache.
@@ -63,7 +66,6 @@ public class DefaultWorkflowManager implements 
WorkflowManager {
     public DefaultWorkflowManager() {
         m_workflows = ConcurrentHashMap.newKeySet();
         m_approvers = new ConcurrentHashMap<>();
-        m_completed = new CopyOnWriteArrayList<>();
         WikiEventEmitter.attach( this );
     }
 
@@ -97,6 +99,8 @@ public class DefaultWorkflowManager implements 
WorkflowManager {
     @Override
     public void initialize( final Engine engine, final Properties props ) {
         m_engine = engine;
+        retainCompleted = TextUtil.getIntegerProperty( 
engine.getWikiProperties(), "jspwiki.workflow.completed.retain", 2048 );
+        m_completed = new CircularFifoQueue<>( retainCompleted );
 
         // Identify the workflows requiring approvals
         for( final Object o : props.keySet() ) {
@@ -135,11 +139,12 @@ public class DefaultWorkflowManager implements 
WorkflowManager {
                 saved        = in.readLong();
                 m_workflows  = ( Set< Workflow > )in.readObject();
                 m_queue      = ( DecisionQueue )in.readObject();
-                m_completed  = ( List< Workflow > )in.readObject();
+                m_completed = new CircularFifoQueue<>( retainCompleted );
+                m_completed.addAll( ( Collection< Workflow > )in.readObject() 
);
                 LOG.debug( "Read serialized data successfully in " + sw );
             }
         } catch( final IOException | ClassNotFoundException e ) {
-            LOG.error( "unable to recover from disk workflows and decision 
queue: " + e.getMessage(), e );
+            LOG.warn( "unable to recover from disk workflows and decision 
queue: " + e.getMessage() );
         }
         sw.stop();
 

Reply via email to