add 增加心跳功能
This commit is contained in:
@@ -50,4 +50,7 @@ public interface AcsConfig {
|
|||||||
String AutoCleanDays = "AutoCleanDays";
|
String AutoCleanDays = "AutoCleanDays";
|
||||||
//最大任务下发时间
|
//最大任务下发时间
|
||||||
String MAXSENDTASKTIME = "maxSendTaskTime";
|
String MAXSENDTASKTIME = "maxSendTaskTime";
|
||||||
|
|
||||||
|
//是否模拟在线
|
||||||
|
String fork_online = "fork_online";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,4 +9,6 @@ public class SystemConfig {
|
|||||||
public static Integer sequence_initial_value = Integer.valueOf(1);
|
public static Integer sequence_initial_value = Integer.valueOf(1);
|
||||||
//@DictionaryItem(description = "主线程是否自动开启选项")
|
//@DictionaryItem(description = "主线程是否自动开启选项")
|
||||||
public static Boolean thread_auto_run = Boolean.valueOf(true);
|
public static Boolean thread_auto_run = Boolean.valueOf(true);
|
||||||
|
// description = "不启用心跳功能"
|
||||||
|
public static Boolean heartbeat_no_use= Boolean.valueOf(false);
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
@@ -0,0 +1,10 @@
|
|||||||
|
package org.nl.acs.device_driver;
|
||||||
|
|
||||||
|
public interface HeartbeatableDeviceDriver extends DeviceDriver {
|
||||||
|
default void checkHeartbeat() {
|
||||||
|
}
|
||||||
|
|
||||||
|
default boolean isOnline() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,27 +8,32 @@ import lombok.Getter;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.nl.acs.AcsConfig;
|
||||||
import org.nl.acs.device.device_driver.standard_inspect.ReadUtil;
|
import org.nl.acs.device.device_driver.standard_inspect.ReadUtil;
|
||||||
import org.nl.acs.device.service.DeviceService;
|
import org.nl.acs.device.service.DeviceService;
|
||||||
import org.nl.acs.device_driver.DeviceDriver;
|
import org.nl.acs.device_driver.*;
|
||||||
import org.nl.acs.device_driver.RequestMethodEnum;
|
|
||||||
import org.nl.acs.device_driver.RouteableDeviceDriver;
|
|
||||||
import org.nl.acs.device_driver.StandardRequestMethod;
|
|
||||||
import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver;
|
import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver;
|
||||||
import org.nl.acs.device_driver.driver.ExecutableDeviceDriver;
|
import org.nl.acs.device_driver.driver.ExecutableDeviceDriver;
|
||||||
import org.nl.acs.ext.wms.data.AcsToWmsData.applyTask.ApplyTaskRequest;
|
import org.nl.acs.ext.wms.data.AcsToWmsData.applyTask.ApplyTaskRequest;
|
||||||
import org.nl.acs.ext.wms.data.AcsToWmsData.applyTask.ApplyTaskResponse;
|
import org.nl.acs.ext.wms.data.AcsToWmsData.applyTask.ApplyTaskResponse;
|
||||||
import org.nl.acs.ext.wms.data.Resp;
|
import org.nl.acs.ext.wms.data.Resp;
|
||||||
import org.nl.acs.ext.wms.service.AcsToWmsService;
|
import org.nl.acs.ext.wms.service.AcsToWmsService;
|
||||||
|
import org.nl.acs.heartbeat.HeartbeatEvent;
|
||||||
|
import org.nl.acs.heartbeat.dto.HeartbeatManageDto;
|
||||||
|
import org.nl.acs.heartbeat.enums.HeartbeatType;
|
||||||
|
import org.nl.acs.heartbeat.service.HeartbeatUnifiedService;
|
||||||
import org.nl.acs.instruction.service.InstructionService;
|
import org.nl.acs.instruction.service.InstructionService;
|
||||||
import org.nl.acs.instruction.service.dto.Instruction;
|
import org.nl.acs.instruction.service.dto.Instruction;
|
||||||
import org.nl.acs.log.service.DeviceExecuteLogService;
|
import org.nl.acs.log.service.DeviceExecuteLogService;
|
||||||
import org.nl.acs.monitor.DeviceStageMonitor;
|
import org.nl.acs.monitor.DeviceStageMonitor;
|
||||||
import org.nl.acs.opc.Device;
|
import org.nl.acs.opc.Device;
|
||||||
|
import org.nl.acs.opc.ObjectUtl;
|
||||||
import org.nl.acs.route.service.RouteLineService;
|
import org.nl.acs.route.service.RouteLineService;
|
||||||
import org.nl.acs.task.service.TaskService;
|
import org.nl.acs.task.service.TaskService;
|
||||||
import org.nl.modules.lucene.service.LuceneExecuteLogService;
|
import org.nl.modules.lucene.service.LuceneExecuteLogService;
|
||||||
import org.nl.modules.lucene.service.dto.LuceneLogDto;
|
import org.nl.modules.lucene.service.dto.LuceneLogDto;
|
||||||
|
import org.nl.modules.system.service.ParamService;
|
||||||
|
import org.nl.modules.system.service.impl.ParamServiceImpl;
|
||||||
import org.nl.modules.wql.util.SpringContextHolder;
|
import org.nl.modules.wql.util.SpringContextHolder;
|
||||||
import org.openscada.opc.lib.da.Server;
|
import org.openscada.opc.lib.da.Server;
|
||||||
|
|
||||||
@@ -45,7 +50,7 @@ import java.util.Map;
|
|||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class ConveyorPressStationDeviceDriver extends AbstractOpcDeviceDriver implements DeviceDriver, ExecutableDeviceDriver, RouteableDeviceDriver, DeviceStageMonitor, StandardRequestMethod {
|
public class ConveyorPressStationDeviceDriver extends AbstractOpcDeviceDriver implements DeviceDriver, ExecutableDeviceDriver, RouteableDeviceDriver, DeviceStageMonitor, StandardRequestMethod, HeartbeatableDeviceDriver {
|
||||||
protected ItemProtocol itemProtocol = new ItemProtocol(this);
|
protected ItemProtocol itemProtocol = new ItemProtocol(this);
|
||||||
|
|
||||||
LuceneExecuteLogService lucene = SpringContextHolder.getBean("luceneExecuteLogServiceImpl");
|
LuceneExecuteLogService lucene = SpringContextHolder.getBean("luceneExecuteLogServiceImpl");
|
||||||
@@ -62,6 +67,12 @@ public class ConveyorPressStationDeviceDriver extends AbstractOpcDeviceDriver im
|
|||||||
|
|
||||||
AcsToWmsService acsToWmsService = SpringContextHolder.getBean("acsToWmsServiceImpl");
|
AcsToWmsService acsToWmsService = SpringContextHolder.getBean("acsToWmsServiceImpl");
|
||||||
|
|
||||||
|
HeartbeatUnifiedService heartbeatUnifiedService = SpringContextHolder.getBean(HeartbeatUnifiedService.class);
|
||||||
|
|
||||||
|
ParamService paramService = SpringContextHolder.getBean(ParamServiceImpl.class);
|
||||||
|
|
||||||
|
String fork_online = paramService.findByCode(AcsConfig.fork_online).getValue();
|
||||||
|
|
||||||
String device_code;
|
String device_code;
|
||||||
int mode = 0;
|
int mode = 0;
|
||||||
int error = 0;
|
int error = 0;
|
||||||
@@ -435,7 +446,7 @@ public class ConveyorPressStationDeviceDriver extends AbstractOpcDeviceDriver im
|
|||||||
jo.put("weight", weight);
|
jo.put("weight", weight);
|
||||||
jo.put("barcode", barcode);
|
jo.put("barcode", barcode);
|
||||||
jo.put("isError", iserror);
|
jo.put("isError", iserror);
|
||||||
jo.put("isOnline", isonline);
|
jo.put("isOnline", isOnline());
|
||||||
jo.put("hasGoods", hasGoods);
|
jo.put("hasGoods", hasGoods);
|
||||||
jo.put("message", message);
|
jo.put("message", message);
|
||||||
return jo;
|
return jo;
|
||||||
@@ -808,4 +819,52 @@ public class ConveyorPressStationDeviceDriver extends AbstractOpcDeviceDriver im
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void checkHeartbeat() {
|
||||||
|
Integer heartbeat_temp = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
heartbeat_temp = this.itemProtocol.getHeartbeat();
|
||||||
|
} catch (Exception var3) {
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ObjectUtl.isEquals(this.heartbeat_tag, heartbeat_temp)) {
|
||||||
|
if (heartbeat_temp != null && this.heartbeat_tag != null) {
|
||||||
|
System.out.println("check heartbeaet!");
|
||||||
|
HeartbeatEvent event = new HeartbeatEvent();
|
||||||
|
event.setResource_code(this.getDeviceCode());
|
||||||
|
event.setResource_name(this.getDevice().getDevice_name());
|
||||||
|
// heartbeatUnifiedService.onlineChecker(event);
|
||||||
|
// DeviceHeartbeatEvent event = new DeviceHeartbeatEvent();
|
||||||
|
// event.setResource_code(this.getDeviceCode());
|
||||||
|
// if (this.getDevice() != null) {
|
||||||
|
// event.setResource_name(this.getDevice().getName());
|
||||||
|
// }
|
||||||
|
// ApplicationEventPublisher.trigger(event);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
this.heartbeat_tag = heartbeat_temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isOnline() {
|
||||||
|
// long begin = System.currentTimeMillis();
|
||||||
|
if (StrUtil.equals(paramService.findByCode(AcsConfig.fork_online).getValue(),"1")) {
|
||||||
|
// long end = System.currentTimeMillis();
|
||||||
|
// long duration = end - begin;
|
||||||
|
// System.out.println("设备:"+device_code+",耗时:"+ duration);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
HeartbeatManageDto heartbeat = heartbeatUnifiedService.findByResourceCode(this.getDeviceCode());
|
||||||
|
// long end = System.currentTimeMillis();
|
||||||
|
// long duration = end - begin;
|
||||||
|
// System.out.println("设备:"+device_code+",耗时:"+ duration);
|
||||||
|
return heartbeat != null && ObjectUtl.isEquals(heartbeat.getStatus(), HeartbeatType.online);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,92 @@
|
|||||||
|
package org.nl.acs.heartbeat;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.nl.acs.auto.run.AbstractAutoRunnable;
|
||||||
|
import org.nl.acs.auto.run.SystemConfig;
|
||||||
|
import org.nl.acs.device_driver.HeartbeatableDeviceDriver;
|
||||||
|
import org.nl.acs.opc.*;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class DeviceHeartbeatExecuteAutoRun extends AbstractAutoRunnable {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
DeviceAppService deviceAppService;
|
||||||
|
int initial_thread = 2;
|
||||||
|
int max_thread = 10;
|
||||||
|
int cache_thread = 5;
|
||||||
|
int loop_time_millions = 300;
|
||||||
|
ExecutorService executorService;
|
||||||
|
Map<String, BlockedRunable> runs;
|
||||||
|
|
||||||
|
public DeviceHeartbeatExecuteAutoRun() {
|
||||||
|
this.executorService = ThreadPoolUtl.newIncreasedBlockedThreadPool(this.initial_thread, this.max_thread, this.cache_thread);
|
||||||
|
this.runs = new LinkedHashMap();
|
||||||
|
this.runs = Collections.synchronizedMap(this.runs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCode() {
|
||||||
|
return DeviceHeartbeatExecuteAutoRun.class.getSimpleName();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return "设备在线监听";
|
||||||
|
}
|
||||||
|
|
||||||
|
public void autoRun() {
|
||||||
|
while(true) {
|
||||||
|
ThreadUtl.sleep((long)this.loop_time_millions);
|
||||||
|
if (SystemConfig.heartbeat_no_use) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(!DeviceOpcSynchronizeAutoRun.isRun){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<HeartbeatableDeviceDriver> deviceDrivers = this.deviceAppService.findDeviceDriver(HeartbeatableDeviceDriver.class);
|
||||||
|
Iterator var2 = deviceDrivers.iterator();
|
||||||
|
|
||||||
|
while(var2.hasNext()) {
|
||||||
|
final HeartbeatableDeviceDriver deviceDriver = (HeartbeatableDeviceDriver)var2.next();
|
||||||
|
if (deviceDriver.getDevice().getIs_config() != null && deviceDriver.getDevice().getIs_config() && !this.runs.keySet().contains(deviceDriver.getDeviceCode())) {
|
||||||
|
BlockedRunable runable = new BlockedRunable() {
|
||||||
|
public void subRun() {
|
||||||
|
deviceDriver.checkHeartbeat();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCode() {
|
||||||
|
return deviceDriver.getDeviceCode();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if (!this.runs.keySet().contains(deviceDriver.getDeviceCode())) {
|
||||||
|
this.runs.put(deviceDriver.getDeviceCode(), runable);
|
||||||
|
}
|
||||||
|
|
||||||
|
runable.setIndex(this.runs);
|
||||||
|
this.executorService.submit(runable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void after() {
|
||||||
|
this.executorService.shutdownNow();
|
||||||
|
this.executorService = ThreadPoolUtl.newIncreasedBlockedThreadPool(this.initial_thread, this.max_thread, this.cache_thread);
|
||||||
|
this.runs = new LinkedHashMap();
|
||||||
|
this.runs = Collections.synchronizedMap(this.runs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExecutorService getExecutorService() {
|
||||||
|
return this.executorService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, BlockedRunable> getRuns() {
|
||||||
|
return this.runs;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package org.nl.acs.heartbeat;
|
||||||
|
|
||||||
|
public class HeartbeatConfig {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 最大心跳时常
|
||||||
|
*/
|
||||||
|
public static Integer max_alive_time_millions = 1000 * 30;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
package org.nl.acs.heartbeat;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.nl.acs.auto.run.AbstractAutoRunnable;
|
||||||
|
import org.nl.acs.auto.run.AutoRunService;
|
||||||
|
import org.nl.acs.heartbeat.service.HeartbeatUnifiedService;
|
||||||
|
import org.nl.acs.heartbeat.service_impl.HeartbeatUnifiedServiceimpl;
|
||||||
|
import org.nl.acs.opc.ThreadUtl;
|
||||||
|
import org.nl.modules.wql.util.SpringContextHolder;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class HeartbeatOfflineCheckerAutoRun extends AbstractAutoRunnable {
|
||||||
|
@Autowired
|
||||||
|
AutoRunService autoRunService;
|
||||||
|
|
||||||
|
private int recordTimeOut = 10000;
|
||||||
|
private Date recordTime;
|
||||||
|
int offline_loop_time_millions = 1000;
|
||||||
|
boolean heartbeat_no_use =false;
|
||||||
|
public HeartbeatOfflineCheckerAutoRun() {
|
||||||
|
this.recordTime = new Date((new Date()).getTime() - (long)this.recordTimeOut);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCode() {
|
||||||
|
return HeartbeatOfflineCheckerAutoRun.class.getSimpleName();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return "在线监听器";
|
||||||
|
}
|
||||||
|
|
||||||
|
public void autoRun() {
|
||||||
|
HeartbeatUnifiedService heartbeatUnifiedService = SpringContextHolder.getBean(HeartbeatUnifiedServiceimpl.class);
|
||||||
|
|
||||||
|
for(; !heartbeat_no_use; ThreadUtl.sleep((long)offline_loop_time_millions)) {
|
||||||
|
try {
|
||||||
|
heartbeatUnifiedService.offlineChecker();
|
||||||
|
} catch (Exception var3) {
|
||||||
|
Date date = new Date();
|
||||||
|
if (date.getTime() - this.recordTime.getTime() < (long)this.recordTimeOut) {
|
||||||
|
log.trace("离线事件异常发生时间因为小于{}毫秒,而被无视", this.recordTime);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.recordTime = date;
|
||||||
|
log.warn("", var3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,19 +1,45 @@
|
|||||||
package org.nl.acs.heartbeat.dto;
|
package org.nl.acs.heartbeat.dto;
|
||||||
|
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
import org.nl.acs.heartbeat.enums.HeartbeatType;
|
import org.nl.acs.heartbeat.enums.HeartbeatType;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
@Data
|
||||||
public class HeartbeatManageDto extends Dto {
|
public class HeartbeatManageDto {
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
/**
|
||||||
|
* 资源号
|
||||||
|
*/
|
||||||
private String resource_code;
|
private String resource_code;
|
||||||
|
/**
|
||||||
|
* 资源名
|
||||||
|
*/
|
||||||
private String resource_name;
|
private String resource_name;
|
||||||
|
/**
|
||||||
|
* 状态 在线 离线
|
||||||
|
*/
|
||||||
private HeartbeatType status;
|
private HeartbeatType status;
|
||||||
private long duration;
|
private long duration;
|
||||||
|
/**
|
||||||
|
* 在线时间
|
||||||
|
*/
|
||||||
private Date online_datetime;
|
private Date online_datetime;
|
||||||
|
/**
|
||||||
|
* 离线时间
|
||||||
|
*/
|
||||||
private Date offline_datetime;
|
private Date offline_datetime;
|
||||||
|
/**
|
||||||
|
* 上次接收时间
|
||||||
|
*/
|
||||||
private Date lastreceivetime;
|
private Date lastreceivetime;
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
private String is_active;
|
||||||
|
|
||||||
|
private String create_by;
|
||||||
|
|
||||||
|
private Date create_time;
|
||||||
|
|
||||||
public HeartbeatManageDto() {
|
public HeartbeatManageDto() {
|
||||||
}
|
}
|
||||||
@@ -25,6 +51,14 @@ public class HeartbeatManageDto extends Dto {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return this.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String setId(String id) {
|
||||||
|
return this.id;
|
||||||
|
}
|
||||||
|
|
||||||
public String getResource_code() {
|
public String getResource_code() {
|
||||||
return this.resource_code;
|
return this.resource_code;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,15 @@
|
|||||||
package org.nl.acs.heartbeat.service_impl;
|
package org.nl.acs.heartbeat.service_impl;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONArray;
|
||||||
import org.nl.acs.heartbeat.domain.HeartbeatDomain;
|
import org.nl.acs.heartbeat.domain.HeartbeatDomain;
|
||||||
import org.nl.acs.heartbeat.dto.HeartbeatManageDto;
|
import org.nl.acs.heartbeat.dto.HeartbeatManageDto;
|
||||||
import org.nl.acs.heartbeat.service.HeartbeatManageService;
|
import org.nl.acs.heartbeat.service.HeartbeatManageService;
|
||||||
|
import org.nl.modules.wql.core.bean.WQLObject;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
@Service
|
||||||
public class HeartbeatManageServiceimpl implements HeartbeatManageService {
|
public class HeartbeatManageServiceimpl implements HeartbeatManageService {
|
||||||
|
|
||||||
public HeartbeatManageServiceimpl() {
|
public HeartbeatManageServiceimpl() {
|
||||||
@@ -40,7 +43,10 @@ public class HeartbeatManageServiceimpl implements HeartbeatManageService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public List<HeartbeatManageDto> queryAllActive() {
|
public List<HeartbeatManageDto> queryAllActive() {
|
||||||
return null;
|
WQLObject wo = WQLObject.getWQLObject("acs_heartbeat");
|
||||||
|
JSONArray arr = wo.query().getResultJSONArray(0);
|
||||||
|
List<HeartbeatManageDto> list = arr.toJavaList(HeartbeatManageDto.class);
|
||||||
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
public HeartbeatManageDto queryById(UUID id) {
|
public HeartbeatManageDto queryById(UUID id) {
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
package org.nl.acs.heartbeat.service_impl;
|
package org.nl.acs.heartbeat.service_impl;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.hutool.core.util.IdUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import org.nl.acs.auto.initial.ApplicationAutoInitial;
|
import org.nl.acs.auto.initial.ApplicationAutoInitial;
|
||||||
|
import org.nl.acs.heartbeat.HeartbeatConfig;
|
||||||
import org.nl.acs.heartbeat.HeartbeatEvent;
|
import org.nl.acs.heartbeat.HeartbeatEvent;
|
||||||
import org.nl.acs.heartbeat.dto.HeartbeatManageDto;
|
import org.nl.acs.heartbeat.dto.HeartbeatManageDto;
|
||||||
import org.nl.acs.heartbeat.enums.HeartbeatType;
|
import org.nl.acs.heartbeat.enums.HeartbeatType;
|
||||||
@@ -12,42 +14,47 @@ import org.nl.acs.heartbeat.service.HeartbeatManageService;
|
|||||||
import org.nl.acs.heartbeat.service.HeartbeatUnifiedService;
|
import org.nl.acs.heartbeat.service.HeartbeatUnifiedService;
|
||||||
import org.nl.modules.wql.util.SpringContextHolder;
|
import org.nl.modules.wql.util.SpringContextHolder;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.context.ApplicationEventPublisher;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
@Service
|
||||||
public class HeartbeatUnifiedServiceimpl implements HeartbeatUnifiedService, ApplicationAutoInitial {
|
public class HeartbeatUnifiedServiceimpl implements HeartbeatUnifiedService, ApplicationAutoInitial {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ApplicationEventPublisher eventPublisher;
|
||||||
|
|
||||||
private List<HeartbeatManageDto> heartbeats = new ArrayList();
|
private List<HeartbeatManageDto> heartbeats = new ArrayList();
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private HeartbeatManageService heartbeatManageService;
|
private HeartbeatManageService heartbeatManageService;
|
||||||
|
|
||||||
public HeartbeatUnifiedServiceimpl() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void autoInitial() throws Exception {
|
public void autoInitial() throws Exception {
|
||||||
|
|
||||||
heartbeatManageService = SpringContextHolder.getBean("heartbeatManageServiceImpl");
|
|
||||||
|
|
||||||
this.reload();
|
this.reload();
|
||||||
Iterator iterator = this.heartbeats.iterator();
|
// Iterator iterator = this.heartbeats.iterator();
|
||||||
|
//
|
||||||
while (iterator.hasNext()) {
|
// while (iterator.hasNext()) {
|
||||||
HeartbeatManageDto dto = (HeartbeatManageDto) iterator.next();
|
// HeartbeatManageDto dto = (HeartbeatManageDto) iterator.next();
|
||||||
if (dto.getOnline_datetime() == null) {
|
// if (dto.getOnline_datetime() == null) {
|
||||||
dto.setOnline_datetime(new Date());
|
// dto.setOnline_datetime(new Date());
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
if (dto.getLastreceivetime() == null) {
|
// if (dto.getLastreceivetime() == null) {
|
||||||
dto.setLastreceivetime(new Date());
|
// dto.setLastreceivetime(new Date());
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
dto.setOffline_datetime(new Date());
|
// dto.setOffline_datetime(new Date());
|
||||||
dto.calculateDuration();
|
// dto.calculateDuration();
|
||||||
dto.setStatus(HeartbeatType.offline);
|
// dto.setStatus(HeartbeatType.offline);
|
||||||
this.heartbeatManageService.saveById(dto);
|
// dto.setId(IdUtil.simpleUUID());
|
||||||
iterator.remove();
|
// dto.setIs_active("1");
|
||||||
}
|
// dto.setCreate_by(dto.getResource_code());
|
||||||
|
// this.heartbeatManageService.saveById(dto);
|
||||||
|
// iterator.remove();
|
||||||
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,7 +75,11 @@ public class HeartbeatUnifiedServiceimpl implements HeartbeatUnifiedService, App
|
|||||||
if (StrUtil.equals(dto.getResource_code(), heartbeatEvent.getResource_code())) {
|
if (StrUtil.equals(dto.getResource_code(), heartbeatEvent.getResource_code())) {
|
||||||
dto.setLastreceivetime(new Date());
|
dto.setLastreceivetime(new Date());
|
||||||
dto.calculateDuration();
|
dto.calculateDuration();
|
||||||
isonline = true;
|
if(ObjectUtil.equals(dto.getStatus(),HeartbeatType.online)){
|
||||||
|
isonline = true;
|
||||||
|
} else {
|
||||||
|
this.heartbeats.remove(dto);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,7 +89,13 @@ public class HeartbeatUnifiedServiceimpl implements HeartbeatUnifiedService, App
|
|||||||
heartbeatManageDto.setResource_name(heartbeatEvent.getResource_name());
|
heartbeatManageDto.setResource_name(heartbeatEvent.getResource_name());
|
||||||
heartbeatManageDto.setOnline_datetime(new Date());
|
heartbeatManageDto.setOnline_datetime(new Date());
|
||||||
heartbeatManageDto.setLastreceivetime(new Date());
|
heartbeatManageDto.setLastreceivetime(new Date());
|
||||||
|
heartbeatManageDto.setCreate_time(new Date());
|
||||||
heartbeatManageDto.setStatus(HeartbeatType.online);
|
heartbeatManageDto.setStatus(HeartbeatType.online);
|
||||||
|
heartbeatManageDto.setId(IdUtil.simpleUUID());
|
||||||
|
heartbeatManageDto.setIs_active("1");
|
||||||
|
heartbeatManageDto.setCreate_by(heartbeatEvent.getResource_code());
|
||||||
|
// this.heartbeatManageService.saveById(heartbeatManageDto);
|
||||||
|
this.heartbeats.add(heartbeatManageDto);
|
||||||
// HeartbeatOnlineEvent heartbeatOnlineEvent = new HeartbeatOnlineEvent();
|
// HeartbeatOnlineEvent heartbeatOnlineEvent = new HeartbeatOnlineEvent();
|
||||||
// heartbeatOnlineEvent.setHeartbeatManageDto(heartbeatManageDto);
|
// heartbeatOnlineEvent.setHeartbeatManageDto(heartbeatManageDto);
|
||||||
//ApplicationEventPublisher.trigger(heartbeatOnlineEvent);
|
//ApplicationEventPublisher.trigger(heartbeatOnlineEvent);
|
||||||
@@ -113,13 +130,19 @@ public class HeartbeatUnifiedServiceimpl implements HeartbeatUnifiedService, App
|
|||||||
long time = (new Date()).getTime() - last_time;
|
long time = (new Date()).getTime() - last_time;
|
||||||
if (time > (long) 500) {
|
if (time > (long) 500) {
|
||||||
|
|
||||||
// if (time > (long)HeartbeatConfig.max_alive_time_millions) {
|
if (time > (long) HeartbeatConfig.max_alive_time_millions) {
|
||||||
dto.setOffline_datetime(new Date());
|
if(!ObjectUtil.equal(dto.getStatus(),HeartbeatType.offline)){
|
||||||
dto.setStatus(HeartbeatType.offline);
|
this.heartbeats.remove(dto);
|
||||||
HeartbeatOfflineEvent heartbeatOfflineEvent = new HeartbeatOfflineEvent();
|
dto.setOffline_datetime(new Date());
|
||||||
heartbeatOfflineEvent.setHeartbeatManageDto(dto);
|
dto.setStatus(HeartbeatType.offline);
|
||||||
//ApplicationEventPublisher.trigger(heartbeatOfflineEvent);
|
this.heartbeats.add(dto);
|
||||||
//log.trace("编号:{},名称:{}, 该资源已离线", dto.getResource_code(), dto.getResource_name());
|
}
|
||||||
|
// HeartbeatOfflineEvent heartbeatOfflineEvent = new HeartbeatOfflineEvent();
|
||||||
|
// heartbeatOfflineEvent.setHeartbeatManageDto(dto);
|
||||||
|
// eventPublisher.publishEvent(heartbeatOfflineEvent);
|
||||||
|
// ApplicationEventPublisher.trigger(heartbeatOfflineEvent);
|
||||||
|
//log.trace("编号:{},名称:{}, 该资源已离线", dto.getResource_code(), dto.getResource_name());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package org.nl.acs.opc;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.concurrent.RejectedExecutionHandler;
|
||||||
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
|
|
||||||
|
public class BlockedThreadPoolPolicy implements RejectedExecutionHandler {
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(BlockedThreadPoolPolicy.class);
|
||||||
|
|
||||||
|
public BlockedThreadPoolPolicy() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
|
||||||
|
if (!e.isShutdown()) {
|
||||||
|
try {
|
||||||
|
e.getQueue().put(r);
|
||||||
|
} catch (InterruptedException var4) {
|
||||||
|
log.debug("", var4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -43,7 +43,7 @@ public class DeviceManageDto {
|
|||||||
private String opc_server_code;
|
private String opc_server_code;
|
||||||
private String opc_plc_id;
|
private String opc_plc_id;
|
||||||
private String opc_plc_code;
|
private String opc_plc_code;
|
||||||
private Boolean is_configed;
|
private Boolean is_config;
|
||||||
private Boolean is_exist;
|
private Boolean is_exist;
|
||||||
private Boolean is_entrance;
|
private Boolean is_entrance;
|
||||||
/* 粉桶号 */
|
/* 粉桶号 */
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package org.nl.acs.opc;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
public class IncreasedBlokdedThreadPoolPolicy implements IncreasedRejectedExecutionHandler {
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(IncreasedBlokdedThreadPoolPolicy.class);
|
||||||
|
|
||||||
|
public IncreasedBlokdedThreadPoolPolicy() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void rejectedExecution(Runnable r, IncreasedThreadPoolExecutor e) {
|
||||||
|
if (!e.isShutdown()) {
|
||||||
|
try {
|
||||||
|
e.getQueue().put(r);
|
||||||
|
} catch (InterruptedException var4) {
|
||||||
|
log.debug("", var4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package org.nl.acs.opc;
|
||||||
|
|
||||||
|
public interface IncreasedRejectedExecutionHandler {
|
||||||
|
void rejectedExecution(Runnable var1, IncreasedThreadPoolExecutor var2);
|
||||||
|
}
|
||||||
@@ -0,0 +1,943 @@
|
|||||||
|
package org.nl.acs.opc;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.concurrent.*;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
|
||||||
|
import java.util.concurrent.locks.Condition;
|
||||||
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
|
||||||
|
public class IncreasedThreadPoolExecutor extends AbstractExecutorService {
|
||||||
|
private final AtomicInteger ctl;
|
||||||
|
private static final int COUNT_BITS = 29;
|
||||||
|
private static final int CAPACITY = 536870911;
|
||||||
|
private static final int RUNNING = -536870912;
|
||||||
|
private static final int SHUTDOWN = 0;
|
||||||
|
private static final int STOP = 536870912;
|
||||||
|
private static final int TIDYING = 1073741824;
|
||||||
|
private static final int TERMINATED = 1610612736;
|
||||||
|
private final BlockingQueue<Runnable> workQueue;
|
||||||
|
private final ReentrantLock mainLock;
|
||||||
|
private final HashSet<Worker> workers;
|
||||||
|
private final Condition termination;
|
||||||
|
private int largestPoolSize;
|
||||||
|
private long completedTaskCount;
|
||||||
|
private volatile ThreadFactory threadFactory;
|
||||||
|
private volatile IncreasedRejectedExecutionHandler handler;
|
||||||
|
private volatile long keepAliveTime;
|
||||||
|
private volatile boolean allowCoreThreadTimeOut;
|
||||||
|
private volatile int corePoolSize;
|
||||||
|
private volatile int maximumPoolSize;
|
||||||
|
private volatile int multiple;
|
||||||
|
private static final IncreasedRejectedExecutionHandler defaultHandler = new AbortPolicy();
|
||||||
|
private static final RuntimePermission shutdownPerm = new RuntimePermission("modifyThread");
|
||||||
|
private static final boolean ONLY_ONE = true;
|
||||||
|
|
||||||
|
private static int runStateOf(int c) {
|
||||||
|
return c & -536870912;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int workerCountOf(int c) {
|
||||||
|
return c & 536870911;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int ctlOf(int rs, int wc) {
|
||||||
|
return rs | wc;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean runStateLessThan(int c, int s) {
|
||||||
|
return c < s;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean runStateAtLeast(int c, int s) {
|
||||||
|
return c >= s;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isRunning(int c) {
|
||||||
|
return c < 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean compareAndIncrementWorkerCount(int expect) {
|
||||||
|
return this.ctl.compareAndSet(expect, expect + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean compareAndDecrementWorkerCount(int expect) {
|
||||||
|
return this.ctl.compareAndSet(expect, expect - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void decrementWorkerCount() {
|
||||||
|
while(!this.compareAndDecrementWorkerCount(this.ctl.get())) {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void advanceRunState(int targetState) {
|
||||||
|
int c;
|
||||||
|
do {
|
||||||
|
c = this.ctl.get();
|
||||||
|
} while(!runStateAtLeast(c, targetState) && !this.ctl.compareAndSet(c, ctlOf(targetState, workerCountOf(c))));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
final void tryTerminate() {
|
||||||
|
while(true) {
|
||||||
|
int c = this.ctl.get();
|
||||||
|
if (isRunning(c) || runStateAtLeast(c, 1073741824) || runStateOf(c) == 0 && !this.workQueue.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (workerCountOf(c) != 0) {
|
||||||
|
this.interruptIdleWorkers(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReentrantLock mainLock = this.mainLock;
|
||||||
|
mainLock.lock();
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (!this.ctl.compareAndSet(c, ctlOf(1073741824, 0))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.terminated();
|
||||||
|
} finally {
|
||||||
|
this.ctl.set(ctlOf(1610612736, 0));
|
||||||
|
this.termination.signalAll();
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
mainLock.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkShutdownAccess() {
|
||||||
|
SecurityManager security = System.getSecurityManager();
|
||||||
|
if (security != null) {
|
||||||
|
security.checkPermission(shutdownPerm);
|
||||||
|
ReentrantLock mainLock = this.mainLock;
|
||||||
|
mainLock.lock();
|
||||||
|
|
||||||
|
try {
|
||||||
|
Iterator var3 = this.workers.iterator();
|
||||||
|
|
||||||
|
while(var3.hasNext()) {
|
||||||
|
Worker w = (Worker)var3.next();
|
||||||
|
security.checkAccess(w.thread);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
mainLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void interruptWorkers() {
|
||||||
|
ReentrantLock mainLock = this.mainLock;
|
||||||
|
mainLock.lock();
|
||||||
|
|
||||||
|
try {
|
||||||
|
Iterator var2 = this.workers.iterator();
|
||||||
|
|
||||||
|
while(var2.hasNext()) {
|
||||||
|
Worker w = (Worker)var2.next();
|
||||||
|
w.interruptIfStarted();
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
mainLock.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void interruptIdleWorkers(boolean onlyOne) {
|
||||||
|
ReentrantLock mainLock = this.mainLock;
|
||||||
|
mainLock.lock();
|
||||||
|
|
||||||
|
try {
|
||||||
|
Iterator var3 = this.workers.iterator();
|
||||||
|
|
||||||
|
while(var3.hasNext()) {
|
||||||
|
Worker w = (Worker)var3.next();
|
||||||
|
Thread t = w.thread;
|
||||||
|
if (!t.isInterrupted() && w.tryLock()) {
|
||||||
|
try {
|
||||||
|
t.interrupt();
|
||||||
|
} catch (SecurityException var15) {
|
||||||
|
} finally {
|
||||||
|
w.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (onlyOne) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
mainLock.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void interruptIdleWorkers() {
|
||||||
|
this.interruptIdleWorkers(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
final void reject(Runnable command) {
|
||||||
|
this.handler.rejectedExecution(command, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void onShutdown() {
|
||||||
|
}
|
||||||
|
|
||||||
|
final boolean isRunningOrShutdown(boolean shutdownOK) {
|
||||||
|
int rs = runStateOf(this.ctl.get());
|
||||||
|
return rs == -536870912 || rs == 0 && shutdownOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Runnable> drainQueue() {
|
||||||
|
BlockingQueue<Runnable> q = this.workQueue;
|
||||||
|
ArrayList<Runnable> taskList = new ArrayList();
|
||||||
|
q.drainTo(taskList);
|
||||||
|
if (!q.isEmpty()) {
|
||||||
|
Runnable[] var3 = (Runnable[])q.toArray(new Runnable[0]);
|
||||||
|
int var4 = var3.length;
|
||||||
|
|
||||||
|
for(int var5 = 0; var5 < var4; ++var5) {
|
||||||
|
Runnable r = var3[var5];
|
||||||
|
if (q.remove(r)) {
|
||||||
|
taskList.add(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return taskList;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean addWorker(Runnable firstTask, boolean core) {
|
||||||
|
while(true) {
|
||||||
|
int c = this.ctl.get();
|
||||||
|
int rs = runStateOf(c);
|
||||||
|
if (rs >= 0 && (rs != 0 || firstTask != null || this.workQueue.isEmpty())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(true) {
|
||||||
|
int wc = workerCountOf(c);
|
||||||
|
if (wc >= 536870911 || wc >= (core ? this.corePoolSize : this.maximumPoolSize)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.compareAndIncrementWorkerCount(c)) {
|
||||||
|
boolean workerStarted = false;
|
||||||
|
boolean workerAdded = false;
|
||||||
|
Worker w = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
w = new Worker(firstTask);
|
||||||
|
Thread t = w.thread;
|
||||||
|
if (t != null) {
|
||||||
|
ReentrantLock mainLock = this.mainLock;
|
||||||
|
mainLock.lock();
|
||||||
|
|
||||||
|
try {
|
||||||
|
int rs1 = runStateOf(this.ctl.get());
|
||||||
|
if (rs1 < 0 || rs1 == 0 && firstTask == null) {
|
||||||
|
if (t.isAlive()) {
|
||||||
|
throw new IllegalThreadStateException();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.workers.add(w);
|
||||||
|
int s = this.workers.size();
|
||||||
|
if (s > this.largestPoolSize) {
|
||||||
|
this.largestPoolSize = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
workerAdded = true;
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
mainLock.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (workerAdded) {
|
||||||
|
t.start();
|
||||||
|
workerStarted = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (!workerStarted) {
|
||||||
|
this.addWorkerFailed(w);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return workerStarted;
|
||||||
|
}
|
||||||
|
|
||||||
|
c = this.ctl.get();
|
||||||
|
if (runStateOf(c) != rs) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addWorkerFailed(Worker w) {
|
||||||
|
ReentrantLock mainLock = this.mainLock;
|
||||||
|
mainLock.lock();
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (w != null) {
|
||||||
|
this.workers.remove(w);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.decrementWorkerCount();
|
||||||
|
this.tryTerminate();
|
||||||
|
} finally {
|
||||||
|
mainLock.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processWorkerExit(Worker w, boolean completedAbruptly) {
|
||||||
|
if (completedAbruptly) {
|
||||||
|
this.decrementWorkerCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
ReentrantLock mainLock = this.mainLock;
|
||||||
|
mainLock.lock();
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.completedTaskCount += w.completedTasks;
|
||||||
|
this.workers.remove(w);
|
||||||
|
} finally {
|
||||||
|
mainLock.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.tryTerminate();
|
||||||
|
int c = this.ctl.get();
|
||||||
|
if (runStateLessThan(c, 536870912)) {
|
||||||
|
if (!completedAbruptly) {
|
||||||
|
int min = this.allowCoreThreadTimeOut ? 0 : this.corePoolSize;
|
||||||
|
if (min == 0 && !this.workQueue.isEmpty()) {
|
||||||
|
min = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (workerCountOf(c) >= min) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.addWorker((Runnable)null, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private Runnable getTask() {
|
||||||
|
boolean timedOut = false;
|
||||||
|
|
||||||
|
while(true) {
|
||||||
|
int c = this.ctl.get();
|
||||||
|
int rs = runStateOf(c);
|
||||||
|
if (rs >= 0 && (rs >= 536870912 || this.workQueue.isEmpty())) {
|
||||||
|
this.decrementWorkerCount();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wc = workerCountOf(c);
|
||||||
|
boolean timed = this.allowCoreThreadTimeOut || wc > this.corePoolSize;
|
||||||
|
if (wc <= this.maximumPoolSize && (!timed || !timedOut) || wc <= 1 && !this.workQueue.isEmpty()) {
|
||||||
|
try {
|
||||||
|
Runnable r = timed ? (Runnable)this.workQueue.poll(this.keepAliveTime, TimeUnit.NANOSECONDS) : (Runnable)this.workQueue.take();
|
||||||
|
if (r != null) {
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
timedOut = true;
|
||||||
|
} catch (InterruptedException var7) {
|
||||||
|
timedOut = false;
|
||||||
|
}
|
||||||
|
} else if (this.compareAndDecrementWorkerCount(c)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final void runWorker(Worker w) {
|
||||||
|
Thread wt = Thread.currentThread();
|
||||||
|
Runnable task = w.firstTask;
|
||||||
|
w.firstTask = null;
|
||||||
|
w.unlock();
|
||||||
|
boolean completedAbruptly = true;
|
||||||
|
|
||||||
|
try {
|
||||||
|
while(task != null || (task = this.getTask()) != null) {
|
||||||
|
w.lock();
|
||||||
|
if ((runStateAtLeast(this.ctl.get(), 536870912) || Thread.interrupted() && runStateAtLeast(this.ctl.get(), 536870912)) && !wt.isInterrupted()) {
|
||||||
|
wt.interrupt();
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.beforeExecute(wt, task);
|
||||||
|
Throwable thrown = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
task.run();
|
||||||
|
} catch (RuntimeException var28) {
|
||||||
|
thrown = var28;
|
||||||
|
throw var28;
|
||||||
|
} catch (Error var29) {
|
||||||
|
thrown = var29;
|
||||||
|
throw var29;
|
||||||
|
} catch (Throwable var30) {
|
||||||
|
thrown = var30;
|
||||||
|
throw new Error(var30);
|
||||||
|
} finally {
|
||||||
|
this.afterExecute(task, (Throwable)thrown);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
task = null;
|
||||||
|
++w.completedTasks;
|
||||||
|
w.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
completedAbruptly = false;
|
||||||
|
} finally {
|
||||||
|
this.processWorkerExit(w, completedAbruptly);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public IncreasedThreadPoolExecutor(int corePoolSize, int maximumPoolSize, int multiple, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
|
||||||
|
this(corePoolSize, maximumPoolSize, multiple, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IncreasedThreadPoolExecutor(int corePoolSize, int maximumPoolSize, int multiple, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) {
|
||||||
|
this(corePoolSize, maximumPoolSize, multiple, keepAliveTime, unit, workQueue, threadFactory, defaultHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IncreasedThreadPoolExecutor(int corePoolSize, int maximumPoolSize, int multiple, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, IncreasedRejectedExecutionHandler handler) {
|
||||||
|
this(corePoolSize, maximumPoolSize, multiple, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IncreasedThreadPoolExecutor(int corePoolSize, int maximumPoolSize, int multiple, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, IncreasedRejectedExecutionHandler handler) {
|
||||||
|
this.ctl = new AtomicInteger(ctlOf(-536870912, 0));
|
||||||
|
this.mainLock = new ReentrantLock();
|
||||||
|
this.workers = new HashSet();
|
||||||
|
this.termination = this.mainLock.newCondition();
|
||||||
|
if (corePoolSize >= 0 && maximumPoolSize > 0 && maximumPoolSize >= corePoolSize && keepAliveTime >= 0L) {
|
||||||
|
if (workQueue != null && threadFactory != null && handler != null) {
|
||||||
|
this.corePoolSize = corePoolSize;
|
||||||
|
this.maximumPoolSize = maximumPoolSize;
|
||||||
|
this.workQueue = workQueue;
|
||||||
|
this.keepAliveTime = unit.toNanos(keepAliveTime);
|
||||||
|
this.threadFactory = threadFactory;
|
||||||
|
this.handler = handler;
|
||||||
|
this.multiple = multiple;
|
||||||
|
} else {
|
||||||
|
throw new NullPointerException();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void execute(Runnable command) {
|
||||||
|
if (command == null) {
|
||||||
|
throw new NullPointerException();
|
||||||
|
} else {
|
||||||
|
int c = this.ctl.get();
|
||||||
|
if (workerCountOf(c) < this.corePoolSize) {
|
||||||
|
if (this.addWorker(command, true)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
c = this.ctl.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isRunning(c) && this.workQueue.size() < workerCountOf(c) * this.multiple && this.workQueue.offer(command)) {
|
||||||
|
int recheck = this.ctl.get();
|
||||||
|
if (!isRunning(recheck) && this.remove(command)) {
|
||||||
|
this.reject(command);
|
||||||
|
} else if (workerCountOf(recheck) == 0) {
|
||||||
|
this.addWorker((Runnable)null, false);
|
||||||
|
}
|
||||||
|
} else if (!this.addWorker(command, false)) {
|
||||||
|
this.reject(command);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void shutdown() {
|
||||||
|
ReentrantLock mainLock = this.mainLock;
|
||||||
|
mainLock.lock();
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.checkShutdownAccess();
|
||||||
|
this.advanceRunState(0);
|
||||||
|
this.interruptIdleWorkers();
|
||||||
|
this.onShutdown();
|
||||||
|
} finally {
|
||||||
|
mainLock.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.tryTerminate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Runnable> shutdownNow() {
|
||||||
|
ReentrantLock mainLock = this.mainLock;
|
||||||
|
mainLock.lock();
|
||||||
|
|
||||||
|
List tasks;
|
||||||
|
try {
|
||||||
|
this.checkShutdownAccess();
|
||||||
|
this.advanceRunState(536870912);
|
||||||
|
this.interruptWorkers();
|
||||||
|
tasks = this.drainQueue();
|
||||||
|
} finally {
|
||||||
|
mainLock.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.tryTerminate();
|
||||||
|
return tasks;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isShutdown() {
|
||||||
|
return !isRunning(this.ctl.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isTerminating() {
|
||||||
|
int c = this.ctl.get();
|
||||||
|
return !isRunning(c) && runStateLessThan(c, 1610612736);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isTerminated() {
|
||||||
|
return runStateAtLeast(this.ctl.get(), 1610612736);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {
|
||||||
|
long nanos = unit.toNanos(timeout);
|
||||||
|
ReentrantLock mainLock = this.mainLock;
|
||||||
|
mainLock.lock();
|
||||||
|
|
||||||
|
boolean var7;
|
||||||
|
try {
|
||||||
|
while(!runStateAtLeast(this.ctl.get(), 1610612736)) {
|
||||||
|
if (nanos <= 0L) {
|
||||||
|
var7 = false;
|
||||||
|
return var7;
|
||||||
|
}
|
||||||
|
|
||||||
|
nanos = this.termination.awaitNanos(nanos);
|
||||||
|
}
|
||||||
|
|
||||||
|
var7 = true;
|
||||||
|
} finally {
|
||||||
|
mainLock.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
return var7;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void finalize() {
|
||||||
|
this.shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setThreadFactory(ThreadFactory threadFactory) {
|
||||||
|
if (threadFactory == null) {
|
||||||
|
throw new NullPointerException();
|
||||||
|
} else {
|
||||||
|
this.threadFactory = threadFactory;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ThreadFactory getThreadFactory() {
|
||||||
|
return this.threadFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRejectedExecutionHandler(IncreasedRejectedExecutionHandler handler) {
|
||||||
|
if (handler == null) {
|
||||||
|
throw new NullPointerException();
|
||||||
|
} else {
|
||||||
|
this.handler = handler;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public IncreasedRejectedExecutionHandler getRejectedExecutionHandler() {
|
||||||
|
return this.handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCorePoolSize(int corePoolSize) {
|
||||||
|
if (corePoolSize < 0) {
|
||||||
|
throw new IllegalArgumentException();
|
||||||
|
} else {
|
||||||
|
int delta = corePoolSize - this.corePoolSize;
|
||||||
|
this.corePoolSize = corePoolSize;
|
||||||
|
if (workerCountOf(this.ctl.get()) > corePoolSize) {
|
||||||
|
this.interruptIdleWorkers();
|
||||||
|
} else if (delta > 0) {
|
||||||
|
int k = Math.min(delta, this.workQueue.size());
|
||||||
|
|
||||||
|
while(k-- > 0 && this.addWorker((Runnable)null, true) && !this.workQueue.isEmpty()) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getCorePoolSize() {
|
||||||
|
return this.corePoolSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean prestartCoreThread() {
|
||||||
|
return workerCountOf(this.ctl.get()) < this.corePoolSize && this.addWorker((Runnable)null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ensurePrestart() {
|
||||||
|
int wc = workerCountOf(this.ctl.get());
|
||||||
|
if (wc < this.corePoolSize) {
|
||||||
|
this.addWorker((Runnable)null, true);
|
||||||
|
} else if (wc == 0) {
|
||||||
|
this.addWorker((Runnable)null, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public int prestartAllCoreThreads() {
|
||||||
|
int n;
|
||||||
|
for(n = 0; this.addWorker((Runnable)null, true); ++n) {
|
||||||
|
}
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean allowsCoreThreadTimeOut() {
|
||||||
|
return this.allowCoreThreadTimeOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void allowCoreThreadTimeOut(boolean value) {
|
||||||
|
if (value && this.keepAliveTime <= 0L) {
|
||||||
|
throw new IllegalArgumentException("Core threads must have nonzero keep alive times");
|
||||||
|
} else {
|
||||||
|
if (value != this.allowCoreThreadTimeOut) {
|
||||||
|
this.allowCoreThreadTimeOut = value;
|
||||||
|
if (value) {
|
||||||
|
this.interruptIdleWorkers();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMaximumPoolSize(int maximumPoolSize) {
|
||||||
|
if (maximumPoolSize > 0 && maximumPoolSize >= this.corePoolSize) {
|
||||||
|
this.maximumPoolSize = maximumPoolSize;
|
||||||
|
if (workerCountOf(this.ctl.get()) > maximumPoolSize) {
|
||||||
|
this.interruptIdleWorkers();
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getMaximumPoolSize() {
|
||||||
|
return this.maximumPoolSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setKeepAliveTime(long time, TimeUnit unit) {
|
||||||
|
if (time < 0L) {
|
||||||
|
throw new IllegalArgumentException();
|
||||||
|
} else if (time == 0L && this.allowsCoreThreadTimeOut()) {
|
||||||
|
throw new IllegalArgumentException("Core threads must have nonzero keep alive times");
|
||||||
|
} else {
|
||||||
|
long keepAliveTime = unit.toNanos(time);
|
||||||
|
long delta = keepAliveTime - this.keepAliveTime;
|
||||||
|
this.keepAliveTime = keepAliveTime;
|
||||||
|
if (delta < 0L) {
|
||||||
|
this.interruptIdleWorkers();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getKeepAliveTime(TimeUnit unit) {
|
||||||
|
return unit.convert(this.keepAliveTime, TimeUnit.NANOSECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BlockingQueue<Runnable> getQueue() {
|
||||||
|
return this.workQueue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean remove(Runnable task) {
|
||||||
|
boolean removed = this.workQueue.remove(task);
|
||||||
|
this.tryTerminate();
|
||||||
|
return removed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void purge() {
|
||||||
|
BlockingQueue<Runnable> q = this.workQueue;
|
||||||
|
|
||||||
|
try {
|
||||||
|
Iterator<Runnable> it = q.iterator();
|
||||||
|
|
||||||
|
while(it.hasNext()) {
|
||||||
|
Runnable r = (Runnable)it.next();
|
||||||
|
if (r instanceof Future && ((Future)r).isCancelled()) {
|
||||||
|
it.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (ConcurrentModificationException var7) {
|
||||||
|
Object[] var3 = q.toArray();
|
||||||
|
int var4 = var3.length;
|
||||||
|
|
||||||
|
for(int var5 = 0; var5 < var4; ++var5) {
|
||||||
|
Object r = var3[var5];
|
||||||
|
if (r instanceof Future && ((Future)r).isCancelled()) {
|
||||||
|
q.remove(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.tryTerminate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPoolSize() {
|
||||||
|
ReentrantLock mainLock = this.mainLock;
|
||||||
|
mainLock.lock();
|
||||||
|
|
||||||
|
int var2;
|
||||||
|
try {
|
||||||
|
var2 = runStateAtLeast(this.ctl.get(), 1073741824) ? 0 : this.workers.size();
|
||||||
|
} finally {
|
||||||
|
mainLock.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
return var2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getActiveCount() {
|
||||||
|
ReentrantLock mainLock = this.mainLock;
|
||||||
|
mainLock.lock();
|
||||||
|
|
||||||
|
try {
|
||||||
|
int n = 0;
|
||||||
|
Iterator var3 = this.workers.iterator();
|
||||||
|
|
||||||
|
while(var3.hasNext()) {
|
||||||
|
Worker w = (Worker)var3.next();
|
||||||
|
if (w.isLocked()) {
|
||||||
|
++n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int var8 = n;
|
||||||
|
return var8;
|
||||||
|
} finally {
|
||||||
|
mainLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getLargestPoolSize() {
|
||||||
|
ReentrantLock mainLock = this.mainLock;
|
||||||
|
mainLock.lock();
|
||||||
|
|
||||||
|
int var2;
|
||||||
|
try {
|
||||||
|
var2 = this.largestPoolSize;
|
||||||
|
} finally {
|
||||||
|
mainLock.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
return var2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getTaskCount() {
|
||||||
|
ReentrantLock mainLock = this.mainLock;
|
||||||
|
mainLock.lock();
|
||||||
|
|
||||||
|
try {
|
||||||
|
long n = this.completedTaskCount;
|
||||||
|
Iterator var4 = this.workers.iterator();
|
||||||
|
|
||||||
|
while(var4.hasNext()) {
|
||||||
|
Worker w = (Worker)var4.next();
|
||||||
|
n += w.completedTasks;
|
||||||
|
if (w.isLocked()) {
|
||||||
|
++n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
long var9 = n + (long)this.workQueue.size();
|
||||||
|
return var9;
|
||||||
|
} finally {
|
||||||
|
mainLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getCompletedTaskCount() {
|
||||||
|
ReentrantLock mainLock = this.mainLock;
|
||||||
|
mainLock.lock();
|
||||||
|
|
||||||
|
try {
|
||||||
|
long n = this.completedTaskCount;
|
||||||
|
|
||||||
|
Worker w;
|
||||||
|
for(Iterator var4 = this.workers.iterator(); var4.hasNext(); n += w.completedTasks) {
|
||||||
|
w = (Worker)var4.next();
|
||||||
|
}
|
||||||
|
|
||||||
|
long var9 = n;
|
||||||
|
return var9;
|
||||||
|
} finally {
|
||||||
|
mainLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
ReentrantLock mainLock = this.mainLock;
|
||||||
|
mainLock.lock();
|
||||||
|
|
||||||
|
long ncompleted;
|
||||||
|
int nworkers;
|
||||||
|
int nactive;
|
||||||
|
try {
|
||||||
|
ncompleted = this.completedTaskCount;
|
||||||
|
nactive = 0;
|
||||||
|
nworkers = this.workers.size();
|
||||||
|
Iterator var6 = this.workers.iterator();
|
||||||
|
|
||||||
|
while(var6.hasNext()) {
|
||||||
|
Worker w = (Worker)var6.next();
|
||||||
|
ncompleted += w.completedTasks;
|
||||||
|
if (w.isLocked()) {
|
||||||
|
++nactive;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
mainLock.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
int c = this.ctl.get();
|
||||||
|
String rs = runStateLessThan(c, 0) ? "Running" : (runStateAtLeast(c, 1610612736) ? "Terminated" : "Shutting down");
|
||||||
|
return super.toString() + "[" + rs + ", pool size = " + nworkers + ", active threads = " + nactive + ", queued tasks = " + this.workQueue.size() + ", completed tasks = " + ncompleted + "]";
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void beforeExecute(Thread t, Runnable r) {
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void afterExecute(Runnable r, Throwable t) {
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void terminated() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class DiscardOldestPolicy implements IncreasedRejectedExecutionHandler {
|
||||||
|
public DiscardOldestPolicy() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void rejectedExecution(Runnable r, IncreasedThreadPoolExecutor e) {
|
||||||
|
if (!e.isShutdown()) {
|
||||||
|
e.getQueue().poll();
|
||||||
|
e.execute(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class DiscardPolicy implements IncreasedRejectedExecutionHandler {
|
||||||
|
public DiscardPolicy() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void rejectedExecution(Runnable r, IncreasedThreadPoolExecutor e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class AbortPolicy implements IncreasedRejectedExecutionHandler {
|
||||||
|
public AbortPolicy() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void rejectedExecution(Runnable r, IncreasedThreadPoolExecutor e) {
|
||||||
|
throw new RejectedExecutionException("Task " + r.toString() + " rejected from " + e.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class CallerRunsPolicy implements IncreasedRejectedExecutionHandler {
|
||||||
|
public CallerRunsPolicy() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void rejectedExecution(Runnable r, IncreasedThreadPoolExecutor e) {
|
||||||
|
if (!e.isShutdown()) {
|
||||||
|
r.run();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final class Worker extends AbstractQueuedSynchronizer implements Runnable {
|
||||||
|
private static final long serialVersionUID = 6138294804551838833L;
|
||||||
|
final Thread thread;
|
||||||
|
Runnable firstTask;
|
||||||
|
volatile long completedTasks;
|
||||||
|
|
||||||
|
Worker(Runnable firstTask) {
|
||||||
|
this.setState(-1);
|
||||||
|
this.firstTask = firstTask;
|
||||||
|
this.thread = IncreasedThreadPoolExecutor.this.getThreadFactory().newThread(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
IncreasedThreadPoolExecutor.this.runWorker(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean isHeldExclusively() {
|
||||||
|
return this.getState() != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean tryAcquire(int unused) {
|
||||||
|
if (this.compareAndSetState(0, 1)) {
|
||||||
|
this.setExclusiveOwnerThread(Thread.currentThread());
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean tryRelease(int unused) {
|
||||||
|
this.setExclusiveOwnerThread((Thread)null);
|
||||||
|
this.setState(0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void lock() {
|
||||||
|
this.acquire(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean tryLock() {
|
||||||
|
return this.tryAcquire(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unlock() {
|
||||||
|
this.release(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isLocked() {
|
||||||
|
return this.isHeldExclusively();
|
||||||
|
}
|
||||||
|
|
||||||
|
void interruptIfStarted() {
|
||||||
|
Thread t;
|
||||||
|
if (this.getState() >= 0 && (t = this.thread) != null && !t.isInterrupted()) {
|
||||||
|
try {
|
||||||
|
t.interrupt();
|
||||||
|
} catch (SecurityException var3) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
package org.nl.acs.opc;
|
||||||
|
|
||||||
|
import java.util.concurrent.*;
|
||||||
|
|
||||||
|
public class ThreadPoolUtl {
|
||||||
|
private static ExecutorService eventExecutorService = null;
|
||||||
|
private static ExecutorService cycleExecutorService = null;
|
||||||
|
|
||||||
|
private ThreadPoolUtl() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ExecutorService getEventSingleInstanse() {
|
||||||
|
if (eventExecutorService == null) {
|
||||||
|
Class var0 = ThreadPoolUtl.class;
|
||||||
|
synchronized(ThreadPoolUtl.class) {
|
||||||
|
if (eventExecutorService == null) {
|
||||||
|
eventExecutorService = newIncreasedBlockedThreadPool(50, 200, 5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return eventExecutorService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ExecutorService getCycleSingleInstanse() {
|
||||||
|
if (cycleExecutorService == null) {
|
||||||
|
Class var0 = ThreadPoolUtl.class;
|
||||||
|
synchronized(ThreadPoolUtl.class) {
|
||||||
|
if (cycleExecutorService == null) {
|
||||||
|
cycleExecutorService = newIncreasedBlockedThreadPool(5, 200, 5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return cycleExecutorService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ExecutorService newIncreasedThreadPool() {
|
||||||
|
return newIncreasedThreadPool(50, 200, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ExecutorService newIncreasedBlockedThreadPool() {
|
||||||
|
return newIncreasedBlockedThreadPool(50, 200, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ExecutorService newIncreasedThreadPool(int corePoolSize, int maximumPoolSize, int multiple) {
|
||||||
|
return new IncreasedThreadPoolExecutor(corePoolSize, maximumPoolSize, multiple, 1L, TimeUnit.HOURS, new LinkedBlockingDeque(), new IncreasedBlokdedThreadPoolPolicy());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ExecutorService newIncreasedBlockedThreadPool(int corePoolSize, int maximumPoolSize, int multiple) {
|
||||||
|
int queueLength = maximumPoolSize * multiple;
|
||||||
|
return new IncreasedThreadPoolExecutor(corePoolSize, maximumPoolSize, multiple, 1L, TimeUnit.HOURS, new ArrayBlockingQueue(queueLength), new IncreasedBlokdedThreadPoolPolicy());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ExecutorService newBlockedThreadPool() {
|
||||||
|
return newBlockedThreadPool(50, 300, 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ExecutorService newBlockedThreadPool(int coreNum, int maxNum, int cacheNum) {
|
||||||
|
return new ThreadPoolExecutor(coreNum, maxNum, 1L, TimeUnit.HOURS, new ArrayBlockingQueue(cacheNum), new BlockedThreadPoolPolicy());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ExecutorService newCachedThreadPool() {
|
||||||
|
return Executors.newCachedThreadPool();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ExecutorService newFixedThreadPool(int maxNum) {
|
||||||
|
return Executors.newFixedThreadPool(maxNum);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user