多线程事件小记

本文记录一下不用线程池的情况下,在业务流程中需要独自开启多线程进行处理业务的逻辑,


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);
            

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值