整體項目介紹:
https://blog.csdn.net/wenjieyatou/article/details/80190886
優惠券項目一介紹:https://blog.csdn.net/wenjieyatou/article/details/80191083
優惠券項目二介紹:
https://blog.csdn.net/wenjieyatou/article/details/80203860
優惠券項目三介紹:
https://blog.csdn.net/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;
}
}
});
}
}