IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 博客项目学习笔记二十六:增量数据同步到ES -> 正文阅读

[大数据]博客项目学习笔记二十六:增量数据同步到ES

博客项目目录: 请戳这里

准备

需求:用户登录后,发表新文章或者编辑文章,ES会创建或更新对应的文章索引,如果用户删除文章,ES也会删除对应的文章索引。

基本思路:

可以考虑使用rabbitmq来实现,首先配置rabbitmq,将队列和交换机绑定起来。然后在程序中建立监听者,当用户发表或编辑文章时(删除文章时类似),就会收到新建或更新文章索引的消息,然后消费者根据消息类型,进行处理对应的消息。

1.添加依赖包,修改yml配置

RabbitMq相关依赖用于整合RabbitMq,项目启动时,需要事先安装RabbitMq,并开启RabbitMq服务

<!--整合rabbitmq-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>

新增yml配置:
在这里插入图片描述

2.配置RabbitMq

将交换机和队列绑定起来,并配置一个key,当监听者监听到对应的消息,就会将消息发送给队列,然后消费者来消费对应类型的消息。

@Configuration
public class RabbitMqConfig {

    public final static String es_queue = "es_queue";
    public final static String es_exchage = "es_exchage";
    public final static String es_bind_key = "es_exchage";

    @Bean
    public Queue exQueue() {
        return new Queue(es_queue);
    }

    @Bean
    DirectExchange exchange() {
        return new DirectExchange(es_exchage);
    }

    @Bean
    Binding binding(Queue exQueue, DirectExchange exchange) {
        return BindingBuilder.bind(exQueue).to(exchange).with(es_bind_key);
    }
}

3.监听者

注入模板
在这里插入图片描述
在PostController提交帖子的逻辑下,添加如下代码,表示新建文章或更新文章时,就会通过对应的通道,将消息发送给队列

//通知消息给mq,告知更新或添加
    amqpTemplate.convertAndSend(RabbitMqConfig.es_exchage, RabbitMqConfig.es_bind_key,
                new PostMqIndexMessage(post.getId(), PostMqIndexMessage.CREATE_OR_UPDATE));

在PostController删除帖子的逻辑下,添加如下代码,表示删除文章时,就会通过对应的通道,将消息发送给队列

4.消息处理器

1.新增消息类型实体

@Data
@AllArgsConstructor
public class PostMqIndexMessage implements Serializable {

    // 两种type
    public final static String CREATE_OR_UPDATE = "create_update";
    public final static String REMOVE = "remove";

    private Long postId;
    private String type;

}

2.消息处理器
如果是"create_update"类型的消息,就执行createOrUpdateIndex()方法;如果是"remove"类型的消息,就执行removeIndex()方法

@Slf4j
@Component
@RabbitListener(queues = RabbitMqConfig.es_queue)
public class MqMessageHandler {

    @Autowired
    SearchService searchService;

    @RabbitHandler
    public void handler(PostMqIndexMessage message) {

        log.info("mq 收到一条消息: {}", message.toString());

        switch (message.getType()) {
            case PostMqIndexMessage.CREATE_OR_UPDATE:
                searchService.createOrUpdateIndex(message);
                break;
            case PostMqIndexMessage.REMOVE:
                searchService.removeIndex(message);
                break;
            default:
                log.error("没找到对应的消息类型,请注意!! --》 {}", message.toString());
                break;
        }
    }

}

5.接口

public interface SearchService {

    IPage search(Page page, String keyword);

    int initEsData(List<PostVo> records);

    void createOrUpdateIndex(PostMqIndexMessage message);

    void removeIndex(PostMqIndexMessage message);
}

6.实现类

如果是新建文章或跟新文章,首先获取文章Id,找到对应的PostVo,然后转化为文档形式,储存到ES;如果是删除文章,同样先获取文章Id,然后在ES根据Id删除对应文章索引。

@Override
    public void createOrUpdateIndex(PostMqIndexMessage message) {
        Long postId = message.getPostId();
        PostVo postVo = postService.selectOnePost(new QueryWrapper<Post>().eq("p.id", postId));

        PostDocment postDocment = modelMapper.map(postVo, PostDocment.class);

        postRepository.save(postDocment);

        log.info("es 索引更新成功! ---> {}", postDocment.toString());
    }

    @Override
    public void removeIndex(PostMqIndexMessage message) {
        Long postId = message.getPostId();

        postRepository.deleteById(postId);
        log.info("es 索引删除成功! ---> {}", message.toString());
    }

7.测试

1.测试新建或更新文章
更改之前:
在这里插入图片描述

在这里插入图片描述
更改之后:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
2.测试删除文章
删除之前:
在这里插入图片描述
删除之后:
在这里插入图片描述
在这里插入图片描述

参考资料:

https://github.com/MarkerHub/eblog

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-01 14:34:51  更:2021-08-01 14:36:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 1:56:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码