spring Sping Boot webclient多个post API调用:打开的文件太多

ss2ws0br  于 2024-01-05  发布在  Spring
关注(0)|答案(1)|浏览(158)

我的spring Boot 应用程序处理计划的批处理作业,其中涉及到在一个批处理作业中对配置的api的数千个post API调用。这些调用在线程池中同时处理。
下面是用于每个API调用的方法。它与其他API调用没有任何共享资源。

  1. private <T> String getResponseV2(String deviceConnection, String uri, T body, Consumer<HttpHeaders> headersConsumer) {
  2. SslContext sslContext = null;
  3. try {
  4. sslContext = SslContextBuilder
  5. .forClient()
  6. .trustManager(InsecureTrustManagerFactory.INSTANCE)
  7. .build();
  8. } catch (SSLException e) {
  9. log.error("Error creating ssl context: {}",e.getLocalizedMessage());
  10. log.error("Error: ",e);
  11. return null;
  12. }
  13. SslContext finalSslContext = sslContext;
  14. TcpClient tcpClient = TcpClient.create().secure(sslContextSpec -> sslContextSpec.sslContext(finalSslContext));
  15. HttpClient httpClient = HttpClient.from(tcpClient).wiretap("reactor.netty.http.client.HttpClient",
  16. LogLevel.DEBUG, AdvancedByteBufFormat.TEXTUAL).responseTimeout(Duration.ofSeconds(20));
  17. return WebClient.builder()
  18. .baseUrl(deviceConnection)
  19. .clientConnector(new ReactorClientHttpConnector(httpClient))
  20. .build()
  21. .post().uri(uri)
  22. .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
  23. .headers(headersConsumer)
  24. .body(Mono.just(body), body.getClass())
  25. .retrieve()
  26. /*.onStatus(HttpStatus::isError, res -> {
  27. log.info("Webclient Response {}", res.bodyToMono(String.class));
  28. return Mono.error(new IllegalStateException("Failed to Fetch Data"));
  29. })*/
  30. .bodyToMono(String.class).block();
  31. }

字符串
在每个单独的作业中,这个函数被调用两次,一次用于获取auth token,另一次用于实际的post API调用。
我的问题是我不完全熟悉webclient,不确定这是否是我使用webclient的正确方法,或者这是否会泄漏资源。
这是因为在一些测试运行后,我在我的服务中得到了以下异常:

  1. Caused by: io.netty.channel.ChannelException: io.netty.channel.unix.Errors$NativeIoException: newSocketDgram(..) failed: Too many open files
  2. at io.netty.channel.unix.Socket.newSocketDgram0(Socket.java:442)
  3. at io.netty.channel.epoll.LinuxSocket.newSocketDgram(LinuxSocket.java:327)
  4. at io.netty.channel.epoll.EpollDatagramChannel.<init>(EpollDatagramChannel.java:84)
  5. at io.netty.channel.epoll.EpollDatagramChannel.<init>(EpollDatagramChannel.java:75)
  6. at reactor.netty.resources.DefaultLoopEpoll.getChannel(DefaultLoopEpoll.java:55)
  7. at reactor.netty.resources.LoopResources.onChannel(LoopResources.java:214)
  8. at reactor.netty.tcp.TcpResources.onChannel(TcpResources.java:208)
  9. at reactor.netty.transport.NameResolverProvider.lambda$newNameResolverGroup$0(NameResolverProvider.java:415)
  10. at io.netty.bootstrap.AbstractBootstrap.initAndRegister(AbstractBootstrap.java:310)
  11. at io.netty.bootstrap.AbstractBootstrap.register(AbstractBootstrap.java:227)
  12. at io.netty.resolver.dns.DnsNameResolver.<init>(DnsNameResolver.java:456)
  13. at io.netty.resolver.dns.DnsNameResolverBuilder.build(DnsNameResolverBuilder.java:476)
  14. at io.netty.resolver.dns.DnsAddressResolverGroup.newNameResolver(DnsAddressResolverGroup.java:114)
  15. at io.netty.resolver.dns.DnsAddressResolverGroup.newResolver(DnsAddressResolverGroup.java:92)
  16. at io.netty.resolver.dns.DnsAddressResolverGroup.newResolver(DnsAddressResolverGroup.java:77)
  17. at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:70)
  18. ... 12 common frames omitted


