场景一:xxl-job 报警

  1. 方法调用入口:

利用 applicationContext.getBeansOfType 动态加载类 - 图1

  1. 接口:

利用 applicationContext.getBeansOfType 动态加载类 - 图2

  1. 具体报警规则实现类:

利用 applicationContext.getBeansOfType 动态加载类 - 图3

以上类的简要功能是 xxljob中失败任务报警处理机制

贴出总结:

  • JobAlarmer 类中容器初始化时从 spring 上下文中获取 JobAlarm 类的对象 list:jobAlarmList,(主要代码:applicationContext.getBeansOfType(JobAlarm.class);
  • alarm方法中遍历 jobAlarmList 调用重写的 doAlarm 方法(报警具体实现),当需要触发报警时,只需要调用 JobAlarmer 类的 alarm 方法,即可自动触发所有的报警实现,因xxl默认只有邮箱报警,所本文代码只贴出了邮箱报警 EmailJobAlarm 类的代码
  • 此方式的好处是当需要其他报警方式:如短信报警,只需要添加类实现 JobAlarm 接口,使用 @Component注解,并重写方法 **doAlarm** 即可,便会在 JobAlarm 类的 alarm 方法 jobAlarmList 中触发调用子类实现的短信报警方法
  • 可拓展性强,便于维护。

    场景二:监听 binlog 日志多队列消费时

    ```java @Slf4j @Service @DependsOn(“springContextHolder”) public class ReceiveBinlogMessageService implements IReceiveBinlogMessage, InitializingBean { private int coreThreadNum = 20; private ExecutorService pool = Executors.newFixedThreadPool(coreThreadNum); private Map instances = null; // … public boolean receive(Message message) throws Exception {

    1. final Collection<IConsumerService> consumerServices = instances.values();
    2. // 循环遍历实现类进行异步消费
    3. for (IConsumerService consumerService : consumerServices) {
    4. AsyncSendMessageTask sendMessageTask = new AsyncSendMessageTask(consumerService, tableDatas, multiTaskProgress, failTaskCount);
    5. pool.execute(sendMessageTask);
    6. }

    }

} // 从上下文中获取实现了此消费接口的实现类 @Override public void afterPropertiesSet() throws Exception { this.instances = SpringContextHolder.getApplicationContext().getBeansOfType(IConsumerService.class); }

  1. 消费接口:
  2. ```java
  3. /**
  4. * 消息发送service
  5. */
  6. public interface IConsumerService {
  7. /**
  8. * 发送消息接口
  9. *
  10. * @param tableDatas 数据集
  11. * @return 消息发送返回状态
  12. * @throws Exception
  13. */
  14. public boolean sendMessageData(final List<TableData> tableDatas) throws Exception;
  15. }

对应两个实现类
image.png