本文记录一下不用线程池的情况下,在业务流程中需要独自开启多线程进行处理业务的逻辑,
1.事件请求体 Event
public class Event implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 事件类型
* @see com.tecrun.event.EventTypeEnum
*/
private EventTypeEnum eventType;
/**
* 事件消息体,可以保存相关参数
*/
private Map<String, Object> params;
}
2.事件执行处理器 EventHandle
public interface EventHandle<T> {
/**
* 执行接口
*
* @param event
* @return boolean
*/
T handleEvent(final Event event) throws Exception;
}
3. 事件枚举类型 EventTypeEnum
public enum EventTypeEnum {
BATCH_DEL("BATCH_DEL", "批量删除"),
BATCH_UPDATE("BATCH_UPDATE", "批量修改"),
;
private final String type;
private final String desc;
}
4. 事件执行任务 EventWorker
public class EventWorker<T> implements Callable<T> {
/**
* 事件执行处理器
*/
private EventHandle<T> eventHandle;
/**
* 事件承载体
*/
private Event event;
public EventWorker(Event event, EventHandle<T> eventHandle) {
this.event = event;
this.eventHandle = eventHandle;
}
@Override
public T call() throws Exception {
if (ObjectUtil.isNull(eventHandle)) {
log.warn("eventHandle can not be null");
return null;
}
if (ObjectUtil.isNull(event)) {
log.warn("event can not be null");
return null;
}
T t = null;
try {
long startTime = System.currentTimeMillis();
log.info("{}.call.eventHandle.handleEvent start, param:{}", this.getClass(), JSONObject.toJSONString(event));
//执行事件
t = eventHandle.handleEvent(event);
log.info("{}.call.eventHandle.handleEvent end, result:{}, costTime:{}", this.getClass(), JSONObject.toJSONString(t), System.currentTimeMillis() - startTime);
} catch (Exception e) {
log.error("{}.call eventHandle.handleEvent is error", this.getClass(), e);
}
return t;
}
}
5. 事件执行
@Component
public class BatchEventHandler implements EventHandle< ArrayList<HashMap>> {
@Override
public ArrayList<HashMap> handleEvent(Event event) throws Exception {
log.info("{}.CheckBatchEventHandler start, event:{}", getClass(), JSONObject.toJSONString(event));
ArrayList<HashMap> fileIdList = new ArrayList<>();
Map<String, Object> params = event.getParams();
Info Info = (Info) params.get("Info");传入事件执行的对象
处理逻辑..........
return fileIdList;
}
6.多线程事件调用
@Resource
BatchEventHandler BatchEventHandler
.........
long startTime = System.currentTimeMillis();
List<EventWorker< ArrayList<HashMap>>> handlerList = new ArrayList<>(Infos.size());Infos要处理的list数据
for (Info Info : Infos) {
Event event = new Event();
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("Info", Info );传入事件执行的要处理的对象,按key取
event.setParams(paramMap);
EventWorker< ArrayList<HashMap>> RtEventWorker = new EventWorker<>(event, BatchEventHandler );
handlerList.add(RtEventWorker );
}
MultipartTaskComponent< ArrayList<HashMap>> component = new MultipartTaskComponent<>();
component.setParallelNum(10); ///开启几个线程进行
component.setShutdownNow(true);
component.setTimeOut(60L);
component.setTimeUnit(TimeUnit.SECONDS);
component.setHandleList(handlerList);
log.info("{}.checkBatchEventHandler.handle#[批处理开始执行]", getClass());
List<ArrayList<HashMap>> handle = component.handle(); //处理结果返回获取,,没有结果,或者对结果不关心的不处理
for (ArrayList<HashMap> list:handle){
for (HashMap map:list){
fileIdList.add(map);
}
}
log.info("{}.checkBatchEventHandler.handle#[批处理执行结束],costTime:{}", getClass(), System.currentTimeMillis() - startTime);