需求:
有两个集合A和B
A:集合中包含对象,对象中有两个属性,k1,v1
例如:A中的a1对象,k1="a1",v1="23.1"
B:集合中包含对象,对象的属性中包含一个string类型的数组,每个数组设置上限长度为50,集合的size也不能超过五十,目前该集合中已有三十多个,但要排除其中六个,根据名字进行排除,例如:可用的都为固定格式开头“我是自建1、我是自建2....”
B集合的对象b1:我是自建1(名字),数组,数组的长度,等属性
提示:需要将A集合v1的值添加到B集合的对象的数组中,不可超过数组长度,已有分组不足时才可进行新建。
package job;
import com.aliyun.openservices.log.exception.LogException;
import models.bean.BlackIP;
import models.bean.LogIpBlack;
import models.bean.MyBlackList;
import models.test.IPBlackTest;
import play.jobs.Every;
import play.jobs.Job;
import utils.IPGroupCRUD;
import java.util.Arrays;
import java.util.List;
/**
* @author zd
* @create 2022-10-09 16:50
*/
@Every("5mn")
public class BlackIPJob extends Job {
public void doJob() throws LogException {
System.out.println("job执行了*****************************************************");
/**
* 获取log中的可疑IP,li记录添加的索引
*/
List<LogIpBlack> logIPList = IPGroupCRUD.getLogIP();
//模拟八百个值填满分组
for (int i = 0; i < 800; i++) {
LogIpBlack logIp = new LogIpBlack("2", "23.34.1." + i);
logIPList.add(logIp);
}
/**
* 创建返回结果的对象
*/
String addResult = "";
BlackIP blackIP = new BlackIP();
/**
* 判断ip是否已经存在
*/
allFor:
for (LogIpBlack logIpBlack : logIPList) {
/**
* 获取所有IP黑名单分组信息
*/
List<MyBlackList> blackList = IPGroupCRUD.getBlackList();
//已有的分组中有六个为不可添加分组
int myGroup = blackList.size() - 6;
String logValue = logIpBlack.logValue;//获取值
boolean ipExist = BlackIPJob.selectByIP(logValue, blackList);//通过方法获取返回值
//判断IP是否存在
if (ipExist == false) {
//不存在则进行添加,循环IP分组
ipFor:
for (MyBlackList myBlackList : blackList) {
if (myBlackList.ipName.startsWith("IP黑名单") && myBlackList.ipList < 50) {
String ips = "";
ips = ips + logValue + ",";
//取出原来的数据
String s = "";
for (String groupIP : myBlackList.groupIPs) {
s = s + groupIP + ",";
}
String s1 = ips + s;
ips = s1.substring(0, s1.length() - 1);
System.out.println(ips);
//修改IP分组
IPGroupCRUD.alterIPGroup(myBlackList.ipId, ips, myBlackList.ipName, myBlackList.version, "block");
blackIP.add_result = "分组添加成功!";
break ipFor;//添加成功跳出循环,进行下一个IP值循环,否则会造成重复添加
//判断当前对象是否为集合中最后一个
} else if (blackList.size() - 1 == blackList.indexOf(myBlackList)) {
if (blackList.size() > 49) {//大于49则证明无法进行新建
blackIP.add_result = "新建分组失败!分组已满,请联系管理员处理。";
break allFor;
}
System.out.println("**********新建");
String name = "IP黑名单" + (myGroup + 1);
IPGroupCRUD.addIPGroup("block", name, "custom_acl", 1, "IP", "");//新建分组
doJob();//重新调用方法,刷新执行
}
}
}
}
blackIP.save();//保存对象到数据库
}
/**
* 根据传入的ip判断是否存在
*
* @param ips
*/
public static boolean selectByIP(String ips, List<MyBlackList> blackList) {
boolean res = false;
for (MyBlackList myBlackList : blackList) {
String[] groupIPs = myBlackList.groupIPs;
for (int i = 0; i < groupIPs.length; i++) {
if (groupIPs[i].equals(ips)) {
res = true;
}
}
}
return res;
}
}
如有好的方法可提升效率,欢迎讨论