Pārlūkot izejas kodu

fix #1504 thumbnail generator runs on parallel stream

Shinsuke Sugaya 7 gadi atpakaļ
vecāks
revīzija
7b6a539b53

+ 9 - 2
src/main/java/org/codelibs/fess/exec/ThumbnailGenerator.java

@@ -18,6 +18,7 @@ package org.codelibs.fess.exec;
 import java.io.File;
 import java.io.IOException;
 import java.lang.management.ManagementFactory;
+import java.util.concurrent.ForkJoinPool;
 
 import javax.annotation.Resource;
 
@@ -60,14 +61,19 @@ public class ThumbnailGenerator {
         @Option(name = "-p", aliases = "--properties", metaVar = "properties", usage = "Properties File")
         protected String propertiesPath;
 
+        @Option(name = "-t", aliases = "--numOfThreads", metaVar = "numOfThreads", usage = "The number of threads")
+        protected int numOfThreads = 1;
+
         protected Options() {
             // nothing
         }
 
         @Override
         public String toString() {
-            return "Options [sessionId=" + sessionId + ", name=" + name + ", propertiesPath=" + propertiesPath + "]";
+            return "Options [sessionId=" + sessionId + ", name=" + name + ", propertiesPath=" + propertiesPath + ", numOfThreads="
+                    + numOfThreads + "]";
         }
+
     }
 
     static void initializeProbes() {
@@ -186,8 +192,9 @@ public class ThumbnailGenerator {
 
         int totalCount = 0;
         int count = 1;
+        final ForkJoinPool pool = new ForkJoinPool(options.numOfThreads);
         while (count != 0) {
-            count = ComponentUtil.getThumbnailManager().generate();
+            count = ComponentUtil.getThumbnailManager().generate(pool);
             totalCount += count;
         }
         return totalCount;

+ 9 - 0
src/main/java/org/codelibs/fess/job/GenerateThumbnailJob.java

@@ -56,6 +56,8 @@ public class GenerateThumbnailJob {
 
     protected String logFilePath;
 
+    protected int numOfThreads = 1;
+
     protected String logLevel;
 
     protected String jvmOptions;
@@ -77,6 +79,11 @@ public class GenerateThumbnailJob {
         return this;
     }
 
+    public GenerateThumbnailJob numOfThreads(final int numOfThreads) {
+        this.numOfThreads = numOfThreads;
+        return this;
+    }
+
     public GenerateThumbnailJob logLevel(final String logLevel) {
         this.logLevel = logLevel;
         return this;
@@ -236,6 +243,8 @@ public class GenerateThumbnailJob {
 
         cmdList.add("--sessionId");
         cmdList.add(sessionId);
+        cmdList.add("--numOfThreads");
+        cmdList.add(Integer.toString(numOfThreads));
 
         File propFile = null;
         try {

+ 5 - 4
src/main/java/org/codelibs/fess/thumbnail/ThumbnailManager.java

@@ -27,6 +27,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ForkJoinPool;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
 
@@ -192,11 +193,11 @@ public class ThumbnailManager {
         thumbnailQueueBhv.batchInsert(list);
     }
 
-    public int generate() {
+    public int generate(final ForkJoinPool pool) {
         final FessConfig fessConfig = ComponentUtil.getFessConfig();
         final List<String> idList = new ArrayList<>();
         final ThumbnailQueueBhv thumbnailQueueBhv = ComponentUtil.getComponent(ThumbnailQueueBhv.class);
-        thumbnailQueueBhv.selectList(cb -> {
+        pool.submit(() -> thumbnailQueueBhv.selectList(cb -> {
             if (StringUtil.isBlank(fessConfig.getSchedulerTargetName())) {
                 cb.query().setTarget_Equal(Constants.DEFAULT_JOB_TARGET);
             } else {
@@ -204,7 +205,7 @@ public class ThumbnailManager {
             }
             cb.query().addOrderBy_CreatedTime_Asc();
             cb.fetchFirst(fessConfig.getPageThumbnailQueueMaxFetchSizeAsInteger());
-        }).forEach(entity -> {
+        }).parallelStream().forEach(entity -> {
             if (logger.isDebugEnabled()) {
                 logger.debug("Generating thumbnail: " + entity);
             }
@@ -236,7 +237,7 @@ public class ThumbnailManager {
             } catch (final Exception e) {
                 logger.warn("Failed to create thumbnail for " + entity, e);
             }
-        });
+        })).join();
         if (!idList.isEmpty()) {
             thumbnailQueueBhv.queryDelete(cb -> {
                 cb.query().setId_InScope(idList);