Потоки, созданные 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)