监听RabbitMQ,向Elasticsearch 创建索引

上一篇通过配置Canal+MQ的数据同步环境,实现了Canal从数据库读取binlog并且将数据写入MQ。

下边编写程序监听MQ,收到消息后向ES创建索引。

1. 环境准备

  • RabbitMQ :已配置并运行,Canal 已将 MySQL 的 binlog 消息发送到 RabbitMQ 队列中。
  • Elasticsearch:已运行,并可以通过 REST API 访问。
  • Spring Boot 项目 :通过 spring-boot-starter-amqpspring-boot-starter-data-elasticsearch 集成 RabbitMQ 和 Elasticsearch。

2. 添加依赖

在 Spring Boot 项目的 pom.xml 中,添加 RabbitMQ 和 Elasticsearch 的依赖:

XML 复制代码
<dependencies>
    <!-- RabbitMQ Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    
    <!-- Elasticsearch Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    </dependency>
</dependencies>

3. 配置 application.yml

配置文件中需要包含 RabbitMQ 和 Elasticsearch 的相关信息:

XML 复制代码
spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
    listener:
      simple:
        acknowledge-mode: manual   # 手动ACK

  elasticsearch:
    rest:
      uris: http://localhost:9200
    connection-timeout: 1000
    socket-timeout: 30000

4. 创建 Elasticsearch 索引

定义一个实体类来映射 Elasticsearch 中的索引:

java 复制代码
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;

@Document(indexName = "user_index")
public class User {

    @Id
    private Long id;
    private String name;
    private String email;

    // getters and setters
}

5. 编写 Elasticsearch 的 Repository

创建一个 Elasticsearch 的 Repository,用于保存数据到索引中:

java 复制代码
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

public interface UserRepository extends ElasticsearchRepository<User, Long> {
}

6. 监听 RabbitMQ 队列并同步到 Elasticsearch

创建一个 RabbitMQ 消息监听器,收到消息后解析并将数据存储到 Elasticsearch:

java 复制代码
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class CanalToEsSyncService {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private RabbitTemplate rabbitTemplate;

    private ObjectMapper objectMapper = new ObjectMapper();

    // 监听 Canal 发送到 RabbitMQ 的队列消息
    @RabbitListener(queues = "example_queue")
    public void handleCanalMessage(String message) {
        try {
            // 假设 Canal 发送的是 JSON 格式的消息,可以用 Jackson 解析
            User user = objectMapper.readValue(message, User.class);

            // 将解析的 User 对象存入 Elasticsearch
            userRepository.save(user);

            // 手动确认消息已成功消费
            System.out.println("Message processed and indexed to Elasticsearch: " + user);
        } catch (Exception e) {
            e.printStackTrace();
            // 处理失败,可以记录日志或根据需要重试
        }
    }
}
相关推荐
倒流时光三十年36 分钟前
第六阶段 57 · ES|QL 与 SQL API(用 SQL 查 ES)
数据库·sql·elasticsearch
hhzz38 分钟前
《深度学习框架PyTorch入门与实践》系列:09-分布式与并行训练之DataParallel、DDP与Horovod
pytorch·分布式·深度学习
guwentian10 小时前
Git Worktree 实战:用并行多 Agent 把开发提速 N 倍
大数据·git·elasticsearch·wroktree
Elastic 中国社区官方博客15 小时前
Elasticsearch:使用 AI Agent 来创建 workflow
大数据·运维·人工智能·elasticsearch·搜索引擎·自动化·全文检索
阿里云大数据AI技术16 小时前
AI Search+ES 9.4.X最佳实践:“更快、更准、更安全的企业级搜索引擎”"为AI Agent提供坚实底座”
人工智能·elasticsearch·agent
城管不管17 小时前
重生——第九次面试2026.8.13某车一面
分布式·ai·面试·职场和发展·rabbitmq
apgk117 小时前
基于Canal实现mysql数据同步到消息队列(RabbitMQ/Kafka)详细操作教程
docker·kafka·rabbitmq
Rain的Java大神之路17 小时前
MQ重复消费问题怎么解决
java·经验分享·后端·面试·架构·rabbitmq·rocketmq
ly768918 小时前
分布式一致性算法详解:从 2PC、3PC 到 Paxos、Raft、ZAB
分布式·算法
珠***格19 小时前
通信链路全打通:西格电力四可装置的 4G/5G + 加密认证技术详解
大数据·数据库·分布式·5g·架构·能源