新增文章创建索引
文章微服务异步调用生成静态文件,上传到minIO之后发送消息到MQ,因为创建索引需要staticurl。
注:倘若创建索引失败,追踪es日志,同样可能是因为磁盘使用率超出阈值,es变为只读,无法添加,因此也无法查询到
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); } } } }