本實例框架采用 nutz+ES,如果 您查找相關知識,請注意過濾不相干的信息
controller 層:
package com.test.ownasset.controller;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.WildcardQueryBuilder;
import org.nutz.dao.Cnd;
import org.nutz.ioc.Ioc;
import org.nutz.ioc.annotation.InjectName;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.AdaptBy;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Chain;
import org.nutz.mvc.annotation.Fail;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import org.nutz.mvc.upload.TempFile;
import org.nutz.mvc.upload.UploadAdaptor;
import com.test.Cupid;
import com.test.annotation.AuthBy;
import com.test.annotation.Log;
import com.test.commons.mvc.Pager;
import com.test.commons.mvc.validate.annotation.Validations;
import com.test.commons.mvc.view.exhandler.ExceptionWrapper;
import com.test.ownasset.data.AllAddressInProvice;
import com.test.ownasset.data.OwnUsedAsset;
import com.test.ownasset.service.OwnAssetService;
import com.test.ownasset.service.OwnUsedSegmentService;
import com.test.ownasset.service.esService.OwnUsedAssetService;
import com.test.ownasset.util.DateUtil;
import com.test.util.UploadAndDownloadUtil;
@IocBean(name = "ownAssetController")
@AuthBy(login=false)
@At("/ownAsset/ownAsset")
@Fail("error")
public class OwnAssetController {
//ownAsset本身Service 單個IP 處理
@Inject("refer:ownAssetService")
private OwnAssetService ownAssetService;
// 自用資產IP 段
@Inject("refer:ownUsedSegmentService")
private OwnUsedSegmentService ownUsedSegmentService;
/**
* 跳到運營商接口首頁
*/
@At("/mainTree")
@Ok("jsp:jsp.ownAsset.main")
@Log(isEnabled = false)
public void viewTree() {
}
/**
* 跳到運營商接口首頁
*/
@At("/main")
@Ok("jsp:jsp.ownAsset.ownAsset.list")
@Log(isEnabled = false)
public void viewTab() {
}
/**
* 進入JSP頁面--新增iframe
*/
@At("/tab/insert")
@Ok("jsp:jsp.ownAsset.ownAsset.add")
@Log(isEnabled = false)
public void insertTab() {
}
/**
* 新增(ajax)
*/
@At("/insert/ajax")
// 訪問路徑與傳統方式的路徑區分開
@Ok("json")
// 無論成功或是失敗,都使用json作為輸出
@Fail("json")
// 失敗處理
@Chain("validate")
// 校驗方法
@Log(isEnabled = false)
public void insertAjax(Ioc ioc, HttpServletRequest request,
HttpSession session, @Param("..") OwnUsedAsset obj) {
OwnUsedAssetService.getInstance().insertAddressToDB(obj);
}
/**
* 進入JSP頁面--更新iframe
*/
@At("/tab/update")
@Ok("jsp:jsp.ownAsset.ownAsset.edit")
@Log(isEnabled = false)
public void updateTab() {
}
/**
* 更新(ajax)
*/
@At("/update/ajax")
// 訪問路徑與傳統方式的路徑區分開
@Ok("json")
// 無論成功或是失敗,都使用json作為輸出
@Chain("validate")
@Validations("validateUpdate")
// 校驗
@Fail("json")
// 失敗處理
@Log(isEnabled = false)
public void updateAjax(HttpServletRequest request, HttpSession session,
@Param("..") OwnUsedAsset obj, @Param("..") Pager pager) {
OwnUsedAssetService.getInstance().updateInfo(obj);
}
/**
* 加載列表(ajax)
*/
@At("/list/ajax")
@Ok("json")
@Log(isEnabled = false)
public Pager listAjax(Ioc ioc, HttpServletRequest request,
HttpSession session, @Param("..") Pager pager) {
String context = request.getParameter("search");
if(context == null || context.trim().equals("")){
return OwnUsedAssetService.getInstance().getList(pager, null);
}// 模糊查詢
else{
try {
BoolQueryBuilder qb = QueryBuilders.boolQuery();
// 組合 模糊查詢 should
WildcardQueryBuilder ip = QueryBuilders.wildcardQuery("ip", "*"+context+"*");
WildcardQueryBuilder area = QueryBuilders.wildcardQuery("area", "*"+context+"*");
WildcardQueryBuilder remark = QueryBuilders.wildcardQuery("remark", "*"+context+"*");
qb.should(ip).should(area).should(remark);//
return OwnUsedAssetService.getInstance().getFuzzyList(pager, qb);
} catch (Exception e) {
e.printStackTrace();
return OwnUsedAssetService.getInstance().getList(pager, null);
}
}
}
/**
* 模糊查詢(ajax)
*
* @throws UnsupportedEncodingException
*/
@At("/search/ajax")
// 訪問路徑與傳統方式的路徑區分開
@Ok("json")
// 無論成功或是失敗,都使用json作為輸出
@Log(isEnabled = false)
public Pager searchListAjax(Ioc ioc, HttpServletRequest request,
HttpSession session, @Param("..") Pager pager,
@Param("search") String search) throws UnsupportedEncodingException {
search = java.net.URLDecoder.decode(search, "utf-8");
// 組合 模糊查詢 should
BoolQueryBuilder qb = QueryBuilders.boolQuery();
// 組合 模糊查詢 should
WildcardQueryBuilder ip = QueryBuilders.wildcardQuery("ip", "*"+search+"*");
WildcardQueryBuilder area = QueryBuilders.wildcardQuery("area", "*"+search+"*");
WildcardQueryBuilder remark = QueryBuilders.wildcardQuery("remark", "*"+search+"*");
qb.should(ip).should(area).should(remark);//
return OwnUsedAssetService.getInstance().getFuzzyList(pager, qb);
}
/**
* 查詢單條(ajax)
*/
@At("/detail/ajax")
// 訪問路徑與傳統方式的路徑區分開
@Ok("json")
// 無論成功或是失敗,都使用json作為輸出
@Log(isEnabled = false)
public OwnUsedAsset readAjax(Ioc ioc, HttpServletRequest request,
HttpSession session, @Param("id") long id) {
Map qbMap = new HashMap();
qbMap.put("id", id);
return OwnUsedAssetService.getInstance().getEntry(qbMap);
}
/**
* 刪除(ajax)
*
* @return
*/
@At("/delete/ajax")
// 訪問路徑與傳統方式的路徑區分開
@Ok("json")
// 無論成功或是失敗,都使用json作為輸出
@Log(isEnabled = false)
public boolean deleteAjax(Ioc ioc, HttpServletRequest request,
HttpSession session, @Param("ids") long[] ids, Cnd cnd) {
boolean flag = true;
try {
OwnUsedAssetService.getInstance().deleteInfo(ids);
} catch (Exception e) {
flag = false;
e.printStackTrace();
}
return flag;
}
@At("/isValidName")
@Ok("json")
@Log(isEnabled = false)
public boolean isValidName(HttpServletRequest request, @Param("filename") String name) {
boolean flag = false;
if (name.toLowerCase().endsWith(".xls")||name.toLowerCase().endsWith(".xlsx")) {
flag = true;
}
return flag;
}
/**
* 新增ip驗證唯一性
*/
@At("/getAddCheck")
// 訪問路徑與傳統方式的路徑區分開
@Ok("json")
// 無論成功或是失敗,都使用json作為輸出
@Log(isEnabled = false)
public boolean getuk(Ioc ioc, HttpServletRequest request,
HttpSession session, @Param("IP") String IP) {
if (IP != null && !IP.equals("")) {
HashMap qbMap = new HashMap();
qbMap.put("ip", IP);
OwnUsedAsset obj = OwnUsedAssetService.getInstance().getEntry(qbMap);
if (obj == null) {
return true;
}
}
return false;
}
/**
* 修改 -->ip驗證唯一性
*/
@At("/getUpdateCheck")
// 訪問路徑與傳統方式的路徑區分開
@Ok("json")
// 無論成功或是失敗,都使用json作為輸出
@Log(isEnabled = false)
public boolean getupdateuk(Ioc ioc, HttpServletRequest request,
HttpSession session,@Param("id") String id, @Param("IP") String IP) {
if (IP != null && !IP.equals("") && id != null && id != "") {
Long idTemp=Long.parseLong(id);
BoolQueryBuilder qb = QueryBuilders.boolQuery();
QueryBuilder ipQb = QueryBuilders.termQuery("ip", IP);
QueryBuilder idQb = QueryBuilders.termQuery("id", idTemp);
qb.must(ipQb).mustNot(idQb);
OwnUsedAsset obj = OwnUsedAssetService.getInstance().getEntry(qb);
//不判斷本條記錄信息.
if (obj == null) {
return true;
}
}
return false;
}
/**
* 導入自用資產信息
*
* @param request
* @param tempFile
*
*/
@At("/import")
@Ok("jsp:jsp.ownAsset.ownAsset.list")
@Fail("error")
@AdaptBy(type = UploadAdaptor.class, args = {})
@Log(value = "導入自用資產Excel入庫")
public void importExcel(HttpServletRequest request,
@Param("filename") TempFile tempFile ){
if (tempFile != null) {
File file = tempFile.getFile();
try {
String msg = ownAssetService.importExcel2(file);
ownUsedSegmentService.importExcel(file);
request.setAttribute("successFlag", msg);
} catch (Exception e) {
request.setAttribute("successFlag", false);
}
}
}
@At("/importTemplate")
@Fail("error")
@Ok("void")
@Log(value = "自用地址段附件下載")
public void downloadFile(HttpServletRequest request,
ServletContext context,
HttpServletResponse response)throws FileNotFoundException, IOException{
String path = Cupid.getContextValueAs(String.class,"web.dir");
path = path+File.separator+"downloads"+File.separator+"ownAsset"+File.separator+"自用地址段導入樣例.xlsx";
File tempFile = new File(path);
//檢查文件是否存在,若不存在則拋出錯誤提示
if (tempFile.isFile() && tempFile.exists()) {
UploadAndDownloadUtil.downLoad(path,response, request, false);
}else{
throw ExceptionWrapper.wrapError(new ExceptionWrapper.EC("affixal.download.noFile", false));
}
}
@At("/export")
@Fail("error")
@Ok("void")
@Log(value = "導出自用地址段表格")
public void exportExcel(@Param("ids") long[] ids,HttpServletRequest request,
HttpServletResponse response,Ioc ioc,HttpSession session, @Param("..") Pager pager,
@Param("search") String search){
try {
OutputStream os = null;
Workbook wb = ownAssetService.writeExcel(ids,ioc, session, pager, search,0);
String timeStr = DateUtil.getNowTimeStr().replaceAll(" ", "-").replaceAll(":", "-").replaceAll("-", "").substring(0,12);//201704271032 時間標志
String fileName = "自用地址段導出信息"+timeStr+".xlsx";
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename="+ URLEncoder.encode(fileName, "utf-8"));
os = response.getOutputStream();
wb.write(os);
os.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
第一層 service:
package com.test.ownasset.service;
import java.io.File;
import java.io.FileInputStream;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import javax.servlet.http.HttpSession;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.WildcardQueryBuilder;
import org.nutz.dao.Cnd;
import org.nutz.dao.Condition;
import org.nutz.ioc.Ioc;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.Param;
import com.test.commons.crud.service.AbstractTableTemplateService;
import com.test.commons.mvc.Pager;
import com.test.ownasset.cache.OwnAssetConfig;
import com.test.ownasset.data.OwnUsedAsset;
import com.test.ownasset.service.esService.AllAddressInProviceService;
import com.test.ownasset.service.esService.OwnUsedAssetService;
import com.test.ownasset.task.service.EsFlowService;
import com.test.ownasset.util.ExcelUtil;
import com.test.ownasset.util.IpUtil;
/**
*
* @author zhangqingzhou
*/
@IocBean(name = "ownAssetService")
public class OwnAssetService {
private final Properties properties = OwnAssetConfig.getInstance().getProperties();
/**
* 是否是 系統初始化 導入數據
*/
private boolean isInit = Long.valueOf(properties.getProperty("ownAssetInitImportData", "1")) == 1?true :false;
/**
* 導入EXCEL
* 分段導入,避免 內存溢出
* @param file 路由端口信息文件
* @throws Exception 導入異常
*/
public String importExcel2(File file) throws Exception {
String importInfo ="true";
if (file.isFile()) {
String fileName = file.getName().toLowerCase();
if (fileName.endsWith(".xls") || fileName.endsWith(".xlsx")) {
getExcelAnImport(file);
}
}
return importInfo;
}
/**
* 分段導入
* @param file
* @return
*/
public void getExcelAnImport(File file) {
HashMap excelMap = new HashMap();
// 記錄首次出現異常的 行數
boolean isInsert = isInit;
int line = 1;
//Excel相關變量
try {
Workbook workbook = WorkbookFactory.create(new FileInputStream(file));
int sheetNum = workbook.getNumberOfSheets();
List list = new ArrayList<>();
if (sheetNum > 0) {
Sheet sheet;
int count;
Row row;
sheet = workbook.getSheetAt(0);
count = sheet.getLastRowNum(); // 統計表格 的 行數
for (int i = 1; i < count + 1; i++) {//循環行
line++;
row = sheet.getRow(i); // 獲取索引對應行的 信息
// 子網IP
String subnetIP = ExcelUtil.getCellValue(row.getCell(0)).trim();
// 子網掩碼
int subnetMask = Integer.parseInt( ExcelUtil.getCellValue(row.getCell(1)));
// 自用資產區域(地級市)
String area = ExcelUtil.getCellValue(row.getCell(3)).trim();
// 備注信息
String remark = ExcelUtil.getCellValue(row.getCell(4))+";"+ExcelUtil.getCellValue(row.getCell(5))+";"+ExcelUtil.getCellValue(row.getCell(6));
// 獲取起始IP + 終止IP
String[] ipArr = IpUtil.getStartAndEndIP(subnetIP, subnetMask);
// 由起始+終止Ip 獲取 在地址段內的 所有 IP
if(ipArr != null && ipArr.length == 2){
long startIpLong = IpUtil.ipToLong(ipArr[0]);
long endIpLong = IpUtil.ipToLong(ipArr[1]);
// ip 段跨度 較小時,按段 去 插入
if(endIpLong -startIpLong <= 5000){
List allRoomIp = IpUtil.getAllIpBySegment(ipArr[0], ipArr[1]);
if(allRoomIp != null && allRoomIp.size() > 0){
// 每次 讀一段--存一段(先把驗證數據去掉)
for (String ip : allRoomIp) {
OwnUsedAsset obj = new OwnUsedAsset();
obj.setArea(area);
obj.setIP(ip);
// obj.setIpLong(subnetMask);
obj.setRemark(remark);
list.add(obj);
obj = null;
}
}
}else{
// 當ip 跨度較大時,比如 mask = 8 時,此時一個 ip段就是 1670萬+,解決策略是 每次 存1000 個
for(long i1=startIpLong; i1 <= endIpLong; i1++ ){
// 每次 讀一段--存一段(先把驗證數據去掉)
OwnUsedAsset obj = new OwnUsedAsset();
obj.setArea(area);
obj.setIP(IpUtil.longToIP(i1));
// obj.setIpLong(subnetMask);
obj.setRemark(remark);
list.add(obj);
obj = null;
if(list.size() >= 5000){
storeDB(list ,isInsert);
list = new ArrayList<>();//制空
}
}
// 最后的部分
storeDB(list ,isInsert);
list = new ArrayList<>();
}
}
// 每次循環檢查一次,防止數據一次性過多
if(list.size() >= 5000){
storeDB(list ,isInsert);
list = new ArrayList<>();//制空
}
}
// 最后不滿足 5000 行數據的也要插入
storeDB(list ,isInsert);
list = new ArrayList<>();//制空
}
} catch (Exception e) {
System.out.println("異常:"+e);
}
}
/**
*
* @param list
* @param isInsert
*/
public void storeDB(List list ,boolean isInsert){
if(isInsert){
OwnUsedAssetService.getInstance().insertAddressToDB(list);
}else{
OwnUsedAssetService.getInstance().insertAndUpdateInfo(list);
}
}
/**
* 導出 自用地址段表
* @param ids
* @return
*/
public Workbook writeExcel(long[] ids,Ioc ioc,HttpSession session, @Param("..") Pager pager,
@Param("search") String search,int state){
/*HSSFWorkbook wook = new HSSFWorkbook();
HSSFSheet sheet=wook.createSheet("自用地址段信息");
HSSFRow row=sheet.createRow(0); */
XSSFWorkbook work = new XSSFWorkbook();
XSSFSheet sheet = work.createSheet("自用地址段信息");
//在sheet中創建一行
XSSFRow row = sheet.createRow(0);
//在該行寫入各種類型的數據
row.createCell(0).setCellValue("資產歸屬地");
row.createCell(1).setCellValue("資產IP");
if(state == 2){
row.createCell(2).setCellValue("最近一次發現時間");
row.createCell(3).setCellValue("備注");
sheet.setColumnWidth(2, (short)6500);
sheet.setColumnWidth(3, (short)15000);
}else{
row.createCell(2).setCellValue("備注");
sheet.setColumnWidth(2, (short)1500);
}
// 調整列寬
sheet.setColumnWidth(0, (short)2500);
sheet.setColumnWidth(1, (short)5000);
// sheet.setColumnWidth(2, (short)15000);
// 遍歷數據庫 取出數據,放入表格里
//在寫入 日期格式的 數據需要進行特殊處理(這是一種 簡單的處理方式)
int rowNum = 1;
List list = null;
BoolQueryBuilder qb = QueryBuilders.boolQuery();
pager.setPage(1);
pager.setPageSize(10000);
// 組合 模糊查詢 should
if( state == 2){
QueryBuilder state2 = QueryBuilders.termQuery("state", 2);// 下線資產狀態
qb.must(state2);
}
// 選擇 條目的
if(search == null || search.equals("") ){
if(ids == null || ids.length == 0){
// 全查
list = OwnUsedAssetService.getInstance().getList(pager,qb).getData();
}else{
qb.must(QueryBuilders.inQuery("id", ids));
list = OwnUsedAssetService.getInstance().getList(pager,qb).getData();
}
}else{
// 說明 有 查詢條件
// 1.已經選擇 具體 信息,則繼續 按照 ids 查詢
if( ids != null && ids.length > 0){
qb.must(QueryBuilders.inQuery("id", ids));
list = OwnUsedAssetService.getInstance().getList(pager, qb).getData();
}else{
// 2.說明 有滿足條件且 沒有具體選擇,則需要 模糊查詢出符合條件的 所有信息
// 重新 設置 page
BoolQueryBuilder qbDFuzzy = QueryBuilders.boolQuery();
WildcardQueryBuilder ip = QueryBuilders.wildcardQuery("ip", "*"+search+"*");
WildcardQueryBuilder area = QueryBuilders.wildcardQuery("area", "*"+search+"*");
WildcardQueryBuilder remark = null;
if(state == 2){
remark = QueryBuilders.wildcardQuery("downLineRemark", "*"+search+"*");
WildcardQueryBuilder detectTime = QueryBuilders.wildcardQuery("detectTime", "*"+search+"*");
qbDFuzzy.should(ip).should(area).should(remark).should(detectTime);
}else{
remark = QueryBuilders.wildcardQuery("remark", "*"+search+"*");
qbDFuzzy.should(ip).should(area).should(remark);//
}
qb.must(qbDFuzzy);
list = OwnUsedAssetService.getInstance().getFuzzyList(pager, qb).getData();
}
}
if(state == 2){
for (OwnUsedAsset obj : list) {
XSSFRow rowInsert=sheet.createRow(rowNum);
rowInsert.createCell(0).setCellValue(obj.getArea());
rowInsert.createCell(1).setCellValue(obj.getIP());
rowInsert.createCell(2).setCellValue(obj.getDetectTime());
rowInsert.createCell(3).setCellValue(obj.getDownLineRemark());
rowNum ++;
}
}else{
for (OwnUsedAsset obj : list) {
XSSFRow rowInsert=sheet.createRow(rowNum);
rowInsert.createCell(0).setCellValue(obj.getArea());
rowInsert.createCell(1).setCellValue(obj.getIP());
//rowInsert.createCell(2).setCellValue(obj.getDetectTime());
rowInsert.createCell(2).setCellValue(obj.getRemark());
rowNum ++;
}
}
return work;
}
/**
* 與庫中數據 進行對比,來判斷是否 為 遺漏資產
* @param allIPLong
* @return
*//*
public Set getNoCountIPAddr(Set allIPLong ){
HashSet noCountIPSet = new HashSet();
if(allIPLong == null || allIPLong.size() ==0) return noCountIPSet;
for (Long ipLong : allIPLong) {
//true : 含有 false: 不含有
if(!OwnAssetCache.getInstance().checkDataInDB(ipLong)){
noCountIPSet.add(ipLong);
}
}
return noCountIPSet;
}*/
}
第二層 service:
package com.test.ownasset.service.esService;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import java.util.Set;
import org.apache.log4j.Logger;
import org.elasticsearch.ElasticsearchException;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchScrollRequestBuilder;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.BoolFilterBuilder;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.FilterBuilders;
import org.elasticsearch.index.query.OrFilterBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.index.query.TermsQueryBuilder;
import org.elasticsearch.index.query.WildcardQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.sort.SortBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.nutz.ioc.loader.annotation.IocBean;
import com.test.commons.mvc.Pager;
import com.test.ownasset.cache.OwnUsedAssetCache;
import com.test.ownasset.data.AllAddressInProvice;
import com.test.ownasset.data.OwnUsedAsset;
import com.test.ownasset.util.DateUtil;
import com.test.ownasset.util.EsClientUtil;
import com.test.ownasset.util.IpUtil;
import com.test.ownasset.util.JsonUtil;
import com.test.util.es.ESClient;
/**
*
* @author Administrator
*
*/
@IocBean
public class OwnUsedAssetService {
private Logger logger = Logger.getLogger(OwnUsedAssetService.class);
private OwnUsedAssetService(){};
/**
* 單例模式
*/
private static OwnUsedAssetService service = null;
public static OwnUsedAssetService getInstance(){
if(service == null){
service = new OwnUsedAssetService();
}
return service;
}
private static String name ="ownused";
/**
* 添加單個數據 boolean exist = EsClientUtil.isExistIndex(name);
* @param obj
*/
public void insertAddressToDB(OwnUsedAsset obj){
ESClient client = EsClientUtil.getDefaultDelegateClient();
if(client != null){
//long id=new Date().getTime()*10000+new Random().nextInt(10000);
obj.setId(obj.getIpLong());
obj.setState(1);
obj.setCreateTime(System.currentTimeMillis());
obj.setUpdateTime(System.currentTimeMillis());
obj.setActionTime(DateUtil.getNowWeekNumber());
//obj.setDetectTime(DateUtil.getNowTimeStr());
String data = JsonUtil.toJson(obj);
client.prepareIndex(name,name)
.setId(String.valueOf(obj.getIpLong()))
.setSource(data)
.execute().actionGet();
// 添加到內存 OwnUsedAssetCache
OwnUsedAssetCache.ownUsedCache.put(obj.getIP(), DateUtil.getNowWeekNumber());
}
}
/**
* 批量添加全省地址段
* @param objList
*/
public void insertAddressToDB(List objList){
if(objList.size() == 0) return;
ESClient client = EsClientUtil.getDefaultDelegateClient();
if(client != null){
long actionTime = DateUtil.getNowWeekNumber();
// 開啟批量
BulkRequestBuilder prepareBulk = client.prepareBulk();
for (OwnUsedAsset obj : objList) {
//long id=new Date().getTime()*10000+new Random().nextInt(10000);
obj.setId(obj.getIpLong());
obj.setState(1);
obj.setCreateTime(System.currentTimeMillis());
obj.setUpdateTime(System.currentTimeMillis());
obj.setActionTime(actionTime);
//obj.setDetectTime(DateUtil.getNowTimeStr());
String data = JsonUtil.toJson(obj);
prepareBulk.add(
client.prepareIndex(name,name)
.setId(String.valueOf(obj.getIpLong()))
.setSource(data)
);
// 添加到內存 OwnUsedAssetCache
OwnUsedAssetCache.ownUsedCache.put(obj.getIP(), actionTime);
}
prepareBulk.execute().actionGet();
logger.info("-->批量添加自用地址段:"+objList.size());
}
}
/**
* 批量添加 或更新數據
* 若是此IP,不存在則 添加,若是存在 則更新
* @param objList
*/
public void insertAndUpdateInfo(List objList){
if(objList == null || objList.size() == 0) return;
long start = System.currentTimeMillis();
ESClient client = EsClientUtil.getDefaultDelegateClient();
if(client != null){
// 先驗證是否存在 getEntry(Map qbMap)
List insertList = new ArrayList();
HashMap dataMap = new HashMap();
for (OwnUsedAsset obj : objList) {
String docId = getDocIdUsedCache(obj.getIP());
if(docId.equals("")){
// 批量添加
insertList.add(obj);
}else{
dataMap.put(docId, obj.getRemark());
}
}
// 批量添加
if(insertList.size() > 0){
insertAddressToDB(insertList);
}
//批量更新
if(dataMap.size() > 0){
HashMap editMap = new HashMap<>();
editMap.put("updateTime",System.currentTimeMillis());
bulkUpdateState(dataMap,editMap);
}
}
long end = System.currentTimeMillis();
logger.info("批量添加 或更新數據:"+objList.size() +" 條-->"+"共耗時:"+(end - start)+" 毫秒!");
}
/**
* 更新 單條 -數據 通過id
* @param obj
*/
public void updateInfo(OwnUsedAsset obj){
if(obj == null) return;
boolean exist = EsClientUtil.isExistIndex(name);
if(exist){
ESClient client = EsClientUtil.getDefaultDelegateClient();
QueryBuilder qb = QueryBuilders.termQuery("id", obj.getId());
SearchResponse respose = client.prepareSearch(name)
.setQuery(qb)
.setSize(1)
.execute().actionGet();
SearchHit[] hits = respose.getHits().getHits();
if(hits.length > 0){
// 先獲取文檔ID
String docId = hits[0].getId();
// 對數據進行更新
if(obj.getState()!= 2){
obj.setState(1);
}
obj.setUpdateTime(System.currentTimeMillis());
String data = JsonUtil.toJson(obj);
// 進行操作
client.prepareIndex(name, name)
.setId(docId)
.setSource(data)
.execute()
.actionGet();
}
}
}
/**
* 刪除信息
* @param ids
*/
public void deleteInfo(long[] ids){
if(ids == null || ids.length == 0) return;
boolean exist = EsClientUtil.isExistIndex(name);
if(exist){
ESClient client = EsClientUtil.getDefaultDelegateClient();
// 先查詢 再 刪除
QueryBuilder qb = QueryBuilders.inQuery("id", ids);
SearchResponse respose = client.prepareSearch(name)
.setTypes(name)
.setQuery(qb)
.setSize(Integer.MAX_VALUE)
.execute().actionGet();
SearchHit[] hits = respose.getHits().getHits();
if(hits.length > 0){
// 開啟批量刪除
BulkRequestBuilder bulkfresh = client.prepareBulk().setRefresh(true);
for (SearchHit searchHit : hits) {
DeleteRequest deleteRequest = new DeleteRequest(name, name, searchHit.getId());
bulkfresh.add(deleteRequest);
// 清楚緩存
OwnUsedAssetCache.ownUsedCache.remove(IpUtil.longToIP(Long.valueOf(searchHit.getId())));
}
// 執行
bulkfresh.execute().actionGet();
}
}
}
/**
* 當把下線資產刪除時,應把 對應的資產庫中的 state 由 2 -->1
* @param ids
*/
public void updateStateInfo(long[] ids){
if(ids == null || ids.length == 0) return;
boolean exist = EsClientUtil.isExistIndex(name);
if(exist){
ESClient client = EsClientUtil.getDefaultDelegateClient();
// 先查詢 再 刪除
QueryBuilder qb = QueryBuilders.inQuery("id", ids);
SearchResponse respose = client.prepareSearch(name)
.setTypes(name)
.setQuery(qb)
.setSize(Integer.MAX_VALUE)
.execute().actionGet();
SearchHit[] hits = respose.getHits().getHits();
if(hits.length > 0){
for (SearchHit searchHit : hits) {
OwnUsedAsset obj = new OwnUsedAsset();
Map source = searchHit.getSource();
String docId = searchHit.getId();
long id = Long.parseLong(source.get("id").toString());
long createTime = Long.parseLong(source.get("createTime").toString());
long actionTime = Long.parseLong(source.get("actionTime").toString());
long updateTime = Long.parseLong(source.get("updateTime").toString());
String ip = source.get("ip")== null ? "": source.get("ip").toString();
String area = source.get("area")== null ? "": source.get("area").toString();
String remark = source.get("remark")== null ? "": source.get("remark").toString();
//String downLineRemark = source.get("downLineRemark")== null ? "": source.get("downLineRemark").toString();
//String detectTime = source.get("detectTime")== null ? "": source.get("detectTime").toString();
obj.setId(id);
obj.setArea(area);
obj.setIP(ip);
obj.setRemark(remark);
obj.setActionTime(actionTime);
obj.setUpdateTime(updateTime);
obj.setCreateTime(createTime);
obj.setDetectTime("");
obj.setDownLineRemark("");
// 修改狀態值
obj.setState(1);
String data = JsonUtil.toJson(obj);
//執行操作
client.prepareIndex(name,name)
.setId(docId)
.setSource(data)
.execute()
.actionGet();
}
}
}
}
/**
* 自用地址段 分頁查詢
* @param pager QueryBuilder qb = null 時 無條件查最新的
* @return
*/
public Pager getList( Pager pager,QueryBuilder qb){
// 初始化值
List list = new ArrayList();
long count = 0;
int pagerFrom = (pager.getPage()-1)*pager.getPageSize();
boolean exist = EsClientUtil.isExistIndex(name);
if(exist){
ESClient client = EsClientUtil.getDefaultDelegateClient();
SearchResponse respose = null;
if(qb != null){
respose =client.prepareSearch(name)
.addSort("createTime",SortOrder.DESC)
.setQuery(qb)
.setFrom(pagerFrom)
.setSize(pager.getPageSize())
.execute()
.actionGet();
}else{
respose =client.prepareSearch(name)
.addSort("createTime",SortOrder.DESC)
.setFrom(pagerFrom)
.setSize(pager.getPageSize())
.execute()
.actionGet();
}
SearchHits hits = respose.getHits();
count = hits.getTotalHits();
SearchHit[] dataArr = hits.getHits();
if(dataArr.length > 0){
for (SearchHit searchHit : dataArr) {
Map source = searchHit.getSource();
OwnUsedAsset obj = new OwnUsedAsset();
long id = Long.parseLong(source.get("id").toString());
String ip = source.get("ip")== null ? "": source.get("ip").toString();
String area = source.get("area")== null ? "": source.get("area").toString();
String remark = source.get("remark")== null ? "": source.get("remark").toString();
String downLineRemark = source.get("downLineRemark")== null ? "": source.get("downLineRemark").toString();
String detectTime = source.get("detectTime")== null ? "": source.get("detectTime").toString();
obj.setId(id);
obj.setArea(area);
obj.setIP(ip);
obj.setRemark(remark);
obj.setDetectTime(detectTime);
obj.setDownLineRemark(downLineRemark);
list.add(obj);
}
}
}
// 組裝
pager.setRecords(count);
pager.setData(list);
return pager;
}
/**
* 全省地址段 模糊分頁查詢
* 只對三個字段進行 統計 分別是
* ip area remark
* @param pager
* @return
*/
public Pager getFuzzyList( Pager pager,QueryBuilder qb){
// 初始化值
List list = new ArrayList();
long count = 0;
int pagerFrom = (pager.getPage()-1)*pager.getPageSize();
boolean exist = EsClientUtil.isExistIndex(name);
if(exist){
ESClient client = EsClientUtil.getDefaultDelegateClient();
SearchResponse respose = client.prepareSearch(name)
.addSort("createTime",SortOrder.DESC)
.setFrom(pagerFrom)
.setQuery(qb)
.setSize(pager.getPageSize())
.execute()
.actionGet();
SearchHits hits = respose.getHits();
count = hits.getTotalHits();
SearchHit[] dataArr = hits.getHits();
if(dataArr.length > 0){
for (SearchHit searchHit : dataArr) {
Map source = searchHit.getSource();
OwnUsedAsset obj = new OwnUsedAsset();
long id = Long.parseLong(source.get("id").toString());
String ip = source.get("ip")== null ? "": source.get("ip").toString();
String area = source.get("area")== null ? "": source.get("area").toString();
String remark = source.get("remark")== null ? "": source.get("remark").toString();
String downLineRemark = source.get("downLineRemark")== null ? "": source.get("downLineRemark").toString();
String detectTime = source.get("detectTime")== null ? "": source.get("detectTime").toString();
obj.setId(id);
obj.setArea(area);
obj.setIP(ip);
obj.setRemark(remark);
obj.setDetectTime(detectTime);
obj.setDownLineRemark(downLineRemark);
list.add(obj);
}
}
}
// 組裝
pager.setRecords(count);
pager.setData(list);
return pager;
}
/**
* 由qbMap 獲取一條 滿足條件的信息
* qbMap 不可為空,為空的話 return null;
* 獲取 1條信息
* @param key
* @param value
* @return
*/
public OwnUsedAsset getEntry(Map qbMap){
OwnUsedAsset obj = null;
if(qbMap == null) return null;
boolean flag = EsClientUtil.isExistIndex(name);
if(flag){
ESClient client = EsClientUtil.getDefaultDelegateClient();
BoolQueryBuilder qb = QueryBuilders.boolQuery();
Set keySet = qbMap.keySet();
for (Object key : keySet) {
QueryBuilders.termQuery(key.toString(), qbMap.get(key));
qb.must(QueryBuilders.termQuery(key.toString(), qbMap.get(key)));
}
SearchResponse respose = client.prepareSearch(name)
.setQuery(qb)
.setSize(1)
.execute().actionGet();
SearchHit[] hits = respose.getHits().getHits();
if(hits.length > 0){
Map source = hits[0].getSource();
obj= new OwnUsedAsset();
long id = Long.parseLong(source.get("id").toString());
long state = Long.parseLong(source.get("state").toString());
long createTime = Long.parseLong(source.get("createTime").toString());
long actionTime = Long.parseLong(source.get("actionTime").toString());
long updateTime = Long.parseLong(source.get("updateTime").toString());
String ip = source.get("ip")== null ? "": source.get("ip").toString();
String area = source.get("area")== null ? "": source.get("area").toString();
String remark = source.get("remark")== null ? "": source.get("remark").toString();
String downLineRemark = source.get("downLineRemark")== null ? "": source.get("downLineRemark").toString();
String detectTime = source.get("detectTime")== null ? "": source.get("detectTime").toString();
obj.setId(id);
obj.setArea(area);
obj.setIP(ip);
obj.setState(state);
obj.setDetectTime(detectTime);
obj.setDownLineRemark(downLineRemark);
obj.setActionTime(actionTime);
obj.setCreateTime(createTime);
obj.setUpdateTime(updateTime);
obj.setRemark(remark);
}
}
return obj;
}
/**
* 查詢條件 由自己組裝
* @param QueryBuilder qb
* @return
*/
public OwnUsedAsset getEntry(QueryBuilder qb){
OwnUsedAsset obj = null;
if(qb == null) return null;
boolean flag = EsClientUtil.isExistIndex(name);
if(flag){
ESClient client = EsClientUtil.getDefaultDelegateClient();
SearchResponse respose = client.prepareSearch(name)
.setQuery(qb)
.setSize(1)
.execute().actionGet();
SearchHit[] hits = respose.getHits().getHits();
if(hits.length > 0){
Map source = hits[0].getSource();
obj= new OwnUsedAsset();
long id = Long.parseLong(source.get("id").toString());
String ip = source.get("ip")== null ? "": source.get("ip").toString();
String area = source.get("area")== null ? "": source.get("area").toString();
String remark = source.get("remark")== null ? "": source.get("remark").toString();
obj.setId(id);
obj.setArea(area);
obj.setIP(ip);
obj.setRemark(remark);
}
}
return obj;
}
/**
* 查詢 ES
* 由ip 獲取 自用資產里的 docId
* 若是 不存在: return "";
* @param ip
* @return
*/
public String getDocIdByIp(String ip){
String docId = "";
boolean flag = EsClientUtil.isExistIndex(name);
if(flag){
ESClient client = EsClientUtil.getDefaultDelegateClient();
SearchResponse respose = client.prepareSearch(name)
.setQuery(QueryBuilders.termQuery("ip", ip))
.setSize(1)
.execute().actionGet();
SearchHit[] hits = respose.getHits().getHits();
if(hits.length > 0){
docId = hits[0].getId();
}
}
return docId;
}
/**
* 查詢 cache
* 由ip 獲取 自用資產里的 docId
* 若是 不存在: return "";
* @param ip
* @return
* {218.2.241.220=201712, 218.2.241.221=201712, 218.2.241.222=201712,
*/
public String getDocIdUsedCache(String ip){
String docId = "";
Long exist = OwnUsedAssetCache.ownUsedCache.get(ip);
if(exist != null){
docId = String.valueOf(IpUtil.ipToLong(ip));
}
return docId;
}
/**
* HashMap editMap = new HashMap<>();
editMap.put("state", 3);
editMap.put("actionTime", 666666);
* setDoc("actionTime", 10000)
* 每次只能改一個,后面的會覆蓋前面的
* @param docId
*/
public void updateDataInField(String docId ,Map editMap){
boolean flag = EsClientUtil.isExistIndex(name);
if(flag){
ESClient client = EsClientUtil.getDefaultDelegateClient();
client.prepareUpdate(name, name, docId)
.setDoc(editMap)
.execute().actionGet();
}
}
/**
* 批量更新 信息
* @param downLineID
*/
public void bulkUpdateState(Set downLineID ,Map editMap){
if(downLineID.size() == 0) return;
boolean flag = EsClientUtil.isExistIndex(name);
if(flag){
ESClient client = EsClientUtil.getDefaultDelegateClient();
BulkRequestBuilder prepareBulk = client.prepareBulk();
for (String docId : downLineID) {
prepareBulk.add(client.prepareUpdate(name, name, docId).setDoc(editMap));
}
prepareBulk.execute().actionGet();
logger.info("更新自用資產:"+downLineID.size()+"條!");
}
}
/**
* 批量更新 信息
* @param downLineID
*/
public void bulkUpdateState(Map downLineID ,Map editMap){
if(downLineID.size() == 0) return;
boolean flag = EsClientUtil.isExistIndex(name);
if(flag){
ESClient client = EsClientUtil.getDefaultDelegateClient();
BulkRequestBuilder prepareBulk = client.prepareBulk();
Set entrySet = downLineID.keySet();
for (String docId : entrySet) {
editMap.put("remark", downLineID.get(docId));
prepareBulk.add(client.prepareUpdate(name, name, docId).setDoc(editMap));
}
prepareBulk.execute().actionGet();
}
}
/**
* 獲取超時 信息,為了防止 數據較大,采用 scroll 獲取,避免 內存開銷過大
* 1200 * size 每次取出的條數
* @param gaps
* @return
*/
public Set getOverTimeAssets(long gaps){
long start = System.currentTimeMillis();
HashSet downLineID = new HashSet();
boolean flag = EsClientUtil.isExistIndex(name);
long allSize = 0;
if(flag){
ESClient client = EsClientUtil.getDefaultDelegateClient();
//long rangeTime = System.currentTimeMillis() -gaps;
// 久未活動 201652 201653 201701 201702 201703
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.must(QueryBuilders.termQuery("state", 1));
QueryBuilder qb = QueryBuilders.rangeQuery("actionTime").lt(gaps);
SearchResponse respose = client.prepareSearch(name)
.setScroll(new TimeValue(60000))
.setQuery(boolQuery.must(qb))
.setSize(2000)
.setSearchType(SearchType.SCAN)
.execute().actionGet();
String scrollId = respose.getScrollId();
try {
while(true){
SearchResponse respose2 = client.prepareSearchScroll(scrollId)
.setScroll(new TimeValue(60000))
.execute().actionGet();
SearchHit[] hits = respose2.getHits().getHits();
if(hits.length == 0){
break;
}
//logger.info("每次獲取超時自用資產:"+hits.length +"條!");
allSize+= hits.length;
for (SearchHit searchHit : hits) {
String docId = searchHit.getId();
downLineID.add(docId);
}
}
} catch (ElasticsearchException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
long end = System.currentTimeMillis();
logger.info("獲取 超時未活動的資產耗時:"+(end - start)+"毫秒!"+downLineID.size() +"條!");
return downLineID;
}
/**
* 初始化 緩存 size * 分片數
* scroll 滑動游標
*/
public long initCache(int size){
logger.info("初始化自用資產,采用scroll游標滑動分段查詢,每段獲取:"+(12*size)+"條!");
boolean flag = EsClientUtil.isExistIndex(name);
long allSize = 0;
long start = System.currentTimeMillis();
if(flag){
ESClient client = EsClientUtil.getDefaultDelegateClient();
SearchResponse respose = client.prepareSearch(name)
// 這個的意思是 加載的結果,在內存中所存放的時間,若 每次的 size 過大,而 TimeValue 又過小,這樣會造成數據的丟失
.setScroll(new TimeValue(600000))// 保存一分鍾
.setSize(size)// size*12分片
.setSearchType(SearchType.SCAN)// 不排序
.execute().actionGet();
String scrollId = respose.getScrollId();
try{
while(true){
SearchResponse resposeScroll = client.prepareSearchScroll(scrollId)
.setScroll(new TimeValue(600000))// 保存一分鍾
.execute().actionGet();
SearchHit[] hits = resposeScroll.getHits().getHits();
if(hits == null || hits.length == 0){
break;// 跳出循環
}
allSize+= hits.length;
//System.out.println("allSize:"+allSize);
for (SearchHit searchHit : hits) {
Map source = searchHit.getSource();
long actionTime = Long.parseLong(source.get("actionTime").toString());
String ip = source.get("ip")== null ? "": source.get("ip").toString();
OwnUsedAssetCache.ownUsedCache.put(ip, actionTime);
}
}
long end = System.currentTimeMillis();
OwnUsedAssetCache.isOver = true;
logger.info("自用資產加載完畢,共加載:"+allSize +"共耗時:"+(end-start)+"毫秒!");
}catch(Exception e){
e.printStackTrace();
}
}else{
// 此索引暫不存在
logger.info("ES 中 indexName="+name+"的索引尚未存在,默認設置為 內存加載完成!");
OwnUsedAssetCache.isOver = true;
}
return allSize;
}
/**
* 批量更新 自用地址段-中遺漏-納管ip 信息
* @param
* isHave = 2 // 表示 在 遺漏-納管ip 中存在
*/
public void bulkUpdateOwnUsed(HashMap dataMap,int isHave){
if(dataMap.size() == 0) return;
boolean flag = EsClientUtil.isExistIndex("ownused");
if(flag){
ESClient client = EsClientUtil.getDefaultDelegateClient();
BulkRequestBuilder prepareBulk = client.prepareBulk();
// 然后進行批量更新
HashMap editMap = new HashMap();
editMap.put("state", isHave);// 表示 在 遺漏-納管ip 中存在
Set> entrySet = dataMap.entrySet();
for (Entry entry : entrySet) {
String docId = entry.getKey();
String ipSegment = entry.getValue();
editMap.put("detectTime", ipSegment);// 存 歸屬 ip 段
prepareBulk.add(client.prepareUpdate("ownused", "ownused", docId).setDoc(editMap));
}
logger.info("更新自用資產段的遺漏-納管ip");
prepareBulk.execute().actionGet();
}
}
public static void main(String[] args) {
OwnUsedAssetService.getInstance().initCache(2000);
//OwnUsedAssetService.getInstance().getOverTimeAssets(150*24*60*60*100L);
}
}
JsonUtil:
package com.test.ownasset.util;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonUtil {
/**
* 由對象轉化成json 格式,添加到ES
*/
private static ObjectMapper objectMapper = new ObjectMapper();
public static String toJson(Object o){
try {
return objectMapper.writeValueAsString(o);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return "";
}
}
總結:里面包含 單條插入,批量插入,單條、批量更改,單、批量 刪除,查詢 與 模糊查詢,滑動迭代取值等