Код: Выделить всё
boolean terminated = toBeKilledProcessHandle.destroy();
Дамп потока этого процесса состоит из следующей части:
Код: Выделить всё
"Thread-3" #29 [1963] prio=5 os_prio=0 cpu=6.63ms elapsed=1524.97s tid=0x000070e474005da0 nid=1963 waiting on condition [0x000070e603c05000]
java.lang.Thread.State: WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@21.0.9/Native Method)
- parking to wait for ( a j a v a . u t i l . c o n c u r r e n t . C o m p l e t a b l e F u t u r e $ S i g n a l l e r ) < b r / > a t j a v a . u t i l . c o n c u r r e n t . l o c k s . L o c k S u p p o r t . p a r k ( j a v a . b a s e @ 2 1 . 0 . 9 / L o c k S u p p o r t . j a v a : 2 2 1 ) < b r / > a t j a v a . u t i l . c o n c u r r e n t . C o m p l e t a b l e F u t u r e $ S i g n a l l e r . b l o c k ( j a v a . b a s e @ 2 1 . 0 . 9 / C o m p l e t a b l e F u t u r e . j a v a : 1 8 6 4 ) < b r / > a t j a v a . u t i l . c o n c u r r e n t . F o r k J o i n P o o l . u n m a n a g e d B l o c k ( j a v a . b a s e @ 2 1 . 0 . 9 / F o r k J o i n P o o l . j a v a : 3 7 8 0 ) < b r / > a t j a v a . u t i l . c o n c u r r e n t . F o r k J o i n P o o l . m a n a g e d B l o c k ( j a v a . b a s e @ 2 1 . 0 . 9 / F o r k J o i n P o o l . j a v a : 3 7 2 5 ) < b r / > a t j a v a . u t i l . c o n c u r r e n t . C o m p l e t a b l e F u t u r e . w a i t i n g G e t ( j a v a . b a s e @ 2 1 . 0 . 9 / C o m p l e t a b l e F u t u r e . j a v a : 1 8 9 8 ) < b r / > a t j a v a . u t i l . c o n c u r r e n t . C o m p l e t a b l e F u t u r e . g e t ( j a v a . b a s e @ 2 1 . 0 . 9 / C o m p l e t a b l e F u t u r e . j a v a : 2 0 7 2 ) < b r / > a t s o f t w a r e . a m a z o n . a w s s d k . u t i l s . C o m p l e t a b l e F u t u r e U t i l s . j o i n I n t e r r u p t i b l y ( C o m p l e t a b l e F u t u r e U t i l s . j a v a : 2 2 7 ) < b r / > a t s o f t w a r e . a m a z o n . a w s s d k . h t t p . c r t . A w s C r t H t t p C l i e n t $ C r t H t t p R e q u e s t . c a l l ( A w s C r t H t t p C l i e n t . j a v a : 1 1 8 ) < b r / > a t s o f t w a r e . a m a z o n . a w s s d k . h t t p . c r t . A w s C r t H t t p C l i e n t $ C r t H t t p R e q u e s t . c a l l ( A w s C r t H t t p C l i e n t . j a v a : 1 0 4 ) < b r / > a t s o f t w a r e . a m a z o n . a w s s d k . c o r e . i n t e r n a l . u t i l . M e t r i c U t i l s . m e a s u r e D u r a t i o n U n s a f e ( M e t r i c U t i l s . j a v a : 1 0 3 ) < b r / > a t s o f t w a r e . a m a z o n . a w s s d k . c o r e . i n t e r n a l . h t t p . p i p e l i n e . s t a g e s . M a k e H t t p R e q u e s t S t a g e . e x e c u t e H t t p R e q u e s t ( M a k e H t t p R e q u e s t S t a g e . j a v a : 8 8 ) < b r / > a t s o f t w a r e . a m a z o n . a w s s d k . c o r e . i n t e r n a l . h t t p . p i p e l i n e . s t a g e s . M a k e H t t p R e q u e s t S t a g e . e x e c u t e ( M a k e H t t p R e q u e s t S t a g e . j a v a : 6 4 ) < b r / > a t s o f t w a r e . a m a z o n . a w s s d k . c o r e . i n t e r n a l . h t t p . p i p e l i n e . s t a g e s . M a k e H t t p R e q u e s t S t a g e . e x e c u t e ( M a k e H t t p R e q u e s t S t a g e . j a v a : 4 6 ) < b r / > a t s o f t w a r e . a m a z o n . a w s s d k . c o r e . i n t e r n a l . h t t p . p i p e l i n e . R e q u e s t P i p e l i n e B u i l d e r $ C o m p o s i n g R e q u e s t P i p e l i n e S t a g e . e x e c u t e ( R e q u e s t P i p e l i n e B u i l d e r . j a v a : 2 0 6 ) < b r / > a t s o f t w a r e . a m a z o n . a w s s d k . c o r e . i n t e r n a l . h t t p . p i p e l i n e . R e q u e s t P i p e l i n e B u i l d e r $ C o m p o s i n g R e q u e s t P i p e l i n e S t a g e . e x e c u t e ( R e q u e s t P i p e l i neBuilder.java:206)
at software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206)
at software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206)
at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallAttemptTimeoutTrackingStage.execute(ApiCallAttemptTimeoutTrackingStage.java:74)
at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallAttemptTimeoutTrackingStage.execute(ApiCallAttemptTimeoutTrackingStage.java:43)
at software.amazon.awssdk.core.internal.http.pipeline.stages.TimeoutExceptionHandlingStage.execute(TimeoutExceptionHandlingStage.java:79)
at software.amazon.awssdk.core.internal.http.pipeline.stages.TimeoutExceptionHandlingStage.execute(TimeoutExceptionHandlingStage.java:41)
at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallAttemptMetricCollectionStage.execute(ApiCallAttemptMetricCollectionStage.java:55)
at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallAttemptMetricCollectionStage.execute(ApiCallAttemptMetricCollectionStage.java:39)
at software.amazon.awssdk.core.internal.http.pipeline.stages.RetryableStage.executeRequest(RetryableStage.java:93)
at software.amazon.awssdk.core.internal.http.pipeline.stages.RetryableStage.execute(RetryableStage.java:56)
at software.amazon.awssdk.core.internal.http.pipeline.stages.RetryableStage.execute(RetryableStage.java:36)
at software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206)
at software.amazon.awssdk.core.internal.http.StreamManagingStage.execute(StreamManagingStage.java:53)
at software.amazon.awssdk.core.internal.http.StreamManagingStage.execute(StreamManagingStage.java:35)
at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallTimeoutTrackingStage.executeWithTimer(ApiCallTimeoutTrackingStage.java:82)
at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallTimeoutTrackingStage.execute(ApiCallTimeoutTrackingStage.java:62)
at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallTimeoutTrackingStage.execute(ApiCallTimeoutTrackingStage.java:43)
at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallMetricCollectionStage.execute(ApiCallMetricCollectionStage.java:50)
at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallMetricCollectionStage.execute(ApiCallMetricCollectionStage.java:32)
at software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206)
at software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206)
at software.amazon.awssdk.core.internal.http.pipeline.stages.ExecutionFailureExceptionReportingStage.execute(ExecutionFailureExceptionReportingStage.java:37)
at software.amazon.awssdk.core.internal.http.pipeline.stages.ExecutionFailureExceptionReportingStage.execute(ExecutionFailureExceptionReportingStage.java:26)
at software.amazon.awssdk.core.internal.http.AmazonSyncHttpClient$RequestExecutionBuilderImpl.execute(AmazonSyncHttpClient.java:210)
at software.amazon.awssdk.core.internal.handler.BaseSyncClientHandler.invoke(BaseSyncClientHandler.java:103)
at software.amazon.awssdk.core.internal.handler.BaseSyncClientHandler.doExecute(BaseSyncClientHandler.java:173)
at software.amazon.awssdk.core.internal.handler.BaseSyncClientHandler.lambda$execute$1(BaseSyncClientHandler.java:80)
at software.amazon.awssdk.core.internal.handler.BaseSyncClientHandler$$Lambda/0x000070e66c2a3858.get(Unknown Source)
at software.amazon.awssdk.core.internal.handler.BaseSyncClientHandler.measureApiCallSuccess(BaseSyncClientHandler.java:182)
at software.amazon.awssdk.core.internal.handler.BaseSyncClientHandler.execute(BaseSyncClientHandler.java:74)
at software.amazon.awssdk.core.client.handler.SdkSyncClientHandler.execute(SdkSyncClientHandler.java:45)
at software.amazon.awssdk.awscore.client.handler.AwsSyncClientHandler.execute(AwsSyncClientHandler.java:53)
at software.amazon.awssdk.services.s3.DefaultS3Client.uploadPart(DefaultS3Client.java:13556)
at com.company.CompanyOperations.uploadPart(CompanyOperations.java:559)
at com.company.CompanyWrapper.uploadPart(CompanyWrapper.java:440)
at com.company.CompanyObjectOutputStream.flushBuffer(CompanyObjectOutputStream.java:171)
at com.company.CompanyObjectOutputStream.close(CompanyObjectOutputStream.java:222)
at com.github.luben.zstd.ZstdOutputStreamNoFinalizer.close(ZstdOutputStreamNoFinalizer.java:440)
at com.github.luben.zstd.ZstdOutputStreamNoFinalizer.close(ZstdOutputStreamNoFinalizer.java:405)
- locked (a com.github.luben.zstd.ZstdOutputStreamNoFinalizer)
at sun.nio.cs.StreamEncoder.implClose(java.base@21.0.9/StreamEncoder.java:435)
at sun.nio.cs.StreamEncoder.lockedClose(java.base@21.0.9/StreamEncoder.java:237)
at sun.nio.cs.StreamEncoder.close(java.base@21.0.9/StreamEncoder.java:222)
at java.io.OutputStreamWriter.close(java.base@21.0.9/OutputStreamWriter.java:266)
at java.io.BufferedWriter.implClose(java.base@21.0.9/BufferedWriter.java:398)
at java.io.BufferedWriter.close(java.base@21.0.9/BufferedWriter.java:386)
- locked (a java.io.OutputStreamWriter)
at com.company.WriterBaseWrapper.close(WriterBaseWrapper.java:110)
at com.company.CustomLog4j2Appender.close(CustomLog4j2Appender.java:74)
at com.company.CustomLog4j2Appender.lambda$new$0(CustomLog4j2Appender.java:45)
at com.company.CustomLog4j2Appender$$Lambda/0x000070e66c38dfa0.run(Unknown Source)
at java.lang.Thread.runWith(java.base@21.0.9/Thread.java:1596)
at java.lang.Thread.run(java.base@21.0.9/Thread.java:1583)
Locked ownable synchronizers:
- (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
Details:
Код: Выделить всё
this.shutdownHook = new Thread(() -> {
this.close();
});
Runtime.getRuntime().addShutdownHook(this.shutdownHook);
Но, как видно из stacktrace, код библиотеки AWS для загрузки файла в S3 ожидает (java.util.concurrent.CompletableFuture$Signaller).
Других результатов для этого нет. 0x00000000ff714278 во всем дампе потока. То же самое для условия [0x000070e603c05000].
Как устранить эту неполадку дальше?
В чем проблема?
Каково решение, чтобы вызовы завершились и файл был записан в S3?
При некоторой попытке найти ответ я получил информацию о том, что - возможно, перехват выключения завершается даже до завершения асинхронных операций в других потоках. Поэтому я добавил 5-секундную задержку в перехватчике завершения работы после вызова close().
Код: Выделить всё
this.shutdownHook = new Thread(() -> {
shuttingDown = true;
this.close();
try {
// Let async operations complete in aws sdk library
Thread.sleep(5000);
} catch (InterruptedException e) {
// ignore
}
});
Runtime.getRuntime().addShutdownHook(this.shutdownHook);
Подробнее здесь: https://stackoverflow.com/questions/798 ... tdown-hook
Мобильная версия