Spring @Async проблемы с несколькими потоками - PullRequest
0 голосов
/ 13 мая 2018

Потоки, созданные Async, работают впервые, а во второй раз, кажется, они зависают.Вот как выглядит мой код -

Sprint Boot Rest service {
       -> invokes Class A @Async method {
                -> invokes Class B @Async method
       }
}

Эта служба отдыха обрабатывает огромное дерево, в результате чего получается множество потоков.

Вот как выглядит AsyncConfiguration:

setCorePoolSize - 1000
setMaxPoolSize - 20000
setQueueCapacity - 5000
setThreadNamePrefix - "ABCService"

Я регистрирую поток, следуя за номером потока, и перед первым вызовом все выглядит чистым.activeCount: 0, poolSize: 0, largePoolSize: 0, completeTaskCount: 0, taskCount: 0, оставшийсяQueueCApacity: 5000

При обработке первого запроса: activeCount: 1000, poolSize: 1000, largePoolSize: 1000, completeTaskCount: 6, taskCount: 1782, оставшийсяQueueCApacity: 4224

После обработки первого запроса: activeCount: 0, poolSize: 1000, LargePoolSize: 1000, completeTaskCount: 2595, taskCount: 2595, оставшийсяQueueCApacity: 5000

После запросаМой второй запрос: activeCount: 1000, poolSize: 1000, largePoolSize: 1000, completeTaskCount: 2595, taskCount: 4915, оставшийсяQueueCApacity: 3680

Я думаю, что потоки зависают, потому что потоки, кажется, не работают.Кроме того, я не вижу никаких изменений в activeCount.

У меня есть методы try / catch в Async для обработки любых исключений.

Вот мои определения асинхронных методов выглядят следующим образом:

@Async
public void foo(String , String , list, String , boolean ){
    try {
            List<CompletableFuture<String>> completableFutureList
            for each item in list{
                CompletableFuture<String> response = ClassB.bar(String , String , item, String , boolean);
                completableFutureList.add(response);
            }

        CompletableFuture.allOf(completableFutureList.toArray(new CompletableFuture[completableFutureList.size()])).join();

        .......
        ......
    } catch (Throwable e) {
        logger.error("Exception .... " );
    }
}


class B method

@Async
public CompletableFuture<String> bar(String , String , item, String , boolean)){
    try{
        .....
        ......
        }
    catch(......) {
    }
}   

Любая помощь будет оценена.Спасибо.

обновление:

Когда я делаю дамп потока, я вижу, что все потоки ожидают (парковка), как показано ниже.

"ABCService-26" # 83 prio = 5 os_prio = 0 tid = 0x00007f2ab829b800 nid = 0x716d ожидание при условии [0x00007f272ffc7000] java.lang.Thread.State: WAITING (стоянка) на sun.misc.Unsafe.park (собственный метод) - парковка для ожидания <0x0000000745cf3198> (java.util.concurrent.CompletableFuture $ Signaller) в java.util.concurrent.locks.LockSupport.park (LockSupport.java:175) в java.утилитойв java.util.concurrent.CompletableFuture.join (CompletableFuture.java:1934) в com.abc.command.util.ClassA.foo (ClassA.java:106) в com.abc.command.util.ClassA.bar (ClassA.java: 54) в com.abc.command.util.ClassA $$ FastClassBySpringCGLIB $$ b0eafa9.invoke () в org.springframework.cglib.proxy.MethodProxy.invoke (MethodProxy.java:204) в org.springframe.framework.CglibAopProxy$ CglibMethodInvocation.invokeJoinpoint (CglibAopProxy.java:721) в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:157)в java.util.concurrent.FutureTask.run (FutureTask.java:266) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142) в java.util.concurrent.ThreadPoolExcecutor: 617) at java.lang.Thread.run (Thread.java:745)

1 Ответ

0 голосов
/ 15 мая 2018

Проблема, кажется, ошибка JDK с CompletableFuture<String>. Обходной путь использует get (timeout) вместо join ():

CompletableFuture<Void> future = CompletableFuture.allOf(completableFutureList.toArray(new CompletableFuture[completableFutureList.size()]));

future.get(executionTime, TimeUnit.MILLISECONDS);

здесь более подробно о проблеме ...

https://bugs.openjdk.java.net/browse/JDK-8201576 https://crondev.wordpress.com/2017/01/23/timeouts-with-java-8-completablefuture-youre-probably-doing-it-wrong/

...