首页 > 其他分享 >新增文章创建索引

新增文章创建索引

时间:2023-07-07 17:24:51浏览次数:34  
标签:heima 创建 org springframework content 索引 文章 import com

                                     

 文章微服务异步调用生成静态文件,上传到minIO之后发送消息到MQ,因为创建索引需要staticurl。

  

package com.heima.article.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.heima.article.service.ApArticleService;
import com.heima.article.service.ArticleFreemarkerService;
import com.heima.common.constants.ArticleConstants;
import com.heima.file.service.FileStorageService;
import com.heima.model.article.pojos.ApArticle;
import com.heima.model.search.vos.SearchArticleVo;
import freemarker.template.Configuration;
import freemarker.template.Template;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
@Slf4j
@Transactional
public class ArticleFreemarkerServiceImpl implements ArticleFreemarkerService {


    @Autowired
    private Configuration configuration;

    @Autowired
    private FileStorageService fileStorageService;

    @Autowired
    private ApArticleService articleService;

    /**
     * 生成静态文件上传到minIO中
     * @param apArticle  获取文章内容
     * @param content    静态文件名称含有aritlceId
     */
    @Async
    @Override
    public void buildArticleToMinIO(ApArticle apArticle, String content) {
        //已知文章id
        //1、获取文章内容
        if(content != null && StringUtils.isNotBlank(content)){
            //2、文章内容通过freemarker生成html文件
            Template template = null;
            StringWriter out = new StringWriter();
            try {
                template = configuration.getTemplate("article.ftl");
                //数据模型
                Map<String, Object> contentDataModel = new HashMap<>();
                contentDataModel.put("content", JSONArray.parseArray(content));
                //合成
                template.process(contentDataModel, out);

            } catch (Exception e) {
                e.printStackTrace();
            }

            //3、把html文件上传到minio中
            ByteArrayInputStream in = new ByteArrayInputStream(out.toString().getBytes());
            String path = fileStorageService.uploadHtmlFile("", apArticle.getId()+ ".html", in);
            //4、修改ap_article表,保存static_url字段
            articleService.update(Wrappers.<ApArticle>lambdaUpdate().eq(ApArticle::getId ,apArticle.getId())
                    .set(ApArticle::getStaticUrl, path));

            //发送消息创建索引
            createArticleESIndex(apArticle, content, path);

        }
    }

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;
    /**
     * 发送消息创建索引
     * @param apArticle
     * @param content
     * @param path
     */
    private void createArticleESIndex(ApArticle apArticle, String content, String path) {
        SearchArticleVo vo = new SearchArticleVo();
        BeanUtils.copyProperties(apArticle, vo);
        vo.setContent(content);
        vo.setStaticUrl(path);
        
        kafkaTemplate.send(ArticleConstants.ARTICLE_ES_SYNC_TOPIC, JSON.toJSONString(vo));

    }
}

 

搜索微服务监听消息创建索引

package com.heima.search.listener;

import com.alibaba.fastjson.JSON;
import com.heima.common.constants.ArticleConstants;
import com.heima.model.search.vos.SearchArticleVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
@Slf4j
public class SyncArticleListener {
    @Autowired
    private RestHighLevelClient restHighLevelClient;

    @KafkaListener(topics = ArticleConstants.ARTICLE_ES_SYNC_TOPIC)
    public void onMessage(String message){
        if(StringUtils.isNotBlank(message)){

            log.info("接收到的消息为:message={}", message);

            SearchArticleVo searchArticleVo = JSON.parseObject(message, SearchArticleVo.class);
            IndexRequest indexRequest = new IndexRequest("app_info_article");
            indexRequest.id(searchArticleVo.getId().toString());
            indexRequest.source(message, XContentType.JSON);
            try {
                restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
            } catch (IOException e) {
                e.printStackTrace();
                log.error("sync es error={}", e);
            }
        }
    }
}

 

标签:heima,创建,org,springframework,content,索引,文章,import,com
From: https://www.cnblogs.com/fxzm/p/17535415.html

