设计模式之简单消费者模式

 

package com.sitech.crmtpd.market.query.service;

import com.sitech.crmtpd.mapper.MktCallRecordMapper;
import com.sitech.crmtpd.market.domain.MktCallRecord;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Service;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * @oauth: qiangSW
 * @date: 2020/4/20 10:38
 * @description: com.sitech.crmtpd.market.query.service
 * @doc: 消费者
 */
@Service
@Slf4j
public class UtilService implements Runnable, CommandLineRunner {

    @Autowired
    private MktCallRecordMapper mktCallRecordMapper;

    /*最大存储2000*/
    private final int size = 2000;

    private Queue<MktCallRecord> callRecordQueue = new ConcurrentLinkedQueue<>();

    public void addCallRecordQueue(MktCallRecord mktCallRecord) {
        if (this.callRecordQueue.size() > this.size) {
            return;
        }
        this.callRecordQueue.add(mktCallRecord);
    }

    /**
     * 营销推荐查询接口日志记录
     * RecommendInfoServiceImpl
     * 大数据评估使用
     */
    @Override
    public void run() {
        while (true) {
            MktCallRecord mktCallRecord = this.callRecordQueue.poll();
            if (null != mktCallRecord) {
                try {
                    /*入库*/
                    mktCallRecordMapper.inserRecord(mktCallRecord);
                } catch (Exception e) {
                    log.error("[{}]记录调用接口日志失败:", mktCallRecord.getContactOrderId(), e);
                }
                int size = this.callRecordQueue.size();
                log.info("this.callRecordQueue队列长度[{}]", size);
            }
        }
    }

    @Override
    public void run(String... strings) throws Exception {
        run();
    }
}

 

package com.integral.design.consumerModel;

/**
 * @oauth: qiangSW
 * @date: 2020/4/21 9:55
 * @description: com.integral.design.consumerModel
 * @doc:  生产者
 */
public class Producer1 {

    public static void main(String[] args) {

        Consumer consumer = new Consumer();
        consumer.callRecordQueue.add("生产数据");
        consumer.run();
    }
}

 

实际代码中使用案列

背景: 有一个现有的接口,需要记录该接口的调用记录.然后入库

/**
 * @oauth: qiangSW
 * @date: 2020/4/20 10:42
 * @description: com.sitech.crmtpd.market.domain
 * @doc: 营销推荐查询接口 日志记录 do
 */
@Data
public class MktCallRecord {

    private Long mktCallRecordId;
    private Long contactOrderId;
    private Long mktCampaignId;
    private Long contactChlId;
    private Long contactOrgId;
    private String staffNumber;
    private Long idNo;
    private Date createDate;
}

 

    /**
     * 
     * 接口的业务逻辑
     *
     * @param req
     * @return
     */
public ContractRootResp<RecommendInfoRsp> qryRecommendInfo(ContractRootReq<RecommendInfoReq> req) {
        if (Objects.isNull(objectMapper)) {
            objectMapper = new ObjectMapper();
        }

        try {
            log.info("======查询推荐信息服务Test14======入参==========" + objectMapper.writeValueAsString(req));
        } catch (Exception e) {
            log.error("", e);
        }

        RecommendInfoReq requestObject = req.getSvcCont().getRequestObject();
        String accNbr = requestObject.getAccNbr();
        String accNbrTypeCd = requestObject.getAccNbrTypeCd();
        String channelId = requestObject.getChannelId();
        String loginNo = requestObject.getLoginNo();
        String chnId = requestObject.getChlId();
        String serId = requestObject.getSerId();
        

        String orderSql = "SELECT * FROM CONTACT_ORDER WHERE CONTACT_CHL_ID = ? AND TARGET_OBJ_NBR = ? and TARGET_OBJ_TYPE = ? AND STATUS_CD = '1000'";
        List<ContactOrder> contactOrders = jdbcTemplate.query(orderSql, new BeanPropertyRowMapper<>(ContactOrder.class), NumberUtil.getLongFromObj(chnId), serId, TableFields.TAR_OBJ_PROD_INST);
        RecommendInfoRsp rsp = new RecommendInfoRsp();
        List<Map<String, Object>> recommendInfoList = new ArrayList<>();
        if (!CollectionUtils.isEmpty(contactOrders)) {
            contactOrders.stream().forEach(contactOrder -> {
                
                }

                /*新增接口调用日志
				 * 生产者
				*/
                MktCallRecord mktCallRecord = new MktCallRecord();
                String callRecordId = seqService.getNextval("MKT_CALL_RECORD_SEQ");
                mktCallRecord.setMktCallRecordId(Long.valueOf(callRecordId));
                mktCallRecord.setContactOrderId(contactOrderId);
                mktCallRecord.setMktCampaignId(contactOrder.getMktCampaignId());
                mktCallRecord.setContactChlId(Long.valueOf(chnId));
                mktCallRecord.setContactOrgId(Long.valueOf(channelId));
                String idNo = requestObject.getSerId();
                mktCallRecord.setIdNo(Long.valueOf(idNo));
                mktCallRecord.setStaffNumber(loginNo);
                mktCallRecord.setCreateDate(new Date());
                utilService.callRecordQueue.add(mktCallRecord);
            });
        }

        //旧的排序
//        List<Map<String, Object>> recommendInfoList1 = new ArrayList<>();
//        recommendInfoList1 = recommendInfoList.stream().sorted((s1, s2) -> (Integer) s1.get("priority") - (Integer) s2.get("priority"))
//                .collect(Collectors.toList());

        /*按照 MKT_CAM_PRI 表 priId 字段排序*/
        List<Map<String, Object>> recommendInfoList1 = new ArrayList<>();
        recommendInfoList1 = recommendInfoList.stream().filter(filter -> filter.get("statusCd").equals("1000"))
                .sorted((s1, s2) -> {
                    Integer value1 = (Integer) s1.get("priId");
                    Integer value2 = (Integer) s2.get("priId");
                    return value1 - value2 == 0 ? 0 : (value1 - value2 > 0 ? -1 : 1);
                })
                .collect(Collectors.toList());
       
        return RespBuilder.builder().respCode("0").respMsg("用户推荐信息查询成功")
                .build(rsp);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值