这些要么是伴随着这个

  1. tack trace:
  2. at org.springframework.web.reactive.function.client.ExchangeFunctions$DefaultExchangeFunction.lambda$wrapException$9(ExchangeFunctions.java:137)
  3. at reactor.core.publisher.MonoErrorSupplied.subscribe(MonoErrorSupplied.java:70)
  4. at reactor.core.publisher.Mono.subscribe(Mono.java:4046)
  5. at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103)
  6. at reactor.core.publisher.FluxPeek$PeekSubscriber.onError(FluxPeek.java:221)
  7. at reactor.core.publisher.FluxPeek$PeekSubscriber.onError(FluxPeek.java:221)
  8. at reactor.core.publisher.FluxPeek$PeekSubscriber.onError(FluxPeek.java:221)
  9. at reactor.core.publisher.MonoNext$NextSubscriber.onError(MonoNext.java:93)
  10. at reactor.core.publisher.MonoFlatMapMany$FlatMapManyMain.onError(MonoFlatMapMany.java:204)
  11. at reactor.core.publisher.SerializedSubscriber.onError(SerializedSubscriber.java:124)
  12. at reactor.core.publisher.FluxRetryWhen$RetryWhenMainSubscriber.whenError(FluxRetryWhen.java:224)
  13. at reactor.core.publisher.FluxRetryWhen$RetryWhenOtherSubscriber.onError(FluxRetryWhen.java:273)
  14. at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.drain(FluxConcatMap.java:413)
  15. at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.onNext(FluxConcatMap.java:250)
  16. at reactor.core.publisher.EmitterProcessor.drain(EmitterProcessor.java:491)
  17. at reactor.core.publisher.EmitterProcessor.tryEmitNext(EmitterProcessor.java:299)
  18. at reactor.core.publisher.SinkManySerialized.tryEmitNext(SinkManySerialized.java:97)
  19. at reactor.core.publisher.InternalManySink.emitNext(InternalManySink.java:27)
  20. at reactor.core.publisher.FluxRetryWhen$RetryWhenMainSubscriber.onError(FluxRetryWhen.java:189)
  21. at reactor.core.publisher.MonoCreate$DefaultMonoSink.error(MonoCreate.java:189)
  22. at reactor.netty.http.client.HttpClientConnect$MonoHttpConnect$ClientTransportSubscriber.onError(HttpClientConnect.java:306)
  23. at reactor.core.publisher.MonoCreate$DefaultMonoSink.error(MonoCreate.java:189)
  24. at reactor.netty.resources.DefaultPooledConnectionProvider$DisposableAcquire.onError(DefaultPooledConnectionProvider.java:166)
  25. at reactor.netty.internal.shaded.reactor.pool.AbstractPool$Borrower.fail(AbstractPool.java:427)
  26. at reactor.netty.internal.shaded.reactor.pool.SimpleDequePool.lambda$drainLoop$5(SimpleDequePool.java:310)
  27. at reactor.core.publisher.FluxDoOnEach$DoOnEachSubscriber.onError(FluxDoOnEach.java:186)
  28. at reactor.core.publisher.MonoCreate$DefaultMonoSink.error(MonoCreate.java:189)
  29. at reactor.netty.resources.DefaultPooledConnectionProvider$PooledConnectionAllocator$PooledConnectionInitializer.onError(DefaultPooledConnectionProvider.java:565)
  30. at reactor.core.publisher.Operators.error(Operators.java:196)
  31. at reactor.core.publisher.FluxFlatMap.trySubscribeScalarMap(FluxFlatMap.java:134)
  32. at reactor.core.publisher.MonoFlatMap.subscribeOrReturn(MonoFlatMap.java:53)
  33. at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:57)
  34. at reactor.netty.resources.DefaultPooledConnectionProvider$PooledConnectionAllocator.lambda$connectChannel$0(DefaultPooledConnectionProvider.java:525)
  35. at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:57)
  36. at reactor.core.publisher.Mono.subscribe(Mono.java:4046)
  37. at reactor.core.publisher.Mono.subscribeWith(Mono.java:4161)
  38. at reactor.core.publisher.Mono.subscribe(Mono.java:4017)
  39. at reactor.core.publisher.Mono.subscribe(Mono.java:3953)
  40. at reactor.core.publisher.Mono.subscribe(Mono.java:3925)
  41. at reactor.netty.internal.shaded.reactor.pool.SimpleDequePool.drainLoop(SimpleDequePool.java:318)
  42. at reactor.netty.internal.shaded.reactor.pool.SimpleDequePool.drain(SimpleDequePool.java:261)
  43. at reactor.netty.internal.shaded.reactor.pool.SimpleDequePool.doAcquire(SimpleDequePool.java:256)
  44. at reactor.netty.internal.shaded.reactor.pool.AbstractPool$Borrower.request(AbstractPool.java:382)
  45. at reactor.netty.resources.DefaultPooledConnectionProvider$DisposableAcquire.onSubscribe(DefaultPooledConnectionProvider.java:206)
  46. at reactor.netty.internal.shaded.reactor.pool.SimpleDequePool$QueueBorrowerMono.subscribe(SimpleDequePool.java:578)
  47. at reactor.netty.resources.PooledConnectionProvider.lambda$acquire$1(PooledConnectionProvider.java:120)
  48. at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:57)
  49. at reactor.netty.http.client.HttpClientConnect$MonoHttpConnect.lambda$subscribe$0(HttpClientConnect.java:266)
  50. at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:57)
  51. at reactor.core.publisher.FluxRetryWhen.subscribe(FluxRetryWhen.java:76)
  52. at reactor.core.publisher.MonoRetryWhen.subscribeOrReturn(MonoRetryWhen.java:46)
  53. at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:57)
  54. at reactor.netty.http.client.HttpClientConnect$MonoHttpConnect.subscribe(HttpClientConnect.java:269)
  55. at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)
  56. at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
  57. at reactor.core.publisher.Mono.subscribe(Mono.java:4046)
  58. at reactor.core.publisher.Mono.block(Mono.java:1702)
  59. at .service.AirLinkOSDeviceServiceWebClientImpl.getResponseV2(AirLinkOSDeviceServiceWebClientImpl.java:197)
  60. at .service.AirLinkOSDeviceServiceWebClientImpl.setConfigurationItemV2(AirLinkOSDeviceServiceWebClientImpl.java:119)
  61. at .service.DeviceScheduledJobAsyncService.processApi(DeviceScheduledJobAsyncService.java:71)
  62. at .service.DeviceScheduledJobAsyncService.processDeviceJob(DeviceScheduledJobAsyncService.java:44)
  63. at .service.DeviceScheduledJobAsyncService$$FastClassBySpringCGLIB$$ba9a8368.invoke(<generated>)
  64. at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
  65. at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771)
  66. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
  67. at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
  68. at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)
  69. at java.util.concurrent.FutureTask.run(FutureTask.java:266)
  70. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  71. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  72. at java.lang.Thread.run(Thread.java:750)
  73. Suppressed: java.lang.Exception: #block terminated with an error
  74. at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:99)
  75. at reactor.core.publisher.Mono.block(Mono.java:1703)
  76. at .service.AirLinkOSDeviceServiceWebClientImpl.getResponseV2(AirLinkOSDeviceServiceWebClientImpl.java:197)
  77. at .service.AirLinkOSDeviceServiceWebClientImpl.setConfigurationItemV2(AirLinkOSDeviceServiceWebClientImpl.java:119)
  78. at .service.DeviceScheduledJobAsyncService.processApi(DeviceScheduledJobAsyncService.java:71)
  79. at .service.DeviceScheduledJobAsyncService.processDeviceJob(DeviceScheduledJobAsyncService.java:44)
  80. at .service.DeviceScheduledJobAsyncService$$FastClassBySpringCGLIB$$ba9a8368.invoke(<generated>)
  81. at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
  82. at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771)
  83. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
  84. at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
  85. at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)
  86. at java.util.concurrent.FutureTask.run(FutureTask.java:266)
  87. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  88. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  89. at java.lang.Thread.run(Thread.java:750)
  90. Caused by: io.netty.channel.ChannelException: io.netty.channel.unix.Errors$NativeIoException: newSocketStream(..) failed: Too many open files
  91. at io.netty.channel.unix.Socket.newSocketStream0(Socket.java:430)
  92. at io.netty.channel.epoll.LinuxSocket.newSocketStream(LinuxSocket.java:319)
  93. at io.netty.channel.epoll.LinuxSocket.newSocketStream(LinuxSocket.java:323)
  94. at io.netty.channel.epoll.EpollSocketChannel.<init>(EpollSocketChannel.java:45)
  95. at reactor.netty.resources.DefaultLoopEpoll.getChannel(DefaultLoopEpoll.java:49)
  96. at reactor.netty.resources.LoopResources.onChannel(LoopResources.java:214)
  97. at reactor.netty.tcp.TcpResources.onChannel(TcpResources.java:208)
  98. at reactor.netty.transport.TransportConfig.lambda$connectionFactory$0(TransportConfig.java:265)
  99. at reactor.netty.transport.TransportConnector.doInitAndRegister(TransportConnector.java:171)
  100. at reactor.netty.transport.TransportConnector.connect(TransportConnector.java:102)
  101. at reactor.netty.resources.DefaultPooledConnectionProvider$PooledConnectionAllocator.lambda$connectChannel$0(DefaultPooledConnectionProvider.java:524)
  102. at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:57)
  103. at reactor.core.publisher.Mono.subscribe(Mono.java:4046)
  104. at reactor.core.publisher.Mono.subscribeWith(Mono.java:4161)
  105. at reactor.core.publisher.Mono.subscribe(Mono.java:4017)
  106. at reactor.core.publisher.Mono.subscribe(Mono.java:3953)
  107. at reactor.core.publisher.Mono.subscribe(Mono.java:3925)
  108. at reactor.netty.internal.shaded.reactor.pool.SimpleDequePool.drainLoop(SimpleDequePool.java:318)
  109. at reactor.netty.internal.shaded.reactor.pool.SimpleDequePool.drain(SimpleDequePool.java:261)
  110. at reactor.netty.internal.shaded.reactor.pool.SimpleDequePool.doAcquire(SimpleDequePool.java:256)
  111. at reactor.netty.internal.shaded.reactor.pool.AbstractPool$Borrower.request(AbstractPool.java:382)
  112. at reactor.netty.resources.DefaultPooledConnectionProvider$DisposableAcquire.onSubscribe(DefaultPooledConnectionProvider.java:206)
  113. at reactor.netty.internal.shaded.reactor.pool.SimpleDequePool$QueueBorrowerMono.subscribe(SimpleDequePool.java:578)
  114. at reactor.netty.resources.PooledConnectionProvider.lambda$acquire$1(PooledConnectionProvider.java:120)
  115. at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:57)
  116. at reactor.netty.http.client.HttpClientConnect$MonoHttpConnect.lambda$subscribe$0(HttpClientConnect.java:266)
  117. at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:57)
  118. at reactor.core.publisher.FluxRetryWhen.subscribe(FluxRetryWhen.java:76)
  119. at reactor.core.publisher.MonoRetryWhen.subscribeOrReturn(MonoRetryWhen.java:46)
  120. at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:57)
  121. at reactor.netty.http.client.HttpClientConnect$MonoHttpConnect.subscribe(HttpClientConnect.java:269)
  122. at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)
  123. at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
  124. at reactor.core.publisher.Mono.subscribe(Mono.java:4046)
  125. at reactor.core.publisher.Mono.block(Mono.java:1702)
  126. at .service.AirLinkOSDeviceServiceWebClientImpl.getResponseV2(AirLinkOSDeviceServiceWebClientImpl.java:197)
  127. at .service.AirLinkOSDeviceServiceWebClientImpl.setConfigurationItemV2(AirLinkOSDeviceServiceWebClientImpl.java:119)
  128. at .service.DeviceScheduledJobAsyncService.processApi(DeviceScheduledJobAsyncService.java:71)
  129. at .service.DeviceScheduledJobAsyncService.processDeviceJob(DeviceScheduledJobAsyncService.java:44)
  130. at .service.DeviceScheduledJobAsyncService$$FastClassBySpringCGLIB$$ba9a8368.invoke(<generated>)
  131. at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
  132. at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771)
  133. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
  134. at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
  135. at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)
  136. at java.util.concurrent.FutureTask.run(FutureTask.java:266)
  137. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  138. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  139. at java.lang.Thread.run(Thread.java:750)
  140. Caused by: io.netty.channel.unix.Errors$NativeIoException: newSocketStream(..) failed: Too many open files


