检索系统要求的数据导出是很有意义的,这样做主要是两方面的原因:
1. 检索系统不需要主动的连接到数据库,即可以不需要知道数据表的定义;
2. 多实例检索系统在启动的时候如果直接从数据库中读取这些数据,会给数据库造成巨大的压力。所以,这是为了避免扫描数据库。
1.在ad-common里面新建包dump
索引数据是针对于所有服务的,于是我们将其定义在 ad-common 中,其他服务都可以调用。
2.新建类DConstant
首先,需要确定的就是文件存储到哪个地方,于是先定义一个类,在其中确定好文件的存储路径和各个索引对应的存储文件名称。
package com.imooc.ad.dump;
public class DConstant {
public static final String DATA_ROOT_DIR = "/Users/imooc/mysql_data/";
// 各个表数据的存储文件名
public static final String AD_PLAN = "ad_plan.data";
public static final String AD_UNIT = "ad_unit.data";
public static final String AD_CREATIVE = "ad_creative.data";
public static final String AD_CREATIVE_UNIT = "ad_creative_unit.data";
public static final String AD_UNIT_IT = "ad_unit_it.data";
public static final String AD_UNIT_DISTRICT = "ad_unit_district.data";
public static final String AD_UNIT_KEYWORD = "ad_unit_keyword.data";
}
3.导出数据字段定义
索引表对象的属性与一开始定义的索引对象的属性相同。
package com.imooc.ad.dump.table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AdPlanTable {
private Long id;
private Long userId;
private Integer planStatus;
private Date startDate;
private Date endDate;
}
package com.imooc.ad.dump.table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AdUnitTable {
private Long unitId;
private Integer unitStatus;
private Integer positionType;
private Long planId;
}
package com.imooc.ad.dump.table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AdUnitKeywordTable {
private Long unitId;
private String keyword;
}
package com.imooc.ad.dump.table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AdUnitDistrictTable {
private Long unitId;
private String province;
private String city;
}
package com.imooc.ad.dump.table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AdUnitItTable {
private Long unitId;
private String itTag;
}
package com.imooc.ad.dump.table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AdCreativeTable {
private Long adId;
private String name;
private Integer type;
private Integer materialType;
private Integer height;
private Integer width;
private Integer auditStatus;
private String adUrl;
}
package com.imooc.ad.dump.table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AdCreativeUnitTable {
private Long adId;
private Long unitId;
}
4.在ad-sponsor模块的test文件夹下编写Application启动类和application.yml配置文件
package com.imooc.ad;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//启动程序
@SpringBootApplication
public class Application {
public static void main(String[] args){
SpringApplication.run(Application.class,args);
}
}
server:
port: 7000
servlet:
context-path: /ad-sponsor
spring:
application:
name: eureka-client-ad-sponsor
jpa:
show-sql: true
hibernate:
ddl-auto: none
properties:
hibernate.format_sql: true
open-in-view: false
datasource:
url: jdbc:mysql://127.0.0.1:3306/imooc_ad_data?autoReconnect=true
username: root
password: xrj199801191417@
tomcat:
max-active: 4
min-idle: 2
initial-size: 2
eureka:
client:
service-url:
defaultZone: http://server1:8000/eureka/
enabled: false
5.编写DumpDataService类
写入文件的逻辑都是一致的:先是遍历获取到的索引值,将其写入之前定义的索引表数据中,转换为 JSON 格式后写入文件中。
package com.imooc.ad.service;
import com.alibaba.fastjson.JSON;
import com.imooc.ad.Application;
import com.imooc.ad.constant.CommonStatus;
import com.imooc.ad.dao.AdPlanRepository;
import com.imooc.ad.dao.AdUnitRepository;
import com.imooc.ad.dao.CreativeRepository;
import com.imooc.ad.dao.unit_condition.AdUnitDistrictRepository;
import com.imooc.ad.dao.unit_condition.AdUnitItRepository;
import com.imooc.ad.dao.unit_condition.AdUnitKeywordRepository;
import com.imooc.ad.dao.unit_condition.CreativeUnitRepository;
import com.imooc.ad.dump.DConstant;
import com.imooc.ad.dump.table.*;
import com.imooc.ad.entity.AdPlan;
import com.imooc.ad.entity.AdUnit;
import com.imooc.ad.entity.Creative;
import com.imooc.ad.entity.unit_condition.AdUnitDistrict;
import com.imooc.ad.entity.unit_condition.AdUnitIt;
import com.imooc.ad.entity.unit_condition.AdUnitKeyword;
import com.imooc.ad.entity.unit_condition.CreativeUnit;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.CollectionUtils;
import javax.xml.ws.soap.AddressingFeature;
import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {Application.class},webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class DumpDataService {
@Autowired
private AdPlanRepository adPlanRepository;
@Autowired
private AdUnitRepository adUnitRepository;
@Autowired
private CreativeRepository creativeRepository;
@Autowired
private AdUnitKeywordRepository adUnitKeywordRepository;
@Autowired
private AdUnitDistrictRepository adUnitDistrictRepository;
@Autowired
private AdUnitItRepository adUnitItRepository;
@Autowired
private CreativeUnitRepository creativeUnitRepository;
@Test
public void dumpAdTableData() {
dumpAdPlanTable(
String.format("%s%s", DConstant.DATA_ROOT_DIR,
DConstant.AD_PLAN)
);
dumpAdUnitTable(
String.format("%s%s", DConstant.DATA_ROOT_DIR,
DConstant.AD_UNIT)
);
dumpAdCreativeTable(
String.format("%s%s", DConstant.DATA_ROOT_DIR,
DConstant.AD_CREATIVE)
);
dumpAdCreativeUnitTable(
String.format("%s%s", DConstant.DATA_ROOT_DIR,
DConstant.AD_CREATIVE_UNIT)
);
dumpAdUnitDistrictTable(
String.format("%s%s", DConstant.DATA_ROOT_DIR,
DConstant.AD_UNIT_DISTRICT)
);
dumpAdUnitItTable(
String.format("%s%s", DConstant.DATA_ROOT_DIR,
DConstant.AD_UNIT_IT)
);
dumpAdUnitKeywordTable(
String.format("%s%s", DConstant.DATA_ROOT_DIR,
DConstant.AD_UNIT_KEYWORD)
);
}
private void dumpAdPlanTable(String fileName){
List<AdPlan> adPlans = adPlanRepository.findAllByPlanStatus(CommonStatus.VALID.getStatus());
if(CollectionUtils.isEmpty(adPlans)){
return;
}
List<AdPlanTable> planTables = new ArrayList<>();
adPlans.forEach(p -> planTables.add(
new AdPlanTable(
p.getId(),
p.getUserId(),
p.getPlanStatus(),
p.getStartDate(),
p.getEndDate()
)
));
Path path = Paths.get(fileName);
try (BufferedWriter writer = Files.newBufferedWriter(path)) {
for (AdPlanTable planTable : planTables) {
writer.write(JSON.toJSONString(planTable));
writer.newLine();
}
writer.close();
} catch (IOException ex) {
log.error("dumpAdPlanTable error");
}
}
private void dumpAdUnitTable(String fileName){
List<AdUnit> adUnits = adUnitRepository.findAllByUnitStatus(CommonStatus.VALID.getStatus());
if(CollectionUtils.isEmpty(adUnits)){
return;
}
List<AdUnitTable> unitTables = new ArrayList<>();
adUnits.forEach(u->unitTables.add(
new AdUnitTable(
u.getId(),
u.getUnitStatus(),
u.getPositionType(),
u.getPlanId()
)
));
Path path = Paths.get(fileName);
try(BufferedWriter writer = Files.newBufferedWriter(path)){
for(AdUnitTable unitTable:unitTables){
writer.write(JSON.toJSONString(unitTable));
writer.newLine();
}
writer.close();
}catch (IOException ex){
log.error("dumpAdUnitTable error");
}
}
private void dumpAdCreativeTable(String fileName) {
List<Creative> creatives = creativeRepository.findAll();
if (CollectionUtils.isEmpty(creatives)) {
return;
}
List<AdCreativeTable> creativeTables = new ArrayList<>();
creatives.forEach(c -> creativeTables.add(
new AdCreativeTable(
c.getId(),
c.getName(),
c.getType(),
c.getMaterialType(),
c.getHeight(),
c.getWidth(),
c.getAuditStatus(),
c.getUrl()
)
));
Path path = Paths.get(fileName);
try (BufferedWriter writer = Files.newBufferedWriter(path)) {
for (AdCreativeTable creativeTable : creativeTables) {
writer.write(JSON.toJSONString(creativeTable));
writer.newLine();
}
writer.close();
} catch (IOException ex) {
log.error("dumpAdCreativeTable error");
}
}
private void dumpAdCreativeUnitTable(String fileName) {
List<CreativeUnit> creativeUnits = creativeUnitRepository.findAll();
if (CollectionUtils.isEmpty(creativeUnits)) {
return;
}
List<AdCreativeUnitTable> creativeUnitTables = new ArrayList<>();
creativeUnits.forEach(c -> creativeUnitTables.add(
new AdCreativeUnitTable(
c.getCreativeId(),
c.getUnitId()
)
));
Path path = Paths.get(fileName);
try (BufferedWriter writer = Files.newBufferedWriter(path)) {
for (AdCreativeUnitTable creativeUnitTable : creativeUnitTables) {
writer.write(JSON.toJSONString(creativeUnitTable));
writer.newLine();
}
writer.close();
} catch (IOException ex) {
log.error("dumpAdCreativeUnit error");
}
}
private void dumpAdUnitDistrictTable(String fileName) {
List<AdUnitDistrict> unitDistricts = adUnitDistrictRepository.findAll();
if (CollectionUtils.isEmpty(unitDistricts)) {
return;
}
List<AdUnitDistrictTable> unitDistrictTables = new ArrayList<>();
unitDistricts.forEach(d -> unitDistrictTables.add(
new AdUnitDistrictTable(
d.getUnitId(),
d.getProvince(),
d.getCity()
)
));
Path path = Paths.get(fileName);
try (BufferedWriter writer = Files.newBufferedWriter(path)) {
for (AdUnitDistrictTable unitDistrictTable : unitDistrictTables) {
writer.write(JSON.toJSONString(unitDistrictTable));
writer.newLine();
}
writer.close();
} catch (IOException ex) {
log.error("dumpAdUnitDistrictTable error");
}
}
private void dumpAdUnitItTable(String fileName) {
List<AdUnitIt> unitIts = adUnitItRepository.findAll();
if (CollectionUtils.isEmpty(unitIts)) {
return;
}
List<AdUnitItTable> unitItTables = new ArrayList<>();
unitIts.forEach(i -> unitItTables.add(
new AdUnitItTable(
i.getUnitId(),
i.getItTag()
)
));
Path path = Paths.get(fileName);
try (BufferedWriter writer = Files.newBufferedWriter(path)) {
for (AdUnitItTable unitItTable : unitItTables) {
writer.write(JSON.toJSONString(unitItTable));
writer.newLine();
}
writer.close();
} catch (IOException ex) {
log.error("dumpAdUnitItTable error");
}
}
private void dumpAdUnitKeywordTable(String fileName) {
List<AdUnitKeyword> unitKeywords = adUnitKeywordRepository.findAll();
if (CollectionUtils.isEmpty(unitKeywords)) {
return;
}
List<AdUnitKeywordTable> unitKeywordTables = new ArrayList<>();
unitKeywords.forEach(k -> unitKeywordTables.add(
new AdUnitKeywordTable(
k.getUnitId(),
k.getKeyword()
)
));
Path path = Paths.get(fileName);
try (BufferedWriter writer = Files.newBufferedWriter(path)) {
for (AdUnitKeywordTable unitKeywordTable : unitKeywordTables) {
writer.write(JSON.toJSONString(unitKeywordTable));
writer.newLine();
}
writer.close();
} catch (IOException ex) {
log.error("dumpAdUnitItTable error");
}
}
}