相关文章

  • 网安周报|黑客利用未修补的WordPress插件缺陷来创建秘密管理员帐户
    网安周报是棱镜七彩推出的安全资讯专栏,旨在通过展示一周内发生的与开源安全、软件供应链安全相关攻击事件,让用户了解开源及软件供应链威胁,提高对安全的重视,做好防御措施。1、黑客利用未修补的WordPress插件缺陷来创建秘密管理员帐户来百度APP畅享高清图片终极会员插件中未修补的关......
  • java创建防重表防止数据重复提交
    加一张防重表,在防重表中增加商品表的name和model字段作为唯一索引。例如:CREATETABLE`product_unique`(`id`bigint(20)NOTNULLCOMMENT'id',`name`varchar(130)DEFAULTNULLCOMMENT'名称',`model`varchar(255)NOTNULLCOMMENT'规格',`user_id`b......
  • word文档创建修改多级列表
    1、打开word文档,写入三个字“一级别”,选中这3个字。  2、然后在【开始】--【段落】中,选择自己想要的多级列表。3、查看正文,文字已经有了标号。然后每一次敲击回车后,都会自动补上编号。这里多写几行文字。  4、在“一级别”后,敲击回车,添加“二级别”几个字,然后选中,可以......
  • 解决Android studio 新建文件固定创建人创建时间模板的具体操作步骤
    AndroidStudio新建文件固定创建人创建时间模板在开发Android应用程序时,我们经常需要创建许多不同类型的文件,例如Activity、Fragment、Adapter等。为了提高开发效率,我们可以在AndroidStudio中使用模板来自动生成这些文件的代码。在本文中,我们将介绍如何在AndroidStudio中创建一......
  • 在CSS中创建一个遮罩层并阻止点击穿透的常见方案
    使用position:fixed和z-index:创建一个具有全屏尺寸的<div>元素,并将其设置为position:fixed,top:0,left:0,width:100%,height:100%,然后使用z-index将其放在其他元素之上。通过设置透明度、背景颜色或使用其他视觉效果,可以实现遮罩层的效果。这样的遮罩层将位于所有其他......
  • C盘清理教程丨“Windows.edb”索引文件过大的处理方法
    如果windows10系统下的C盘可用空间越来越少,而且并没有安装新软件,也没有保存新文件。那么,非常有可能是“Windows.edb”索引文件过大的原因。关于该文件的介绍可参考《C盘清理教程丨24G大的“Windows.edb”是什么文件,可以删除吗?》https://baiyunju.cc/6693由于只要开启windows搜索......
  • Django创建多对多表关系的三种方式
    一、全自动(不推荐)优点:djangoorm会自动创建第三张表缺点:只会创建两个表的关系字段,不会再额外添加字段,可扩展性差classBook(models.Model):#...authors=models.ManyToManyField(to='Author')classAuthor(models.Model):#...pass 二、......
  • 自媒体文章上下架
    需求分析:已发表且已下架的文章可以上架已发表且已上架的文章可以下架自媒体端点击上架下架按钮:上架下架——>根据id查询文章——>文章是否存在:否结束,是——文章是否发布——>否结束,是——修改自媒体文章状态enable  app移动端:自媒体端发送请求到kafka,参数文......
  • CentOS7母盘系统硬盘200G,通过母盘创建新系统硬盘为500G,多余未用空间扩展
    [查看现有磁盘] lsblk-l创建新磁盘①fdisk/dev/sda②命令(输入m获取帮助):n③Select(defaulte):p④命令(输入m获取帮助):t⑤Hex代码(输入L列出所有代码):8e  //已将分区“Linux”的类型更改为“LinuxLVM”⑥命令(输入m获取帮助):w [root@SkyWalking......
  • docker启动centos 并安装kvm 创建虚拟机
    1创建centos基础镜像拉取centos基础镜像dockerpullcentos:latest启动容器:使用/usr/sbin/init方式,否则容器中不能运行systemctl命令映射两个端口:用于ssh连接容器,和远程vnc连接容器中的虚拟机dockerrun-itd--privileged-p20022:22-p25900:5900--namemyCe......