5959import java .util .Optional ;
6060import java .util .Set ;
6161import java .util .concurrent .Callable ;
62+ import java .util .concurrent .CompletableFuture ;
6263import java .util .concurrent .ConcurrentHashMap ;
6364import java .util .concurrent .ExecutionException ;
6465import java .util .concurrent .ExecutorCompletionService ;
6566import java .util .concurrent .ExecutorService ;
6667import java .util .concurrent .Executors ;
67- import java .util .concurrent .Future ;
6868import java .util .concurrent .TimeUnit ;
69- import java .util .concurrent .TimeoutException ;
7069import java .util .stream .Collectors ;
7170import java .util .zip .ZipEntry ;
7271import java .util .zip .ZipInputStream ;
@@ -171,7 +170,7 @@ public void generate( HistoricalContentDTO content )
171170 }
172171
173172 recordInProgress ( buildConfigId );
174- Future <? > future = generateExecutor . submit ( () -> {
173+ CompletableFuture < Void > future = CompletableFuture . runAsync ( () -> {
175174 try
176175 {
177176 doGenerate ( content );
@@ -189,27 +188,16 @@ public void generate( HistoricalContentDTO content )
189188 buildConfigLocks .remove ( buildConfigId );
190189 logger .info ( "<<<Lock released for buildConfigId {}" , buildConfigId );
191190 }
192- } );
193- try
194- {
195- future .get ( preSeedConfig .generationTimeoutMinutes ().orElse ( 60 ), TimeUnit .MINUTES );
196- }
197- catch ( TimeoutException e )
198- {
199- // If timeout happens on generation, cancel and remove the status to make sure following generation
200- future .cancel ( true );
201- removeStatus ( buildConfigId );
202- cleanupBCWorkspace ( buildConfigId );
203- logger .error ( "Generation timeout for buildConfigId {}" , buildConfigId , e );
204- }
205- catch ( InterruptedException | ExecutionException e )
206- {
207- // If future task level error happens on generation, cancel and remove the status to make sure following generation
208- future .cancel ( true );
209- removeStatus ( buildConfigId );
210- cleanupBCWorkspace ( buildConfigId );
211- logger .error ( "Generation future task level failed for buildConfigId {}" , buildConfigId , e );
212- }
191+ }, generateExecutor );
192+
193+ future .orTimeout ( preSeedConfig .generationTimeoutMinutes ().orElse ( 60 ), TimeUnit .MINUTES )
194+ .exceptionally ( ex -> {
195+ // If timeout happens on generation, cancel and remove the status to make sure following generation
196+ removeStatus ( buildConfigId );
197+ cleanupBCWorkspace ( buildConfigId );
198+ logger .error ( "Generation timeout for buildConfigId {}" , buildConfigId );
199+ return null ;
200+ } );
213201 }
214202 }
215203
0 commit comments