mirror of
https://github.com/qiurunze123/miaosha.git
synced 2023-11-19 22:41:03 +08:00
rpc补偿思路整理
This commit is contained in:
parent
f2cdb2f811
commit
3b53b9d023
|
@ -1,4 +1,4 @@
|
|||
package com.geekq.miaosha;
|
||||
package com.geekq.miaosha.common;
|
||||
/**
|
||||
* Twitter_Snowflake<br>
|
||||
* SnowFlake的结构如下(每部分用-分开):<br>
|
||||
|
@ -73,6 +73,17 @@ public class SnowflakeIdWorker {
|
|||
this.datacenterId = datacenterId;
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成订单唯一ID
|
||||
* @param workerId
|
||||
* @param datacenterId
|
||||
* @return
|
||||
*/
|
||||
public static long getOrderId(long workerId, long datacenterId){
|
||||
SnowflakeIdWorker idWorker = new SnowflakeIdWorker(0, 0);
|
||||
return idWorker.nextId();
|
||||
}
|
||||
|
||||
// ==============================Methods==========================================
|
||||
/**
|
||||
* 获得下一个ID (该方法是线程安全的)
|
|
@ -0,0 +1,106 @@
|
|||
package com.geekq.miaosha.service.rpchander;
|
||||
|
||||
import com.geekq.miaosha.common.SnowflakeIdWorker;
|
||||
import com.geekq.miaosha.common.resultbean.ResultGeekQ;
|
||||
import com.geekq.miaosha.service.rpchander.enums.PlanStepStatus;
|
||||
import com.geekq.miaosha.service.rpchander.enums.PlanStepType;
|
||||
import com.geekq.miaosha.service.rpchander.vo.HandlerParam;
|
||||
import com.geekq.miaosha.service.rpchander.vo.PlanOrder;
|
||||
import com.geekq.miaosha.service.rpchander.vo.PlanStep;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
public class RpcCompensateService {
|
||||
|
||||
|
||||
public ResultGeekQ<String> recharge(){
|
||||
ResultGeekQ<String> result = ResultGeekQ.build();
|
||||
/**
|
||||
* 各种校验check
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* 需要可加redis分布式锁
|
||||
*/
|
||||
|
||||
/**
|
||||
* 拦截
|
||||
* 校验状态 -- init 或 ROLLING_BACK则 返回
|
||||
*
|
||||
* 成功则返回已处理状态
|
||||
*/
|
||||
|
||||
/**
|
||||
* 生成订单和处理步骤
|
||||
*/
|
||||
|
||||
/**
|
||||
* 获取订单
|
||||
*/
|
||||
long orderId = SnowflakeIdWorker.getOrderId(1,1);
|
||||
|
||||
/**
|
||||
* 创建订单步骤 可定义一个VO
|
||||
* 一个planorder 对应多个planstep
|
||||
* 创建 PlanOrder 创建 planStep
|
||||
* createOrderStep(vo);
|
||||
*/
|
||||
|
||||
|
||||
// PlanOrder planOrder = new PlanOrder();
|
||||
// planOrder.setCreateTime(new Date());
|
||||
// planOrder.setVersion(0);
|
||||
// planOrder.setUserId(inputVo.getUserId());
|
||||
// planOrder.setOrderNo(inputVo.getOrderNo());
|
||||
// planOrder.setType(PlanOrderType.X_RECHARGE.name());
|
||||
// planOrder.setParams(params);
|
||||
// planOrder.setStatus(PlanOrderStatus.INIT.name());
|
||||
// planOrderDao.insertSelective(planOrder);
|
||||
//
|
||||
// List<PlanStep> steps = new ArrayList<>();
|
||||
// //第一步请求民生
|
||||
// steps.add(planStepLogic.buildStep(planOrder.getId(), PlanStepType.X_RECHARGE_CMBC, PlanStepStatus.INIT));
|
||||
// if (inputVo.getCouponId() != null) {
|
||||
// //第二步使用优惠券
|
||||
// steps.add(planStepLogic.buildStep(planOrder.getId(), PlanStepType.X_RECHARGE_USE_COUPON, PlanStepStatus.INIT));
|
||||
// }
|
||||
// //第三步减扣主账户
|
||||
// steps.add(planStepLogic.buildStep(planOrder.getId(), PlanStepType.X_RECHARGE_POINT, PlanStepStatus.INIT));
|
||||
// //第四部减扣子账户
|
||||
// steps.add(planStepLogic.buildStep(planOrder.getId(), PlanStepType.X_RECHARGE_SUB_POINT, PlanStepStatus.INIT));
|
||||
// //第五步发送通知
|
||||
// steps.add(planStepLogic.buildStep(planOrder.getId(), PlanStepType.X_RECHARGE_NOTIFY, PlanStepStatus.INIT));
|
||||
//
|
||||
// planStepDao.batchInsert(steps);
|
||||
|
||||
/**
|
||||
*
|
||||
* 调用Rpc接口 第几步错误则回滚前几步
|
||||
* 并更新step状态
|
||||
*
|
||||
* 然后定时任务去处理 状态为INIT与ROLLBACK的 状态订单
|
||||
*
|
||||
*
|
||||
*/
|
||||
// HandlerParam handlerParam = new HandlerParam();
|
||||
// handlerParam.setPlanOrder(planOrder);
|
||||
// AutoInvestPlanRechargeOrderInputVo inputVo = JsonUtil.jsonToBean(planOrder.getParams(), AutoInvestPlanRechargeOrderInputVo.class);
|
||||
// handlerParam.setInputVo(inputVo);
|
||||
// for (int i = 0; i < planStepList.size(); i++) {
|
||||
// PlanStep planStep = planStepList.get(i);
|
||||
// PlanStepType stepType = PlanStepType.valueOf(planStep.getType());
|
||||
// xxx handler = (xxx) xxxx.getApplicationContext().getBean(stepType.getHandler());
|
||||
// boolean handlerResult = handler.handle(handlerParam);
|
||||
// if (!handlerResult) {
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
package com.geekq.miaosha.service.rpchander;
|
||||
|
||||
public interface RpcHandler {
|
||||
|
||||
int RETRY_COUNT = 5 ;
|
||||
|
||||
boolean handele();
|
||||
|
||||
boolean rollBack();
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
package com.geekq.miaosha.service.rpchander.enums;
|
||||
|
||||
public enum PlanStepStatus {
|
||||
|
||||
INIT, //未处理
|
||||
PROCESSING,//处理中
|
||||
SUCCESS, //成功
|
||||
FAIL, //失败
|
||||
ROLLED_BACK, //已回滚
|
||||
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
package com.geekq.miaosha.service.rpchander.enums;
|
||||
|
||||
public enum PlanStepType {
|
||||
|
||||
U_CMBC(10, "protocolHandler"),
|
||||
U_UPDATE_REDIS_AMOUNT(20, "redisAmountHandler"),
|
||||
U_USE_COUPON(30, "couponHandler"),
|
||||
U_USE_SCORE(40, "scoreHandler"),
|
||||
U_USE_UCODE(50, "uCodeHandler"),
|
||||
U_POINT(60, "pointHandler"),
|
||||
U_SUB_POINT(70, "subPointHandler"),
|
||||
U_NOTIFY(80, "notifyHandler"),
|
||||
|
||||
X_RECHARGE_CMBC(10, "rechargeCmbcHandler"),
|
||||
X_RECHARGE_USE_COUPON(20, "rechargeCouponHandler"),
|
||||
X_RECHARGE_POINT(30, "rechargePointHandler"),
|
||||
X_RECHARGE_SUB_POINT(40, "rechargeSubPointHandler"),
|
||||
X_RECHARGE_NOTIFY(50, "rechargeNotifyHandler");
|
||||
|
||||
private int priority;
|
||||
private String handler;
|
||||
|
||||
public String getHandler() {
|
||||
return handler;
|
||||
}
|
||||
|
||||
public void setHandler(String handler) {
|
||||
this.handler = handler;
|
||||
}
|
||||
|
||||
public int getPriority() {
|
||||
return priority;
|
||||
}
|
||||
|
||||
public void setPriority(int priority) {
|
||||
this.priority = priority;
|
||||
}
|
||||
|
||||
PlanStepType(int priority, String handler) {
|
||||
this.priority = priority;
|
||||
this.handler = handler;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
package com.geekq.miaosha.service.rpchander.vo;
|
||||
|
||||
public class HandlerParam {
|
||||
|
||||
private int realCount;
|
||||
private PlanOrder planOrder;
|
||||
private PlanStep planStep;
|
||||
|
||||
}
|
|
@ -0,0 +1,125 @@
|
|||
package com.geekq.miaosha.service.rpchander.vo;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
public class PlanOrder {
|
||||
private Long id;
|
||||
|
||||
private Date createTime;
|
||||
|
||||
private Date updateTime;
|
||||
|
||||
private Integer version;
|
||||
|
||||
private Integer userId;
|
||||
|
||||
private String orderNo;
|
||||
|
||||
private Integer orderId;
|
||||
|
||||
private Integer accountId;
|
||||
|
||||
private String type;
|
||||
|
||||
private String cmbcStatus;
|
||||
|
||||
private String params;
|
||||
|
||||
private String status;
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public Date getCreateTime() {
|
||||
return createTime;
|
||||
}
|
||||
|
||||
public void setCreateTime(Date createTime) {
|
||||
this.createTime = createTime;
|
||||
}
|
||||
|
||||
public Date getUpdateTime() {
|
||||
return updateTime;
|
||||
}
|
||||
|
||||
public void setUpdateTime(Date updateTime) {
|
||||
this.updateTime = updateTime;
|
||||
}
|
||||
|
||||
public Integer getVersion() {
|
||||
return version;
|
||||
}
|
||||
|
||||
public void setVersion(Integer version) {
|
||||
this.version = version;
|
||||
}
|
||||
|
||||
public Integer getUserId() {
|
||||
return userId;
|
||||
}
|
||||
|
||||
public void setUserId(Integer userId) {
|
||||
this.userId = userId;
|
||||
}
|
||||
|
||||
public String getOrderNo() {
|
||||
return orderNo;
|
||||
}
|
||||
|
||||
public void setOrderNo(String orderNo) {
|
||||
this.orderNo = orderNo;
|
||||
}
|
||||
|
||||
public Integer getOrderId() {
|
||||
return orderId;
|
||||
}
|
||||
|
||||
public void setOrderId(Integer orderId) {
|
||||
this.orderId = orderId;
|
||||
}
|
||||
|
||||
public Integer getAccountId() {
|
||||
return accountId;
|
||||
}
|
||||
|
||||
public void setAccountId(Integer accountId) {
|
||||
this.accountId = accountId;
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(String type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public String getCmbcStatus() {
|
||||
return cmbcStatus;
|
||||
}
|
||||
|
||||
public void setCmbcStatus(String cmbcStatus) {
|
||||
this.cmbcStatus = cmbcStatus;
|
||||
}
|
||||
|
||||
public String getParams() {
|
||||
return params;
|
||||
}
|
||||
|
||||
public void setParams(String params) {
|
||||
this.params = params;
|
||||
}
|
||||
|
||||
public String getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(String status) {
|
||||
this.status = status;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,105 @@
|
|||
package com.geekq.miaosha.service.rpchander.vo;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
public class PlanStep {
|
||||
private Long id;
|
||||
|
||||
private Date createTime;
|
||||
|
||||
private Date updateTime;
|
||||
|
||||
private Integer version;
|
||||
|
||||
private Long orderId;
|
||||
|
||||
private String status;
|
||||
|
||||
private String type;
|
||||
|
||||
private Integer priority;
|
||||
|
||||
private Integer retryCount;
|
||||
|
||||
private String remark;
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public Date getCreateTime() {
|
||||
return createTime;
|
||||
}
|
||||
|
||||
public void setCreateTime(Date createTime) {
|
||||
this.createTime = createTime;
|
||||
}
|
||||
|
||||
public Date getUpdateTime() {
|
||||
return updateTime;
|
||||
}
|
||||
|
||||
public void setUpdateTime(Date updateTime) {
|
||||
this.updateTime = updateTime;
|
||||
}
|
||||
|
||||
public Integer getVersion() {
|
||||
return version;
|
||||
}
|
||||
|
||||
public void setVersion(Integer version) {
|
||||
this.version = version;
|
||||
}
|
||||
|
||||
public Long getOrderId() {
|
||||
return orderId;
|
||||
}
|
||||
|
||||
public void setOrderId(Long orderId) {
|
||||
this.orderId = orderId;
|
||||
}
|
||||
|
||||
public String getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(String status) {
|
||||
this.status = status == null ? null : status.trim();
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(String type) {
|
||||
this.type = type == null ? null : type.trim();
|
||||
}
|
||||
|
||||
public Integer getPriority() {
|
||||
return priority;
|
||||
}
|
||||
|
||||
public void setPriority(Integer priority) {
|
||||
this.priority = priority;
|
||||
}
|
||||
|
||||
public Integer getRetryCount() {
|
||||
return retryCount;
|
||||
}
|
||||
|
||||
public void setRetryCount(Integer retryCount) {
|
||||
this.retryCount = retryCount;
|
||||
}
|
||||
|
||||
public String getRemark() {
|
||||
return remark;
|
||||
}
|
||||
|
||||
public void setRemark(String remark) {
|
||||
this.remark = remark == null ? null : remark.trim();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user