0. 引言
最近接到一个需要,需要在spring data elasticsearch关联的实体类中动态的根据配置文件动态创建索引名称,比如开发环境下索引名称为user-dev,测试环境下为user-test,生产环境为user-prod
一开始接到这个需要觉得很怪,因为不同环境的区分直接搭建不同的es服务器环境不就行了吗,为什么要这么麻烦来处理呢?后来了解到是因为当前项目成本受限,需要隔离开发环境和测试环境用的同一台服务器,于是就产生了这个奇怪的需求。
其实想想,不排除某些场景下,就需要动态的创建索引名称。于是今天我们就来看看怎么实现这个需求
1. 解决
首先我们需要明确目标,我们要动态定义这里的indexName。也就是说我们要在'user'-dynamic
后拼接上我们的spring.profiles.active
配置项
2、首先我们需要创建Bean,用来声明active
/**
* @author whx
* @date 2022/7/22
*/
@Component
@Getter
public class IndexNameBean {
@Value("${spring.profiles.active}")
private String active;
}
3、我们在配置文件application.yml
中声明active
spring:
profiles:
active: dev
4、然后在实体类中通过#{indexNameBean.active}
来拼接
5、运行项目进行测试(我这里设置了启动项目自动根据实体类创建索引)
kibana中执行GET user-dynamic-dev/_mapping
查询到索引user-dynamic-dev
存在,说明动态创建成功
6、修改配置文件中active为test,重启项目
spring:
profiles:
active: test
kibana中执行GET user-dynamic-test/_mapping
查询到索引存在,切换成功
这样只要不同的环境的配置文件中声明不同的active就是实现索引名称的动态切换了
问题搞定!
2. 文中源码
文中演示源码见如下git地址: