Spring Cloud AWS: оптимизировать количество потоков - PullRequest
0 голосов
/ 26 июня 2019

Я использую spring-cloud-aws-autoconfigure и spring-cloud-aws-messaging в приложении Spring Boot для чтения сообщений из очереди SQS.

В дампе потока приложения есть 50 потоков с именем pool-3-thread-1 ...pool-3-thread-50 которые едва привыкли.Только один из этих потоков используется в любой момент времени.Когда поток используется, он имеет следующую трассировку стека:

java.net.SocketInputStream.socketRead0(SocketInputStream.java:-2) native
              java.net.SocketInputStream.socketRead(SocketInputStream.java:116) 
              java.net.SocketInputStream.read(SocketInputStream.java:171) 
              java.net.SocketInputStream.read(SocketInputStream.java:141) 
              sun.security.ssl.InputRecord.readFully(InputRecord.java:465) 
              sun.security.ssl.InputRecord.read(InputRecord.java:503) 
              sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:975) 
              sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:933) 
              sun.security.ssl.AppInputStream.read(AppInputStream.java:105) 
              org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137) 
              org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153) 
              org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:282) 
              org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:138) 
              org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56) 
              org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259) 
              org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163) 
              org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:165) 
              org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273) 
              com.amazonaws.http.protocol.SdkHttpRequestExecutor.doReceiveResponse(SdkHttpRequestExecutor.java:82) 
              org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125) 
              org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272) 
              org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185) 
              org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185) 
              org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83) 
              org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56) 
              com.amazonaws.http.apache.client.impl.SdkHttpClient.execute(SdkHttpClient.java:72) 
              com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1297) 
              com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1113) 
              com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:770) 
              com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:744) 
              com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:726) 
              com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:686) 
              com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:668) 
              com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:532) 
              com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:512) 
              com.amazonaws.services.sqs.AmazonSQSClient.doInvoke(AmazonSQSClient.java:2147) 
              com.amazonaws.services.sqs.AmazonSQSClient.invoke(AmazonSQSClient.java:2116) 
              com.amazonaws.services.sqs.AmazonSQSClient.invoke(AmazonSQSClient.java:2105) 
              com.amazonaws.services.sqs.AmazonSQSClient.executeReceiveMessage(AmazonSQSClient.java:1559) 
              com.amazonaws.services.sqs.AmazonSQSAsyncClient$14.call(AmazonSQSAsyncClient.java:1057) 
              com.amazonaws.services.sqs.AmazonSQSAsyncClient$14.call(AmazonSQSAsyncClient.java:1051) 
              java.util.concurrent.FutureTask.run(FutureTask.java:266) 
              java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 
              java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 
              java.lang.Thread.run(Thread.java:748) 

Трассировка стека предполагает, что потоки зарезервированы для чтения из SQS.Поскольку потоки не используются, я хотел бы ограничить их количество для экономии ресурсов.

Как настроить количество потоков, используемых AmazonSQSClient?

Я попытался создать свой собственный ThreadPoolTaskExecutor как предложено здесь , но это изменило настройку другого пула, а не pool-3.

РЕДАКТИРОВАТЬ: Я наблюдал заприложение с самого начала, и оно работает так.Приложение начинается с 1 потока из пула-3: pool-3-thread-1.Этот поток работает, и через 20 секунд он останавливается, и создается другой поток (pool-3-thread-2), который сейчас работает.Этот процесс повторяется до тех пор, пока не будет создано 50 потоков, а затем поток 1 снова используется повторно, через 20 секунд поток 2 снова используется и т. Д. ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...