ES服务器,kibana搭建好,ES一些基础介绍,以及kibana的基本操作也相对应输出到自己的博客,现在开始贴上es订单同步的代码,希望大家阅读之后指正。
我所谓做的不是严格意义的订单同步,只是写一个定时同步脚本,去处理同步数据库的订单。如果严格意义上订单,应该是数据库订阅,dts订阅。
前期准备:
1、数据源配置(隐私信息不公开)
*.jdbc.url=jdbc*****************
*.jdbc.username=*******
*.jdbc.password=********
jdbc.pool.validationQuery=SELET '1'
2、datasource实现(截取部分代码)
/**
* 订单同步脚本
*/
@Component
public class OrderSyncJob {
private static final Logger LOGGER = LoggerFactory.getLogger(OrderSyncJob.class);
@Autowired
private OrderSyncService orderSyncService;
/**
* 订单同步脚本
*/
@Scheduled(cron = "0 */5 * * * *")
public void orderSyncJob(){
LOGGER.info("订单开始同步 >> orderSyncJob");
orderSyncService.OrderSync();
LOGGER.info("订单开始结束 >> orderSyncJob");
}
}
订单同步sql:同步订单的更新时间在当前时间前五分钟内的订单
select * from lp_bank_order
where update_time>=DATE_SUB(NOW(), INTERVAL 5 MINUTE)
代码如何实现es的订单同步:
我下面会介绍两种实现es客户端,实现同步订单。
一、SpringBoot集成Elasticsearch
1.1、maven依赖:
org.springframework.boot
spring-boot-starter-data-elasticsearch
${spring-boot.version}
org.elasticsearch
elasticsearch
6.3.2
joda-time
joda-time
org.elasticsearch.client
elasticsearch-rest-high-level-client
6.3.2
elasticsearch
org.elasticsearch
httpclient
org.apache.httpcomponents
org.elasticsearch.client
transport
6.3.2
org.elasticsearch.client
elasticsearch-rest-high-level-client
6.3.2
1.2、配置文件
#####es 集群名称##########
spring.data.elasticsearch.cluster-name=es-cluster
#####es 集群节点ip 多个节点用逗号隔开######
spring.data.elasticsearch.cluster-nodes=*.*.*.*:9300
对应model:
保存,查询es订单的代码:
二、实现es的客户端
2.1、实现es客户端TransportClient
/**
* 初始化实现 TransportClient
* @return
*/
@PostConstruct
public TransportClient getClient() throws UnknownHostException {
if(client == null){
//1、指定es集群 cluster.name 是固定的key值,my-application是ES集群的名称
Settings settings = Settings.builder().put("cluster.name",cluterName).build();
//2.创建访问ES服务器的客户端
client = new PreBuiltTransportClient(settings)
//获取es主机中节点的ip地址及端口号(以下是单个节点案例)
.addTransportAddress(new TransportAddress(InetAddress.getByName(host), port));
LOGGER.info("es client created ");
return client;
}
return client;
}
2.2、创建es索引:
/**
* 创建索引
* @param indexName
* @param typeName
* @param id
* @param sourceMap
* @return
*/
public IndexResponse createIndex(String indexName, String typeName, String id,Map<String,Object> sourceMap){
IndexResponse response = client.prepareIndex(indexName, typeName)
//必须为对象单独指定ID
.setId(id)
.setSource(sourceMap)
.execute()
.actionGet();
return response;
}
根据index,type,id 查询document:
/**
* 根据index,type,id 查询document
* @param indexName
* @param typeName
* @param id
* @return
*/
public String getEsDocument(String indexName, String typeName, String id){
GetResponse response = client.prepareGet(indexName,typeName,id).execute().actionGet();
if(null != response){
return response.getSourceAsString();
}
return null;
}
创建document内容:
/**
* 创建document内容
* @param indexName
* @param typeName
* @param id
* @param doContentBuilder
* @return
* @throws IOException
*/
public int createDocument(String indexName, String typeName, String id,XContentBuilder doContentBuilder) throws IOException {
//将数据转换成文档的格式(后期可以使用java对象,将数据转换成json对象就可以了)
IndexResponse response = client.prepareIndex(indexName,typeName,id)
.setSource(doContentBuilder).setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE).get();
return response.status().getStatus();
}
更新es文档内容:
/**
* 更新es文档内容
* @param indexName
* @param typeName
* @param id
* @return
* @throws InterruptedException
* @throws IOException
* @throws ExecutionException
*/
public int updateDocument(String indexName, String typeName, String id,XContentBuilder doContentBuilder) throws InterruptedException,IOException, ExecutionException {
UpdateRequest request = new UpdateRequest();
request.index(indexName) //索引名
.type(typeName) //类型
.id(id)//id
.doc(
/*XContentFactory.jsonBuilder()
.startObject()
.field("title", "单例设计模式")//要修改的字段 及字段值
.endObject()*/
doContentBuilder
);
UpdateResponse response= client.update(request).get();
return response.status().getStatus();
}