或本

  1. org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection
  2. at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:467)
  3. at org.springframework.transaction.support.AbstractPlatformTransactionManager.startTransaction(AbstractPlatformTransactionManager.java:400)
  4. at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373)
  5. at sun.reflect.GeneratedMethodAccessor78.invoke(Unknown Source)
  6. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  7. at java.lang.reflect.Method.invoke(Method.java:498)
  8. at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
  9. at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
  10. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
  11. at org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$PassthruAdvice.invoke(SimpleBatchConfiguration.java:128)
  12. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
  13. at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)
  14. at com.sun.proxy.$Proxy152.getTransaction(Unknown Source)
  15. at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:595)
  16. at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:382)
  17. at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
  18. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
  19. at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)
  20. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
  21. at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:174)
  22. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
  23. at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
  24. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
  25. at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)
  26. at com.sun.proxy.$Proxy149.save(Unknown Source)
  27. at .service.DeviceScheduledJobAsyncService.processApi(DeviceScheduledJobAsyncService.java:99)
  28. at .service.DeviceScheduledJobAsyncService.processDeviceJob(DeviceScheduledJobAsyncService.java:44)
  29. at .service.DeviceScheduledJobAsyncService$$FastClassBySpringCGLIB$$ba9a8368.invoke(<generated>)
  30. at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
  31. at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771)
  32. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
  33. at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
  34. at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)
  35. at java.util.concurrent.FutureTask.run(FutureTask.java:266)
  36. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  37. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  38. at java.lang.Thread.run(Thread.java:750)
  39. Caused by: org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection
  40. at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:112)
  41. at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
  42. at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)
  43. at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)
  44. at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:111)
  45. at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getPhysicalConnection(LogicalConnectionManagedImpl.java:138)
  46. at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getConnectionForTransactionManagement(LogicalConnectionManagedImpl.java:273)
  47. at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.begin(LogicalConnectionManagedImpl.java:281)
  48. at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.begin(JdbcResourceLocalTransactionCoordinatorImpl.java:246)
  49. at org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:83)
  50. at org.springframework.orm.jpa.vendor.HibernateJpaDialect.beginTransaction(HibernateJpaDialect.java:164)
  51. at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:421)
  52. ... 36 common frames omitted
  53. Caused by: org.postgresql.util.PSQLException: The connection attempt failed.
  54. at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:315)
  55. at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:51)
  56. at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:225)
  57. at org.postgresql.Driver.makeConnection(Driver.java:465)
  58. at org.postgresql.Driver.connect(Driver.java:264)
  59. at java.sql.DriverManager.getConnection(DriverManager.java:664)
  60. at java.sql.DriverManager.getConnection(DriverManager.java:208)
  61. at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:155)
  62. at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:146)
  63. at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:205)
  64. at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:169)
  65. at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122)
  66. at org.hibernate.internal.NonContextualJdbcConnectionAccess.obtainConnection(NonContextualJdbcConnectionAccess.java:38)
  67. at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:108)
  68. ... 43 common frames omitted
  69. Caused by: java.net.SocketException: Too many open files
  70. at java.net.Socket.createImpl(Socket.java:478)
  71. at java.net.Socket.connect(Socket.java:605)
  72. at org.postgresql.core.PGStream.createSocket(PGStream.java:231)
  73. at org.postgresql.core.PGStream.<init>(PGStream.java:95)
  74. at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:98)
  75. at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:213)
  76. ... 56 common frames omitted
  77. 2023-12-13 08:13:51,459 WARN [b7403dc2-fc7c-4249-9b61-dbb98cb96e8d] org.hibernate.engine.jdbc.spi.SqlExceptionHelper [FunctionThread-9] SQL Error: 0, SQLState: 08001
  78. 2023-12-13 08:13:51,459 ERROR [b7403dc2-fc7c-4249-9b61-dbb98cb96e8d] org.hibernate.engine.jdbc.spi.SqlExceptionHelper [FunctionThread-9] The connection attempt failed.


