gpt4 book ai didi

spring - Spring @Async问题与多个线程

转载 作者:行者123 更新时间:2023-12-03 13:03:11 24 4
gpt4 key购买 nike

由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,largestPoolSize:0,completedTaskCount:0,taskCount:0,剩余QueueCApacity:5000

在处理第一个请求时:
activeCount:1000,po​​olSize:1000,最大PoolSize:1000,completedTaskCount:6,taskCount:1782,剩余QueueCApacity:4224

处理完第一个请求后:
activeCount:0,poolSize:1000,po​​olSize:1000,completedTaskCount:2595,taskCount:2595,remainingQueueCApacity:5000

在请求我的第二个请求之后:
activeCount:1000,po​​olSize:1000,po​​olSize:1000,completedTaskCount:2595,taskCount:4915,remainingQueueCApacity:3680

我认为线程正在挂起,因为线程似乎无法正常工作。另外,我看不到activeCount的任何变化。

我在异步方法中尝试/捕获来处理任何异常。

这是我的异步方法定义,如下所示:
@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 waiting on condition [0x00007f272ffc7000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x0000000745cf3198> (a java.util.concurrent.CompletableFuture$Signaller) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.CompletableFuture$Signaller.block(CompletableFuture.java:1693) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3323) at java.util.concurrent.CompletableFuture.waitingGet(CompletableFuture.java:1729) at java.util.concurrent.CompletableFuture.join(CompletableFuture.java:1934) at com.abc.command.util.ClassA.foo(ClassA.java:106) at com.abc.command.util.ClassA.bar(ClassA.java:54) at com.abc.command.util.ClassA$$FastClassBySpringCGLIB$$b0eafa9.invoke() at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:721) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.aop.interceptor.AsyncExecutionInterceptor$1.call(AsyncExecutionInterceptor.java:115) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)

最佳答案

问题似乎是CompletableFuture<String>的JDK错误。解决方法是使用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/

关于spring - Spring @Async问题与多个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50312161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com