java.util.concurrent.TimeoutException org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager.f

本文针对java.util.concurrent.TimeoutException异常,特别是与HttpClient有关的大规模连接等待问题进行了探讨。提出了两种解决方案:一是每次创建新的HttpClient实例;二是及时取消不必要的请求。

java.util.concurrent.TimeoutException

org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager.finalize() timed out after 10 seconds

com.android.org.conscrypt.NativeCrypto.SSL_shutdown(Native Method)


参考了

HttpClient 大量连接等待异常的处理

http://www.cnblogs.com/icoding/archive/2012/07/19/2599676.html


之前我是把的HttpClient是以静态变量的方式存的,目测感觉堆放大量连接导致的

可能的解决方法


解决方案1:每次new 一个HttpClient

解决方案2:及时的cancel掉不需要的请求



[ERROR]-[pool-2-thread-93race]-[2025-10-28 09:37:25.226]-[]-[]-[]-[]-[java.lang.RuntimeException: The analysis ended with 2 errors: [RuntimeException: error while performing request,PreviousErrorsExistException: A previous exception has occurred]]-[] java.util.concurrent.ExecutionException: java.lang.RuntimeException: The analysis ended with 2 errors: [RuntimeException: error while performing request,PreviousErrorsExistException: A previous exception has occurred] at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:357) ~[?:1.8.0_342] at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1928) ~[?:1.8.0_342] at com.jd.platform.async.executor.Async.beginWork(Async.java:36) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.executor.Async.beginWork(Async.java:56) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.lc.extension.jdasync.AsyncEngine.execute(AsyncEngine.java:44) ~[jd-async-engine-1.0.7-SNAPSHOT.jar!/:?] at org.datacleaner.extension.engine.QualityEngine.executeAsync(QualityEngine.java:297) ~[DataCleaner-ext-5.8.1-2024-SNAPSHOT.jar!/:?] at com.governance.datacleaner.async.callable.TableCallable.call(TableCallable.java:56) ~[classes!/:?] at com.governance.datacleaner.async.callable.TableCallable.call(TableCallable.java:20) ~[classes!/:?] at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_342] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[?:1.8.0_342] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[?:1.8.0_342] at java.lang.Thread.run(Thread.java:750) ~[?:1.8.0_342] Caused by: java.lang.RuntimeException: The analysis ended with 2 errors: [RuntimeException: error while performing request,PreviousErrorsExistException: A previous exception has occurred] at com.governance.datacleaner.async.function.TableSummaryCallbackFunction.apply(TableSummaryCallbackFunction.java:103) ~[classes!/:?] at com.governance.datacleaner.async.function.TableSummaryCallbackFunction.apply(TableSummaryCallbackFunction.java:26) ~[classes!/:?] at com.lc.extension.jdasync.callback.DefaultCallback.result(DefaultCallback.java:40) ~[jd-async-engine-1.0.7-SNAPSHOT.jar!/:?] at com.lc.extension.jdasync.callback.DefaultCallback.result(DefaultCallback.java:15) ~[jd-async-engine-1.0.7-SNAPSHOT.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.fastFail(WorkerWrapper.java:320) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.doDependsOneJob(WorkerWrapper.java:217) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.work(WorkerWrapper.java:141) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.beginNext(WorkerWrapper.java:189) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.work(WorkerWrapper.java:142) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.beginNext(WorkerWrapper.java:189) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.work(WorkerWrapper.java:130) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.work(WorkerWrapper.java:152) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.executor.Async.lambda$beginWork$0(Async.java:33) ~[asyncTool-1.3.1-20240321.jar!/:?] at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1640) ~[?:1.8.0_342] ... 3 more Caused by: org.datacleaner.job.runner.AnalysisJobFailedException: The analysis ended with 2 errors: [RuntimeException: error while performing request,PreviousErrorsExistException: A previous exception has occurred] at org.datacleaner.job.runner.AnalysisResultFutureImpl.getResultMap(AnalysisResultFutureImpl.java:131) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.extension.result.AnalysisResultExecutor.execute(AnalysisResultExecutor.java:34) ~[DataCleaner-ext-5.8.1-2024-SNAPSHOT.jar!/:?] at com.governance.datacleaner.async.function.TableWorkerSegementFunction.apply(TableWorkerSegementFunction.java:52) ~[classes!/:?] at com.governance.datacleaner.async.function.TableWorkerFunction.apply(TableWorkerFunction.java:30) ~[classes!/:?] at com.governance.datacleaner.async.function.TableWorkerFunction.apply(TableWorkerFunction.java:13) ~[classes!/:?] at com.lc.extension.jdasync.worker.DefaultWorker.action(DefaultWorker.java:36) ~[jd-async-engine-1.0.7-SNAPSHOT.jar!/:?] at com.lc.extension.jdasync.worker.DefaultWorker.action(DefaultWorker.java:15) ~[jd-async-engine-1.0.7-SNAPSHOT.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.workerDoJob(WorkerWrapper.java:341) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.fire(WorkerWrapper.java:299) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.doDependsOneJob(WorkerWrapper.java:220) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.work(WorkerWrapper.java:141) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.beginNext(WorkerWrapper.java:189) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.work(WorkerWrapper.java:130) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.wrapper.WorkerWrapper.work(WorkerWrapper.java:152) ~[asyncTool-1.3.1-20240321.jar!/:?] at com.jd.platform.async.executor.Async.lambda$beginWork$0(Async.java:33) ~[asyncTool-1.3.1-20240321.jar!/:?] at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1640) ~[?:1.8.0_342] ... 3 more Caused by: java.lang.RuntimeException: error while performing request at org.elasticsearch.client.RestClient.extractAndWrapCause(RestClient.java:859) ~[elasticsearch-rest-client-7.9.3.jar!/:7.9.3] at org.elasticsearch.client.RestClient.performRequest(RestClient.java:259) ~[elasticsearch-rest-client-7.9.3.jar!/:7.9.3] at org.elasticsearch.client.RestClient.performRequest(RestClient.java:246) ~[elasticsearch-rest-client-7.9.3.jar!/:7.9.3] at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1613) ~[elasticsearch-rest-high-level-client-7.9.3.jar!/:7.9.3] at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1583) ~[elasticsearch-rest-high-level-client-7.9.3.jar!/:7.9.3] at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:1553) ~[elasticsearch-rest-high-level-client-7.9.3.jar!/:7.9.3] at org.elasticsearch.client.RestHighLevelClient.bulk(RestHighLevelClient.java:533) ~[elasticsearch-rest-high-level-client-7.9.3.jar!/:7.9.3] at org.datacleaner.extension.writer.CommonInsertIntoElasticSearchWriter.run(CommonInsertIntoElasticSearchWriter.java:297) ~[DataCleaner-ext-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.extension.writer.CommonInsertIntoElasticSearchWriter.run(CommonInsertIntoElasticSearchWriter.java:82) ~[DataCleaner-ext-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.util.WriteBuffer.flushBuffer(WriteBuffer.java:88) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.util.WriteBuffer.addToBuffer(WriteBuffer.java:60) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.extension.writer.CommonInsertIntoElasticSearchWriter.run(CommonInsertIntoElasticSearchWriter.java:269) ~[DataCleaner-ext-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.AnalyzerConsumer.consumeInternal(AnalyzerConsumer.java:72) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.AbstractRowProcessingConsumer.consume(AbstractRowProcessingConsumer.java:161) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.consume(ConsumeRowHandlerDelegate.java:64) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.processNext(ConsumeRowHandlerDelegate.java:90) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.consume(ConsumeRowHandlerDelegate.java:72) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.processNext(ConsumeRowHandlerDelegate.java:90) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.TransformerConsumer.consumeInternal(TransformerConsumer.java:113) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.AbstractRowProcessingConsumer.consume(AbstractRowProcessingConsumer.java:161) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.consume(ConsumeRowHandlerDelegate.java:64) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.processNext(ConsumeRowHandlerDelegate.java:90) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.consume(ConsumeRowHandlerDelegate.java:72) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.processNext(ConsumeRowHandlerDelegate.java:90) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.FilterConsumer.consumeInternal(FilterConsumer.java:80) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.AbstractRowProcessingConsumer.consume(AbstractRowProcessingConsumer.java:161) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.consume(ConsumeRowHandlerDelegate.java:64) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.processNext(ConsumeRowHandlerDelegate.java:90) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.FilterConsumer.consumeInternal(FilterConsumer.java:80) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.AbstractRowProcessingConsumer.consume(AbstractRowProcessingConsumer.java:161) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.consume(ConsumeRowHandlerDelegate.java:64) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.processNext(ConsumeRowHandlerDelegate.java:90) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.FilterConsumer.consumeInternal(FilterConsumer.java:80) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.AbstractRowProcessingConsumer.consume(AbstractRowProcessingConsumer.java:161) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandlerDelegate.consume(ConsumeRowHandlerDelegate.java:64) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.runner.ConsumeRowHandler.consumeRow(ConsumeRowHandler.java:145) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.tasks.ConsumeRowTask.execute(ConsumeRowTask.java:51) ~[DataCleaner-engine-core-5.8.1-2024-SNAPSHOT.jar!/:?] at org.datacleaner.job.concurrent.TaskRunnable.run(TaskRunnable.java:61) ~[DataCleaner-api-5.8.1-2024-SNAPSHOT.jar!/:?] ... 3 more Caused by: java.util.concurrent.TimeoutException: Connection lease request time out at org.apache.http.nio.pool.AbstractNIOConnPool.processPendingRequest(AbstractNIOConnPool.java:411) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.nio.pool.AbstractNIOConnPool.processNextPendingRequest(AbstractNIOConnPool.java:391) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.nio.pool.AbstractNIOConnPool.release(AbstractNIOConnPool.java:355) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.releaseConnection(PoolingNHttpClientConnectionManager.java:391) ~[httpasyncclient-4.1.4.jar!/:4.1.4] at org.apache.http.impl.nio.client.AbstractClientExchangeHandler.releaseConnection(AbstractClientExchangeHandler.java:245) ~[httpasyncclient-4.1.4.jar!/:4.1.4] at org.apache.http.impl.nio.client.MainClientExec.responseCompleted(MainClientExec.java:387) ~[httpasyncclient-4.1.4.jar!/:4.1.4] at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.responseCompleted(DefaultClientExchangeHandlerImpl.java:172) ~[httpasyncclient-4.1.4.jar!/:4.1.4] at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.processResponse(HttpAsyncRequestExecutor.java:448) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.inputReady(HttpAsyncRequestExecutor.java:338) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:265) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:81) ~[httpasyncclient-4.1.4.jar!/:4.1.4] at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:39) ~[httpasyncclient-4.1.4.jar!/:4.1.4] at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:114) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104) ~[httpcore-nio-4.4.14.jar!/:4.4.14] at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:591) ~[httpcore-nio-4.4.14.jar!/:4.4.14] ... 1 more
最新发布
10-29
----- pid 17388 at 2025-09-10 14:19:00.277806410+0530 ----- Cmd line: com.mventus.selfcare.activity Build fingerprint: 'realme/RMX5061IN/RE60ADL1:16/BP2A.250605.015/V.R4T2.1366b6f_c1bda8_c20cce:user/release-keys' ABI: 'arm64' Build type: optimized Debug Store: 3,16,47908992::ID:19,C:E,T:47903565||ID:19,C:S,T:47903564,N:SvcBind,D:rebind=false;act=null;cmp=ComponentInfo{com.mventus.selfcare.activity/androidx.work.impl.background.systemjob.SystemJobService};pkg=null||ID:18,C:E,T:47903564||ID:18,C:S,T:47903564,N:SvcCreate,D:name=androidx.work.impl.background.systemjob.SystemJobService;pkg=com.mventus.selfcare.activity||ID:0,C:P,T:47902582,N:Finish,D:tname=main;tid=2;prid=748ff79||ID:17,C:E,T:47902582||ID:17,C:S,T:47902581,N:BcRcvReg,D:tname=main;tid=2;act=android.net.conn.CONNECTIVITY_CHANGE;cmp=null;pkg=null;prid=748ff79||ID:16,C:E,T:47902581||ID:16,C:S,T:47902581,N:SchRcvReg,D:tname=binder:17388_2;tid=207||ID:0,C:P,T:47899235,N:Finish,D:tname=main;tid=2;prid=61c751b||ID:15,C:E,T:47899235||ID:15,C:S,T:47899235,N:BcRcvReg,D:tname=main;tid=2;act=android.media.ACTION_SCO_AUDIO_STATE_UPDATED;cmp=null;pkg=null;prid=61c751b||ID:0,C:P,T:47899235,N:Finish,D:tname=main;tid=2;prid=fb4a32a||ID:14,C:E,T:47899235||ID:14,C:S,T:47899234,N:BcRcvReg,D:tname=main;tid=2;act=android.media.ACTION_SCO_AUDIO_STATE_UPDATED;cmp=null;pkg=null;prid=fb4a32a||ID:0,C:P,T:47899234,N:Finish,D:tname=main;tid=2;prid=5dd9415;; suspend all histogram: Sum: 2.277ms 99% C.I. 0.174us-834.560us Avg: 94.875us Max: 842us DALVIK THREADS (241): "main" prio=5 tid=1 Waiting | group="main" sCount=1 ucsCount=0 flags=1 obj=0x7487cf88 self=0xb400007d2f8d3000 | sysTid=17388 nice=-4 cgrp=top-app sched=1073741824/0 handle=0x7de9fba098 | state=S schedstat=( 1321749218 137936006 2581 ) utm=96 stm=35 core=4 HZ=100 | stack=0x7ff7d3a000-0x7ff7d3c000 stackSize=8188KB | held mutexes= at jdk.internal.misc.Unsafe.park(Native method) - waiting on an unknown object at java.util.concurrent.locks.LockSupport.park(LockSupport.java:221) at java.util.concurrent.FutureTask.awaitDone(FutureTask.java:500) at java.util.concurrent.FutureTask.get(FutureTask.java:190) at com.amazon.android.apay.commonlibrary.commonlib.service.a.onServiceConnected(SourceFile:69) at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:2453) at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:2486) at android.os.Handler.handleCallback(Handler.java:1027) at android.os.Handler.dispatchMessage(Handler.java:108) at android.os.Looper.loopOnce(Looper.java:298) at android.os.Looper.loop(Looper.java:408) at android.app.ActivityThread.main(ActivityThread.java:9952) at java.lang.reflect.Method.invoke(Native method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:613) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1074) DumpLatencyMs: 1.94146 "ReferenceQueueDaemon" daemon prio=5 tid=6 Waiting | group="system" sCount=1 ucsCount=0 flags=1 obj=0x20007e8 self=0xb400007d2f8d8400 | sysTid=17393 nice=4 cgrp=top-app sched=0/0 handle=0x7ceae4c500 | state=S schedstat=( 13724077 36758848 46 ) utm=0 stm=1 core=7 HZ=100 | stack=0x7cead49000-0x7cead4b000 stackSize=1037KB | held mutexes= at java.lang.Object.wait(Native method) - waiting on <0x006a9661> (a java.lang.Class<java.lang.ref.ReferenceQueue>) at java.lang.Object.wait(Object.java:405) at java.lang.Object.wait(Object.java:543) at java.lang.Daemons$ReferenceQueueDaemon.runInternal(Daemons.java:260) - locked <0x006a9661> (a java.lang.Class<java.lang.ref.ReferenceQueue>) at java.lang.Daemons$Daemon.run(Daemons.java:132) at java.lang.Thread.run(Thread.java:1119) DumpLatencyMs: 43.3178分析一下这个ANR的原因
09-23
package com.altair.userserver.controller.AIDify; import com.altair.userserver.entity.StreamResponse; import com.altair.userserver.service.DifyService; import com.altair.userserver.vo.MessageVO; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import reactor.core.publisher.Flux; import org.springframework.web.context.request.async.WebAsyncTask; import reactor.core.scheduler.Schedulers; import java.util.concurrent.Callable; @RestController @RequestMapping("/api") @RequiredArgsConstructor @CrossOrigin(origins = "*") public class DifyController { @Value("${dify.api.key}") private String difyKey; @Autowired private final DifyService difyService; /** * 流式调用 */ @PostMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public WebAsyncTask<Flux<StreamResponse>> difyStream(@RequestBody MessageVO vo) { Callable<Flux<StreamResponse>> callable = () -> difyService.streamingMessage(vo.getQuery(), 0L, difyKey) .onErrorResume(throwable -> { StreamResponse errorResponse = new StreamResponse(); errorResponse.setAnswer("Stream processing error: " + throwable.getMessage()); return Flux.just(errorResponse); }); return new WebAsyncTask<>(30000,callable); } }控制层 package com.altair.userserver.service.impl; import java.util.Collections; import java.util.HashMap; import com.alibaba.fastjson.JSON; import com.altair.userserver.entity.DifyRequestBody; import com.altair.userserver.entity.StreamResponse; import com.altair.userserver.service.DifyService; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Flux; @Service @RequiredArgsConstructor public class DifyServiceImpl implements DifyService { @Value("${dify.api.url}") private String url; private final WebClient webClient; /** * 流式调用dify. * * @param query 查询文本 * @param userId 用户id * @param apiKey apiKey * @return Flux 响应流 */ public Flux<StreamResponse> streamingMessage(String query, Long userId, String apiKey) { //1.设置请求体 DifyRequestBody body = new DifyRequestBody(); body.setInputs(new HashMap<>()); body.setQuery(query); body.setResponseMode("streaming"); body.setConversationId(""); body.setUser(userId.toString()); //2.使用webclient发送post请求 return webClient.post() .uri(url) .headers(httpHeaders -> { httpHeaders.setContentType(MediaType.APPLICATION_JSON); httpHeaders.setBearerAuth(apiKey); }) .bodyValue(JSON.toJSONString(body)) .retrieve() .bodyToFlux(StreamResponse.class); } } 实现类 package com.altair.userserver.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.concurrent.ThreadPoolExecutor; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureAsyncSupport(AsyncSupportConfigurer configurer) { configurer.setTaskExecutor(taskExecutor()); configurer.setDefaultTimeout(30000); } @Bean public AsyncTaskExecutor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); executor.setMaxPoolSize(20); executor.setQueueCapacity(25); executor.setThreadNamePrefix("mvc-async-"); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; } } 工具类 package com.altair.userserver.config; import io.netty.handler.timeout.ReadTimeoutHandler; import org.springframework.http.client.reactive.ReactorClientHttpConnector; import reactor.netty.http.client.HttpClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.reactive.function.client.WebClient; import java.util.concurrent.TimeUnit; @Configuration public class WebClientConfig { @Bean public WebClient webClient() { HttpClient httpClient = HttpClient.create() .tcpConfiguration(tcpClient -> tcpClient.doOnConnected(conn -> conn.addHandlerLast(new ReadTimeoutHandler(9000, TimeUnit.SECONDS)) ) ); // 响应超时15分钟 return WebClient.builder() .clientConnector(new ReactorClientHttpConnector(httpClient)) .build(); } } 实体类 package com.altair.userserver.entity; import com.alibaba.fastjson.annotation.JSONField; import java.io.Serializable; import java.util.Map; import lombok.Data; /** * Dify请求体. */ @Data public class DifyRequestBody implements Serializable { /** * 用户输入/提问内容. */ private String query; /** * 允许传入 App 定义的各变量值. */ private Map<String, String> inputs; /** * 响应模式,streaming 流式,blocking 阻塞. */ @JSONField(name = "response_mode") private String responseMode; /** * 用户标识. */ private String user; /** * 会话id. */ @JSONField(name = "conversation_id") private String conversationId; } package com.altair.userserver.entity; import lombok.Data; import java.io.Serializable; @Data public class StreamResponse implements Serializable { String event; String id; String taskId; String messageId; String answer; Long createdAt; String conversationId; } package com.altair.userserver.vo; import lombok.Data; @Data public class MessageVO { private String query; }
09-30
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值