code实时

38 阅读1分钟
08修改阅读行为的类ApReadBehaviorServiceImpl的saveReadBehavior方法
ArticleBehaviorMsg articleBehaviorMsg = new ArticleBehaviorMsg(
    dto.getArticleId(),
    1,
    ArticleBehaviorMsg.ArticleBehaviorType.COLLECTION.COMMENTe.VIEWS.LIKES
            );
kafkaTemplate.send(HotArticleConstants.HOT_ARTICLE_SCORE_STREAM_TOPIC, JsonUtils.toString(articleBehaviorMsg));
//  kafka 流处理计算 文章分值  
  把value转对象
                ArticleBehaviorMsg articleBehaviorMsg = JsonUtils.toBean(value, ArticleBehaviorMsg.class);
articleBehaviorMsg.getArticleId().toString() 
     public KeyValue<String, String>  //            value的json格式 {"articleId":12312312,"type":1,"num":1} 
    Long.valueOf(key) @runwith
    JsonUtils.toBean   
    JsonUtils.toString(streamMsg); 
Optional
       .toStream().map(new KeyValueMapper<Windowed<String>, String, KeyValue<String, String>>()      
                       
                                switch (articleBehaviorMsg.getType()) {
                                    case LIKES:
                                        streamMsg.setLikes(streamMsg.getLikes() + articleBehaviorMsg.getNum());
                                        break;
                                    case VIEWS:
                                        streamMsg.setViews(streamMsg.getViews() + articleBehaviorMsg.getNum());
                                        break;
                                    case COMMENT:
                                        streamMsg.setComment(streamMsg.getComment() + articleBehaviorMsg.getNum());
                                        break;
                                    case COLLECTION:
                                        streamMsg.setCollection(streamMsg.getCollection() + articleBehaviorMsg.getNum());
                                        break;
                                }
                                System.out.println("streamMsg=="+streamMsg);
                                return JsonUtils.toString(streamMsg);
                            }
                        }  
      / /文章分值计算结果接收监听器 
@Component
@Slf4j
public class HotArticleScoreConsumerListener {

    @Autowired
    private ApHotArticlesService hotArticlesService;

    @KafkaListener(topics = HotArticleConstants.HOT_ARTICLE_SCORE_CONSUMER_TOPIC)
    public void receiveMsg(ConsumerRecord<String,String> record){

        Optional<ConsumerRecord<String, String>> optional = Optional.ofNullable(record);
        if(optional.isPresent()){
            String value = record.value();
            if(StringUtils.isNotBlank(value)){
                ArticleBehaviorStreamMsg streamMsg = JsonUtils.toBean(value, ArticleBehaviorStreamMsg.class);
//                更新文章分值
                hotArticlesService.updateHotArticle(streamMsg);
            }
        }
    }
}     
                       
更新热点文章信息  void updateHotArticle(ArticleBehaviorStreamMsg streamMsg);                     @Override
    public void updateHotArticle(ArticleBehaviorStreamMsg streamMsg) {
//      文章id
        Long articleId = streamMsg.getArticleId();
//        获取文章信息
        ApArticle apArticle = apArticleService.getById(articleId);
//        计算当天总分值
        HotArticleVo hotArticleVo = BeanHelper.copyProperties(streamMsg, HotArticleVo.class);
        hotArticleVo.setId(streamMsg.getArticleId());
        this.computeScore(hotArticleVo);
//        当日分值计算方式,在原有权重的基础上再*3
        long score =  hotArticleVo.getScore() * 3;
//        把计算好的分值加入 zset中获取当前文章的分值中
        String redisKey = PRE_CHANNEL_FIX + apArticle.getChannelId();
        redisTemplate.opsForZSet().incrementScore(redisKey,articleId.toString(),score);
        //        更新文章的分值
        String redisKeyRcommend = PRE_CHANNEL_FIX + 0;
//          把分值和articleid 放入zset中
       incrementScoreredisTemplate.opsForZSet().incrementScore(redisKeyRcommend  key ,articleId.toString(),score);
    }   
    

image.png