我需要做的就是我不知道这是最好的做法。
在我向特定服务发送一个请求后,这个请求返回OK并排队我的请求。我有一个回调服务,用于在结束时通知。
问题是整个过程可能需要很长时间而且没有通知任何事情,之后我需要考虑超时。
该应用程序是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 ?????
,我怎么能这样做呢?答案 0 :(得分:3)
您可以使用ScheduledExecutorService来安排任务
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
...
scheduler.schedule(() -> {yourtaskhere}, 15, TimeUnit.MINUTES);
但这不是你想要的。如果服务器在任务的调度和执行之间死亡怎么办?你将失去你的任务。 如果将消息保留在队列中并稍后检索它,或者使用任何使用持久性的调度程序(一个石英)
会更好答案 1 :(得分:1)
您可以在配置中添加@EnableScheduling批注:
@Configuration
@EnableAsync
@EnableScheduling
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;
}
}
如果您要安排一次计划并延迟,可以致电taskScheduler:
@Autowired
private TaskScheduler taskScheduler;
并执行任务:
taskScheduler.schedule(
() -> {//your task},
//Your Delay task
);
答案 2 :(得分:1)
您可以使用Redis支持的延迟调度程序,这将确保您不会丢失任务。使用Rqueue可以很容易地做到这一点。
在Rqueue中,您可以将15分钟后运行的任务加入队列,
public class Verification {
private String id;
}
@Component
class VerificationListener {
@RqueueListener(
value = "verification-queue")
public void onMessage(Verification verification) {
// do verification
}
}
@Service
class DelayedTaskService {
@Autowired private RqueueMessageSender rqueueMessageSender
public void enqeueVerification(Verification verification) {
rqueueMessageSender.enqueuIn("verification-queue", verification, Duration.ofMinutes(15);
}
}
P.S。我是Rqueue库的开发人员。
答案 3 :(得分:0)
我认为我们可以在最近的春季使用@Scheduled。它将每15分钟运行一次 像这样的方法注释如下
@Scheduled(cron = "0 0/15 * * * *")
public void verifyStatusTimPayment() throws InterruptedException {
logger.info( "Executed after 5s " + new SimpleDateFormat("dd/MM/yyyy hh:mm:ss").format(new Date()));
}
我知道我来晚了,但可能会帮助正在经历话题的人