无论哪种方式,罪魁祸首似乎是太多的打开文件。
我有点失落,因为我不能确切地指出问题是什么,我能做些什么来解决它。
我在Docker容器中运行我的应用程序。
增加文件描述符限制是唯一的解决办法吗?

f3temu5u

f3temu5u1#

你的应用程序在每个HTTP调用上都要创建大量的基本资源。例如,SSL上下文之类的东西在整个应用程序中几乎是固定的。如果这些资源中的一些包括连接池之类的东西,那么你就在每个请求上创建了一个新的连接池;这将导致你看到的资源耗尽。
在非常普遍的意义上,你会希望在应用程序中只创建一次像SslContextHttpClient这样的对象,然后在需要的时候将它们传递到对象中。Spring的核心功能之一是依赖注入系统,它提供了一种标准的方法来创建这些对象一次,并在需要的时候将它们注入到对象中。
但更具体地说,Sping Boot 已经包含了自己创建大部分这些东西的逻辑。你根本不需要创建任何这些对象。要求Sping Boot 将WebClient.Builder传递给你的对象的构造函数,它会照办的。

  1. @Component
  2. public class MyService {
  3. private final WebClient.Builder webClientBuilder;
  4. public MyService(WebClient.Builder webClientBuilder) {
  5. this.webClientBuilder = webClientBuilder;
  6. }
  7. private <T> String getResponseV2(
  8. String deviceConnection,
  9. String uri,
  10. T body,
  11. Consumer<HttpHeaders> headersConsumer
  12. ) {
  13. // without creating any of the other objects
  14. return WebClient.builder()
  15. .clone()
  16. .baseUrl(deviceConnection)
  17. .build()
  18. .post().uri(uri)
  19. ...;
  20. }
  21. }

字符串
Sping Boot 文档提供了有关注入和配置WebClient的更多信息。如果您确实需要自定义TLS配置,例如,有一个Spring特定的路径,您可以在其中提供WebClientSsl对象,而无需从头开始构建整个对象堆栈。

展开查看全部

相关问题