2017-04-17 17 views
1

Asyncコンフィグレーションを有効にしてSpringブートを実行しています。SpringのAsync Restメソッドが非同期に実行されていません

これは、残りのコントローラである:

@RestController 
@RequestMapping("/logCentralLoja") 
@Component 
public class LogCentralLojaController { 

    private final LogCentralLojaCompactoRepository logRepo; 
    private final Logger logger = LoggerFactory.getLogger(this.getClass()); 

    @Autowired 
    public LogCentralLojaController(LogCentralLojaCompactoRepository logRepo) { 
     this.logRepo = logRepo; 
    } 

    @CrossOrigin 
    @RequestMapping(value = "/getLogCompacto", method = RequestMethod.GET) 
    public DeferredResult<ResponseEntity<?>> getLogCompacto(@PathParam(value = "cd_filial") int cd_filial, 
     @PathParam(value = "cd_log") long cd_log) { 

     DeferredResult<ResponseEntity<?>> deferredResult = new DeferredResult<>(); 

     logger.info("/getLogCompacto -> Início"); 

     ListenableFuture<List<LogCentralLojaCompactoEntity>> logsFuture = logRepo 
      .getByCdLogGreaterThanAndCdFilial(cd_log, cd_filial); 

     logsFuture.addCallback(
      new ListenableFutureCallback<List<LogCentralLojaCompactoEntity>>() { 
       @Override 
       public void onSuccess(List<LogCentralLojaCompactoEntity> logs) { 
        logger.info("/getLogCompacto -> Callback -> onSucess"); 

        if (logs.size() == 0) { 
         ResponseEntity<Void> not_modified = new ResponseEntity<>(HttpStatus.NOT_MODIFIED); 
         deferredResult.setResult(not_modified); 
        } else { 
         deferredResult.setResult(ResponseEntity.ok(new LogCentralCompactoLojaCollectionDto(logs))); 
        } 
       } 

       @Override 
       public void onFailure(Throwable t) { 
        logger.info("/getLogCompacto -> Callback -> onFailure"); 
        ResponseEntity<Void> responseEntity = new ResponseEntity<>(HttpStatus.SERVICE_UNAVAILABLE); 
        deferredResult.setResult(responseEntity); 
       } 
      } 
     ); 

     logger.info("/getLogCompacto -> Fim"); 

     return deferredResult; 
    } 
} 

これは、ログ出力リレーです:

 
2017-04-17 11:26:30.410 INFO 2776 --- [nio-8080-exec-4] b.c.c.d.c.LogCentralLojaController  : /getLogCompacto -> Início 
2017-04-17 11:26:31.641 INFO 2776 --- [nio-8080-exec-4] b.c.c.d.c.LogCentralLojaController  : /getLogCompacto -> Callback -> onSucess 
2017-04-17 11:26:31.641 INFO 2776 --- [nio-8080-exec-4] b.c.c.d.c.LogCentralLojaController  : /getLogCompacto -> Fim 

私が見て期待していた>コールバック - - 「/ getLogCompactoの前に "/ getLogCompacto> FIM" を - > onSucess "私は正しい?私は何が欠けているのですか?

logRepo.getByCdLogGreaterThanAndCdFilialは次のようになります。

public interface LogCentralLojaCompactoRepository extends CrudRepository<LogCentralLojaCompactoEntity, Long>, 
    LogCentralLojaCompactoRepositoryCustom { 

    @Async 
    ListenableFuture<List<LogCentralLojaCompactoEntity>> getByCdLogGreaterThanAndCdFilial(long cdLog, int cdFilial); 
} 

非同期設定:

@Configuration 
@EnableAsync 
public class AsyncConfiguration extends AsyncConfigurerSupport { 

    @Override 
    public Executor getAsyncExecutor() { 
     ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
     executor.setCorePoolSize(4); 
     executor.setMaxPoolSize(4); 
     executor.setQueueCapacity(40); 
     executor.setThreadNamePrefix("Thread-"); 
     executor.initialize(); 

     return executor; 
    } 
} 

ありがとう! @EnableAsyncがあるクラス宣言で

@Bean 
public TaskExecutor getTaskExecutor() { 
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
    executor.setCorePoolSize(4); 
    executor.setMaxPoolSize(4); 
    executor.setQueueCapacity(40); 
    executor.setThreadNamePrefix("Thread-"); 
    executor.initialize(); 

    return executor; 
} 

:このような春のブート構成を変更

+0

非同期に実行されていないため、ログ内のすべてのエントリが同じスレッドから取得されます。 Asyncの設定は何ですか? – jny

+0

非同期設定で更新されました。ありがとう。 –

答えて

0

は、問題を解決しました。

関連する問題