基础推送服务组件封装

在项目开发过程中,我们经常会涉及到用Job将活动数据推送到别的业务线,这中间涉及到数据增量更新和上下线逻辑。

基础推送服务组件就是对数据的上线、下线、修改等状态判断,数据入库、回调等一切公共操作逻辑的封装。

支持全量数据重新推送

支持全量数据下线

支持并发推送数据

设计方案如下:
  • 查询所有报名中推送记录列表A
  • 查询推送中、已推送、已暂停(支持推暂停)的记录列表B
  • 列表A和列表B数据做对比
    • 列表A中存在,列表B中不存在:推上线
    • 列表A中不存在,列表B中存在:推下线
    • 列表A和列表B均存在
      • 列表A中数据最新编辑时间大于列表B中最新推送时间:推修改
      • 列表A中数据最新编辑时间小于于列表B中最新推送时间:本次推送无需处理
架构UML图
image-20210420162318919
支持的推送状态
NO_PUSH(0, "未推送"),
PUSH_ING(1, "推送中"),
PUSHED(2, "已上线"),
PUSH_END(3, "已下线"),
PUSH_PAUSE(4, "已暂停");
使用说明

场景1:实现一个没有子业务线推送逻辑、活动下线推结束、推送后不需要回调的推送服务

直接继承AbstractBasePushService抽象类,实现上线、下线操作即可

@Service
public class ActivityPushService extends AbstractBasePushService {

    /**
     * 定义的业务线id
     */
    @Override
    public BasePushBusinessEnum getBasePushBusinessEnum() {
        return null;
    }

    /**
     * 定义推送记录的唯一id
     */
    @Override
    protected String getUniqueId(BasePushProtocol basePushProtocol) {
        return null;
    }

    /**
     * 子业务线id
     */
    @Override
    public int getSubBusinessId() {
        return 0;
    }

    /**
     * 推送下线
     */
    @Override
    public PushHandleContext pushDownLine(BasePushRecord basePushRecord) {
        return null;
    }

    /**
     * 推送上线或修改
     */
    @Override
    public PushHandleContext pushOnline(BasePushProtocol basePushProtocol, String returnUniqueId) {
        return null;
    }

    /**
     * 查询所有需要推送的记录列表
     */
    @Override
    public List getBasePushProtocolList() {
        return null;
    }
}

场景2:实现一个没有子业务线推送逻辑、活动下线推暂停、推送后需要回调的推送服务(业务方异步通知数据是否推送成功)

直接继承AbstractCallBackPauseBasePushService抽象类,实现上线、下线操作即可

@Service
public class ActivityPushService extends AbstractCallBackPauseBasePushService {}

场景3:实现一个多个子业务线推送逻辑、活动下线推结束、推送后不需要回调的推送服务

直接继承AbstractMultiBasePushService抽象类,实现上线、下线操作即可

@Service
public class ActivityPushService extends AbstractMultiCallBackPauseBasePushService {
    // 数据处理交由IPushHandleService处理
    @Resource
    private IPushHandleService activityPushHandlerService;

    @Override
    public BasePushBusinessEnum getBasePushBusinessEnum() {
        return BasePushBusinessEnum.ACTIVITY_PUSH;
    }

    @Override
    protected String getUniqueId(BasePushProtocol basePushProtocol) {
        return String.valueOf(basePushProtocol.getActivityId());
    }

    @Override
    public int getSubBusinessId() {
        return 1;
    }

    @Override
    protected IPushHandleService pushHandlerService() {
        return activityPushHandlerService;
    }
}

public abstract class AbstractPushHandleService implements IPushHandleService {

    @Override
    public PushHandleContext pushDownLine(BasePushRecord basePushRecord) {
        // 真正实现下线逻辑
    }

    @Override
    public PushHandleContext pushOnline(BasePushProtocol basePushProtocol, String returnUniqueId) {
        // 真正实现上线、修改逻辑
    }
    
    protected abstract TaskParam createTaskParam(BasePushProtocol basePushProtocol);
}

@Service
public class ActivityPushHandleService extends AbstractPushHandleService {
    
    @Override
    protected TaskParam createTaskParam(BasePushProtocol basePushProtocol) {
        // 推送数据封装
    }

    @Override
    public List getBasePushProtocolList() {
        // 查询可推送的记录列表
    }
}

场景4:实现一个多个子业务线推送逻辑、活动下线推暂停、推送后需要回调的推送服务(业务方异步通知数据是否推送成功)

直接继承AbstractMultiCallBackPauseBasePushService抽象类,实现上线、下线操作即可

完整源码地址

https://github.com/shawntime/shawn-base-push

你可能感兴趣的:(基础推送服务组件封装)