Загрузка нескольких файлов с URL и выполнение действий с ними с помощью threadpoolexecutor java - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь загрузить несколько файлов с URL-адреса и выполнить некоторые действия с помощью threadpoolexecutor. Действие - проверить, не поврежден ли файл. Скажем так, на сайте 20 документов. Если я пытаюсь создать поток с одной нитью, он проверяет все 20 документов. Однако, если я использую 15 потоков, только 10 файлов проверяются правильно. Кажется, что остальные файлы работают в фоновом режиме более 1 часа, что вызывает ожидание следующего URL.

Я использую пользовательский пул потоков в приложении весенней загрузки.

THREAD_CORE_POOL_SIZE=15
THREAD_MAX_POOL_SIZE=15
threadKillTime is 1 hour

BlockingThreadPoolExecutor executor = new BlockingThreadPoolExecutor(THREAD_CORE_POOL_SIZE, THREAD_MAX_POOL_SIZE, 
                threadKillTime, TimeUnit.MILLISECONDS, new SynchronousQueue<>(),
                new CustomThreadFactory("valid-file-checker"),
                new ThreadPoolExecutor.AbortPolicy());

BlockingThreadPoolExecutor. java

public class BlockingThreadPoolExecutor extends ThreadPoolExecutor {
private static final Logger logger = LoggerFactory.getLogger(BlockingThreadPoolExecutor.class);
private final Semaphore semaphore;
public BlockingThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,
        BlockingQueue<Runnable> workQueue, ThreadFactory factory, RejectedExecutionHandler handler) {
    super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, factory, handler);
    semaphore = new Semaphore(corePoolSize + 50);
}
@Override
protected void beforeExecute(Thread t, Runnable r) {
    super.beforeExecute(t, r);
}
@Override
public void execute(final Runnable task) {
    boolean acquired = false;
    do {
        try {
            semaphore.acquire();
            acquired = true;
        } catch (final InterruptedException e) {
            // LOGGER.warn("InterruptedException whilst aquiring semaphore", e);
        }
    } while (!acquired);
    try {
        super.execute(task);
    } catch (final RejectedExecutionException e) {
        logger.error("Task Rejected");
        semaphore.release();
        throw e;
    }
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
    super.afterExecute(r, t);
    if (t != null) {
        t.printStackTrace();
    }
    semaphore.release();
}

}

Я попытался загрузить файлы, используя FileUtils.copyURLToFile, внутри вызывающего потока, а также загрузить файл и затем вызвать поток. Оба случая, кажется, не имеют никакого эффекта.

Любой совет будет высоко ценится.

...