2016-12-01 1 views
1

나는 이것에 대한 모범 사례가 아닌지 잘 모르겠다.스프링 작업 비동기 및 지연

특정 서비스에 하나의 요청을 보낸 후이 요청은 확인을 반환하고 요청을 대기시킵니다. 끝날 때 알리는 데 사용되는 콜백 서비스가 있습니다.

문제는 전체 프로세스가 아무런 통보없이 오랜 시간이 걸릴 수 있으며 이후에는 시간 초과를 고려해야한다는 것입니다.

응용 프로그램은 SpringBoot APP이며 @EnableAsync 및 @Async 주석을 서비스 메서드에서 절전 시간과 함께 사용하려고했습니다.

@Configuration 
@EnableAsync 
public class AsyncConfiguration implements AsyncConfigurer { 

    @Override 
    public Executor getAsyncExecutor() { 

     ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
     executor.setCorePoolSize(2); 
     executor.setMaxPoolSize(10); 
     executor.setQueueCapacity(500); 
     executor.setThreadNamePrefix("TIMCLL-"); 
     executor.initialize(); 
     return executor; 

    } 

    @Override 
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 

. . .

@Async 
public void verifyStatusTimPayment() throws InterruptedException { 

    Thread.sleep(5000); 
    logger.info("Executed after 5s " + new SimpleDateFormat("dd/MM/yyyy hh:mm:ss").format(new Date())); 

} 

검증 요청 후 15 분 완료 요청 당 한 번 발생해야 될 필요가있다.

Thread.sleep을 만들지 않고 어떻게 할 수 있습니까 ?????

답변

1

당신 이 당신이 원하는하지 않은 작업

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 
... 
scheduler.schedule(() -> {yourtaskhere}, 15, TimeUnit.MINUTES); 

그러나을 예약 할 ScheduledExecutorService를 사용할 수 있습니다. 작업 스케줄링과 실행 사이에 서버가 작동하지 않으면 어떻게 될까요? 너는 너의 일을 잃을 것이다. 메시지를 큐에 유지하고 나중에 검색하거나 지속성을 사용하는 스케줄러를 사용하는 것이 더 좋습니다 (la Quartz)