Java中如何给map数组制空,java 操作ES 增刪改查總結

本實例框架采用 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 "";

}

}

總結:里面包含 單條插入,批量插入,單條、批量更改,單、批量 刪除,查詢 與 模糊查詢,滑動迭代取值等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值