赞
踩
点击发布帖子按钮,输入帖子标题内容等信息后发布,以JS异步请求的方式进行提交,首先判断该线程中有无用户信息(在登录成功是会将用户信息与本线程的id进行键值对存储,保证了多线程情况下安全)即判断有无登录,已登录则初始化帖子信息将其添加至DB中,并且触发发帖事件,采用kafka信息队列来完成,将帖子信息添加至ES中,通知再将其存入Redis中计算帖子的分值,用来在最热列表中展示出来:
添加帖子
- // 发布帖子
- @RequestMapping(path = "/add",method = RequestMethod.POST)
- @ResponseBody
- public String addDiscussPost(String title,String content){
- User users = hostHolder.getUsers();
- if(users == null){
- return CommunityUtil.getJSONString(403,"你还没有登录!");
- }
-
- DiscussPost post=new DiscussPost();
- post.setUserId(users.getId());
- post.setTitle(title);
- post.setContent(content);
- post.setCreateTime(new Date());
- discussPostService.addDiscussPost(post);
-
- // 触发发帖事件 添加至es中
- Event event = new Event()
- .setTopic(TOPIC_PUBLISH)
- .setUserId(users.getId())
- .setEntityType(ENTITY_TYPE_POST)
- .setEntityId(post.getId());
- eventProducer.fireEvent(event);
-
- // 计算帖子分数
- String redisKey= RediskeyUtil.getPostScoreKey();
- redisTemplate.opsForSet().add(redisKey,post.getId());
-
- return CommunityUtil.getJSONString(0,"发布成功!");
- }

- // 消费 发帖事件 es添加数据
- @KafkaListener(topics = {TOPIC_PUBLISH})
- public void handlePublishMessage(ConsumerRecord record){
- if(record == null && record.value() == null){
- logger.error("消息的内容为空!");
- return;
- }
-
- Event event = JSONObject.parseObject(record.value().toString(), Event.class);
- if(event == null){
- logger.error("消息格式错误!");
- return;
- }
-
- DiscussPost discussPost =
- discussPostService.selectDiscussPostById(event.getEntityId());
- elasticsearchService.saveDiscussPost(discussPost);
- }

评论这一块
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。