线程池异步回调方式
当请求进入Controller层中的时候,我们要经历一系列的CRUD的操作才能返回信息,往往其中部分的CRUD并不是需要及时完成的,可以在返回信息后完成。也就是说需要异步去操作,那在JAVA中如何去实现呢?
首先这种异步去执行肯定是存在时间差的,也就是一个请求是分时间段去处理的。这里就需要一个根据时间去执行的线程池,封装各种不同的任务丢入线程池中,完成之后再回调方法通知你完成,可以在回调方法中去做相关处理完成的逻辑。下面展示一个简单的Demo例子代码。
代码展示
首先需要封装一个Task类
- 该Task类继承自Runnable接口,需要自定义实现run方法。
- Java 8中出现的新接口Consumer,是实现任务执行完成后回调的关键。
- 任务的构造方法中可以根据业务加入更多的参数来判断,这里简单的加了两个参数来判断
import java.util.function.Consumer;
public class Runtask implements Runnable {
private String consumer;
private Consumer<Runtask> finishCallback;
private boolean isSuccess;
public boolean isSuccess() {
return isSuccess;
}
public Runtask(String consumer, Consumer<Runtask> finishCallback) {
this.consumer = consumer;
this.finishCallback = finishCallback;
this.isSuccess = true;
}
@Override
public void run() {
System.out.println("开始执行run方法");
System.out.println("开始执行回调方法");
finishCallback.accept(this);
}
}
创建一个业务层去调用这个任务并且放入线程池中
import org.springframework.stereotype.Service;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
@Service
public class TaskService {
public void createTask() {
String consumer = "111";
System.out.println("创建任务");
//新建任务并传入参数
Runtask task = new Runtask(consumer, finishCallback());
long delay = 10;
System.out.println("任务放入线程池中");
ScheduledThreadPoolExecutor scheduled = new ScheduledThreadPoolExecutor(2);
//放入线程池中延时执行
scheduled.schedule(task, delay, TimeUnit.SECONDS);
System.out.println("任务放入完毕");
}
private Consumer<Runtask> finishCallback() {
return (Runtask task) -> {
if (task.isSuccess()) {
System.out.println("任务执行成功后执行的操作");
}
System.out.println("这里也可以做一些成功后的操作");
};
}
}
控制层去调用
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class TestController {
@Resource
private TaskService taskService;
@GetMapping("testRuntask")
public void testRuntask() {
System.out.println("开启运行");
taskService.createTask();
}
}
调用截图
总结
- 可以封装不同的任务去实现不同的业务
- 提供了一种异步回调的方式