我们项目有这样的代码,个人感觉不是很友好.
比如一个service
类,里面有个操作可能需要异步化,那么我们自己的项目大概是这样的,为代码如下:
public class XXXServiceImpl implements XXXService{
@Resource
private XXXDao xxxDao;
private LinkedBlockingDeque<X> dataQueue;
@PostConstruct
private synchronized void init() {
if(dataQueue == null) {
dataQueue = new LinkedBlockingDeque<X>();
Thread updateThread = new Thread(new Runnable() {
@Override
public void run() {
while(true){
List<X> l = new ArrayList();
X xxx = dataQueue.take();
l.add(xxx);
if(l.size == 200){
xxxDao.batchInsert(l);
l.clear();
}
//do something
}
};
updateThread.setDaemon(true);
updateThread.setName("xxxx");
updateThread.start();
}
}
public void saveData(X xxx){
dataQueue.add(xxx);
}
}
然后每个这样的service
都这样处理异步的.
===================================================================
个人觉得应该集中处理这种需要异步处理的情况,比如一个线程池,每个任务绑定一个callback
处理方法,从线程池里面取出需要处理的异步任务,然后调用callback
进行处理.
这样当重启应用的时候,还可以添加一个hook
,shutdown
这个线程池,等待所有任务都处理完后,才退出进程.
不知道大家的公司怎么处理的,是否也是有我们这样的代码呢?
使用消息队列。