import com.alibaba.fastjson.JSONObject;
import com.yl.platform.api.dto.RequestDTO;
import org.springframework.util.DigestUtils;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class HttpTest {
//最大线程数
public static int maxThreadCount = 20;
//线程池
public static ExecutorService executorService = Executors.newFixedThreadPool(maxThreadCount);
//全部任务列表
public static List<Integer> taskList = new CopyOnWriteArrayList<>();
//正在处理的任务列表
public static List<Integer> curTaskList = new CopyOnWriteArrayList<>();
//失败任务列表
public static List<Integer> failTaskList = new CopyOnWriteArrayList<>();
//记录已完成任务
public static Map<Integer,Integer> successTaskMap = new HashMap<>();
public static void main(String[] args) throws Exception {
long startTime = System.currentTimeMillis();
String url = "http://***";
String date = "2021-07-24";
//检查当天任务是否已经完成,完成则退出
//初始化任务
for (Integer i = -999; i <= 999; i++) {
taskList.add(i);
}
//去掉已完成的任务批次
boolean running = true;
try {
while (running) {
for(Integer ci: curTaskList){
if(successTaskMap.containsKey(ci)){
curTaskList.remove(ci);
taskList.remove(ci);
}
}
System.out.println("—————当前剩余任务数: " + taskList.size() + ",失败任务数: " + failTaskList.size()+ ",正在执行任务数: " + curTaskList.size());
//错误任务量太多,退出执行
if(failTaskList.size() >= 10) {
System.out.println("—————任务停止执行,失败任务数:" + failTaskList.size());
executorService.shutdown();
running = false;
}
if (taskList.size() > 0) {
int addNewCount = 0;
//添加新任务(需要去除正在执行的任务,避免重复处理)
for (Integer i : taskList) {
boolean isExists = false;
for (Integer ci : curTaskList) {
if (ci == i) {
isExists = true;
break;
}
}
//新任务,处理
if (!isExists) {
if (curTaskList.size() < HttpTest.maxThreadCount) {
addNewCount++;
curTaskList.add(i);
executorService.execute(new RunnableThreadDemo(url, date, i));
}
}
}
System.out.println("—————新加" + addNewCount + " 个任务,当前正在执行的任务数:" + curTaskList.size());
//等待1秒执行
Thread.sleep(1000);
} else {
System.out.println("—————所有任务已完成:");
executorService.shutdown();
running = false;
}
}
System.out.println("任务执行完成,总耗时 :" + (System.currentTimeMillis() - startTime) );
} catch (Exception e) {
e.printStackTrace();
}
}
public static JSONObject getParam(String date, int modNumber) {
String secretKey = "111";
String userId = "test";
String sql = "SELECT * FROM \n" +
" t_table t \n" +
"WHERE date = '" + date + "' \n" +
" AND MOD(MURMUR_HASH3_32 (billcode), 1000) =" + modNumber;
RequestDTO requestDTO = new RequestDTO();
String reqId = UUID.randomUUID().toString();
requestDTO.setReqId(reqId);
requestDTO.setUserId(userId);
requestDTO.setTimestamp(System.currentTimeMillis());
requestDTO.setSql(sql);
StringBuffer mulParamStr = new StringBuffer();
mulParamStr.append("userId=").append(userId);
mulParamStr.append("&secretKey=").append(secretKey);
mulParamStr.append("&reqId=").append(reqId);
mulParamStr.append("×tamp=").append(requestDTO.getTimestamp());
mulParamStr.append("&sql=").append(requestDTO.getSql());
String md5Str = DigestUtils.md5DigestAsHex(mulParamStr.toString().getBytes());
requestDTO.setSign(md5Str);
return (JSONObject) JSONObject.toJSON(requestDTO);
}
}
class RunnableThreadDemo implements Runnable {
private String url;
private String date;
private int modNum;
public RunnableThreadDemo(String url, String date, int modNum) {
this.url = url;
this.date = date;
this.modNum = modNum;
}
@Override
public void run() {
try {
long startTime = System.currentTimeMillis();
String responseStr = HttpUtil.httpPost(url, HttpTest.getParam(date, modNum));
if (null != responseStr) {
JSONObject resultJson = (JSONObject) JSONObject.parse(responseStr);
if (resultJson.getString("code").equals("1")) {
List<Map> resultDataList = resultJson.getObject("data", List.class);
System.out.println("i=" + modNum + "time:" + (System.currentTimeMillis() - startTime) + ",dataSize:" + resultDataList.size());
//insert to oracle
//标记任务已完成
System.out.println("i=" + modNum + " 任务执行完");
HttpTest.successTaskMap.put(modNum,1);
} else {
HttpTest.failTaskList.add(modNum);
System.out.println("i=" + modNum + ",出错了,resultJson:" + resultJson);
}
}
} catch (Exception e) {
HttpTest.failTaskList.add(modNum);
e.printStackTrace();
}
}
}
java多线程处理
最新推荐文章于 2024-08-28 14:52:44 发布
547

被折叠的 条评论
为什么被折叠?



