最近在项目中要优化接口,发现guava并发编程中的ListenableFuture比较适合,所以就用上了。感觉还不错,分享一下。使用场景是这样的,客户端需要上传数据到服务端,涉及到几个表的插入。之前都是一个一个表插入的,性能不是很好的。现在改为并发插入,代码如下:
private ListeningExecutorService executorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2));
private String uploadData(final String entityId, TotalPayInfoVo totalPayInfoVo) throws ExecutionException, InterruptedException {
totalPayInfoVo.setEntityId(entityId);
List<ListenableFuture<?>> listenableFutures = new ArrayList<>();
//保存账单信息
final TotalPay totalPay = totalPayInfoVo.getTotalPay();
final ServiceBillVO serviceBillVO = totalPayInfoVo.getServiceBillVO();
if (totalPay != null || serviceBillVO != null) {
listenableFutures.add(executorService.submit(new Runnable() {
@Override
public void run() {
saveOrUpdateTotalPay(entityId, totalPay, serviceBillVO);
}
}));
}
//保存订单和菜信息
final List<OrderInfoVo> orderInfoVos = totalPayInfoVo.getOrderInfoVos();
if (orderInfoVos != null && !orderInfoVos.isEmpty()) {
listenableFutures.add(executorService.submit(new Callable<String>() {
public String call() {
String result = null;
for (OrderInfoVo orderInfoVo : orderInfoVos) {
result = saveOrUpdateOrder(entityId, orderInfoVo);
clearPrePayInfo(orderInfoVo.getOrder());
}
return result;
}
}));
}
//保存支付流水
final List<Pay> pays = totalPayInfoVo.getPays();
if (pays != null && !pays.isEmpty()) {
listenableFutures.add(executorService.submit(new Runnable() {
@Override
public void run() {
saveOrUpdatePays(entityId, pays);
}
}));
}
//保存支付明细
final List<PayDetail> payDetails = totalPayInfoVo.getPayDetails();
if (payDetails != null && !payDetails.isEmpty()) {
listenableFutures.add(executorService.submit(new Runnable() {
@Override
public void run() {
saveOrUpdatePayDetails(entityId, payDetails);
}
}));
}
//保存损益或者服务费
final List<SpecialFee> specialFees = totalPayInfoVo.getSpecialFees();
if (specialFees != null && !specialFees.isEmpty()) {
listenableFutures.add(executorService.submit(new Runnable() {
@Override
public void run() {
saveOrUpdateSpecialFee(entityId, specialFees);
}
}));
}
String result = null;
ListenableFuture<List<Object>> results = Futures.allAsList(listenableFutures);
for (Object obj : results.get()) {
if (obj != null) {
result = obj.toString();
}
}
return result;
}
总结:ListenableFuture特别适合处理回调事件,以前用java标准库的Future都要自己处理回调。