整体项目介绍:
https://blog.youkuaiyun.com/wenjieyatou/article/details/80190886
优惠券项目一介绍:https://blog.youkuaiyun.com/wenjieyatou/article/details/80191083
优惠券项目二介绍:
https://blog.youkuaiyun.com/wenjieyatou/article/details/80203860
优惠券项目三介绍:
https://blog.youkuaiyun.com/wenjieyatou/article/details/80206069
下面是优惠券项目四介绍:
分支1.4
目的:通过异步和消息队列来进行发券具体方案:
1:通过异步进行发券,这样可以提高cpu的利用率,同时通过消息队列来保证稳定性,避免出现异常导致返回前端发券成功,但是异步制券时候出现异常
在发500张优惠券的时候效率大约提升了0.5s2:对代码进行一次重构
原则:把大方法修改小方法,每个小方法处理一个业务,比如获取获取,那么这个方法的职责就是获取活动,同时每个小方法尽量有返回值,这样可以增加代码的可读性
package com.peiyu.mem.manager.impl;
import com.migr.common.util.JsonUtil;
import com.peiyu.mem.dao.CouponDao;
import com.peiyu.mem.domian.entity.Coupon;
import com.peiyu.mem.manager.CouponManager;
import com.peiyu.mem.rabbitmq.produces.MqSenderHandler;
import com.peiyu.mem.utils.ListUtil;
import org.apache.commons.collections.CollectionUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
import java.util.List;
/**
* Created by Administrator on 2016/12/7.
*/
@Service
public class CouponManagerImpl implements CouponManager {
private Logger log = Logger.getLogger(CouponManagerImpl.class);
@Autowired
private PlatformTransactionManager transactionManager;
@Autowired
private CouponDao couponDao;
@Autowired
private MqSenderHandler mqSenderHandler;
@Override
public boolean insertCoupons(final List<Coupon> coupons) {
final long start1 = System.currentTimeMillis();
TransactionTemplate template = new TransactionTemplate(transactionManager);
return template.execute(new TransactionCallback<Boolean>() {
@Override
public Boolean doInTransaction(TransactionStatus transactionStatus) {
try {
if (coupons.size() <= 5000) {
couponDao.insertBatchCoupons(coupons);
}
if (coupons.size() > 5000) {
List<List<Coupon>> tempCoupons = ListUtil.splitList(coupons, 5000);
for (List<Coupon> item : tempCoupons) {
try {
couponDao.insertBatchCoupons(item);
} catch (Exception e) {
String data = JsonUtil.g.toJson(item);//将捕获到的异常交于消息队列处理
mqSenderHandler.sendMessage("spring.makeCoupons.queueKey", data);
continue;
}
}
}
long end1 = System.currentTimeMillis();
log.info("添加" + coupons.size() + "张优惠券消耗时间:" + (end1 - start1) + "毫秒");
return true;
} catch (Exception e) {
log.error("添加优惠券异常:" + e);
transactionStatus.setRollbackOnly();
return false;
}
}
});
}
@Override
public boolean updateCoupons(final List<Coupon> coupons) {
TransactionTemplate template = new TransactionTemplate(transactionManager);
return template.execute(new TransactionCallback<Boolean>() {
@Override
public Boolean doInTransaction(TransactionStatus transactionStatus) {
try {
if (CollectionUtils.isNotEmpty(coupons)) {
couponDao.updateBatchCouponsState(coupons);
return true;
}
return false;
} catch (Exception e) {
transactionStatus.setRollbackOnly();
String data=JsonUtil.g.toJson(coupons);//将捕获到的异常交友消息队列处理
mqSenderHandler.sendMessage("spring.updateCouponState.queueKey",data);
return false;
}
}
});
}
}