package tech.powerjob.server.core.alarm; import com.google.common.collect.Lists; import com.google.common.collect.Queues; import com.google.common.util.concurrent.ThreadFactoryBuilder; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import tech.powerjob.server.extension.alarm.Alarm; import tech.powerjob.server.extension.alarm.AlarmTarget; import tech.powerjob.server.extension.alarm.Alarmable; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * 报警服务 * * @author tjq * @since 2020/4/19 */ @Slf4j @Component public class AlarmCenter { private final ExecutorService POOL; private final List BEANS = Lists.newLinkedList(); public AlarmCenter(List alarmables) { int cores = Runtime.getRuntime().availableProcessors(); ThreadFactory factory = new ThreadFactoryBuilder().setNameFormat("AlarmPool-%d").build(); POOL = new ThreadPoolExecutor(cores, cores, 5, TimeUnit.MINUTES, Queues.newLinkedBlockingQueue(), factory); alarmables.forEach(bean -> { BEANS.add(bean); log.info("[AlarmCenter] bean(className={},obj={}) register to AlarmCenter successfully!", bean.getClass().getName(), bean); }); } public void alarmFailed(Alarm alarm, List alarmTargets) { POOL.execute(() -> BEANS.forEach(alarmable -> { try { alarmable.onFailed(alarm, alarmTargets); }catch (Exception e) { log.warn("[AlarmCenter] alarm failed.", e); } })); } }