Spring-Boot中如何使用多线程处理任务方法

  

看到这个标题,相信不少人会感到疑惑,回忆你们自己的场景会发现,在春天的项目中很少有使用多线程处理任务的,没的错,大多数时候我们都是使用Spring MVC开发的网络项目,默认的控制器,服务,刀组件的作用域都是单实例,无状态,然后被并发多线程调用,那么如果我想使用多线程处理任务,该如何做呢?

  

比如如下场景:

  

使用spring-boot开发一个监控的项目,每个被监控的业务(可能是一个数据库表或者是一个pid进程)都会单独运行在一个线程中,有自己配置的参数,总结起来就是:

  

(1)多实例(多个业务,每个业务相互隔离互不影响)

  

(2)有状态(每个业务,都有自己的配置参数)

  

如果是非spring-boot项目,实现起来可能会相对简单点,直接新多线程启动,然后传入不同的参数类即可,在春天的项目中,由于Bean对象是春天容器管理的,你直接新出来的对象是没法使用的,就算你能新成功,但是豆里面依赖的其他组件比如刀,是没法初始化的,因为你饶过了春天,默认的春天初始化一个类时,其相关依赖的组件都会被初始化,但是自己新出来的类,是不具备这种功能的,所以我们需要通过春天来获取我们自己的线程类,那么如何通过春天获取类实例呢,需要定义如下的一个类来获取SpringContext上下文:
  

     /* *   *由管理员>   @ component (“mTask”)   @Scope(“原型”)   公共类MoniotrTask扩展线程{      最后静态日志记录器=LoggerFactory.getLogger (MoniotrTask.class);//参数封装   私人监测监控;      公共空间setMonitor(监视器监视){   这一点。监控=监控;   }      @ resource (name=" greaterDaoImpl ")   私人RuleDao greaterDaoImpl;      @Override   公共空间run () {   logger.info(“线程:“+ Thread.currentThread () . getname() +“运行中.....”);   }      }      之前      

写个测试例子,测试下使用SpringContext获取Bean,查看是否是多实例:
  

     /* *   *由管理员>   @ component   公开课StartTask {      最后静态日志记录器=LoggerFactory.getLogger (StartTask.class);//定义在构造方法完毕后,执行这个初始化方法   @PostConstruct   公共空间init () {      最后List=ParseRuleUtils.parseRules列表();   logger.info(“监控任务的总任务数:{}”,list.size ());   for (int i=0; i< list.size();我+ +){   MoniotrTask MoniotrTask=ApplicationContextProvider。getBean (“mTask MoniotrTask.class);   moniotrTask.setMonitor (list.get (i));   moniotrTask.start ();   logger.info(“第{}个监控任务:{}启动!”,(i + 1), list.get (i) . getname ());   }   }   }      

最后备忘下logback。xml,里面可以配置相对和绝对的日志文件路径:
  

        & lt; !——Logback配置。见http://logback.qos.ch/manual/index。html——比;   & lt;配置扫描=" true " scanPeriod=?0秒”比;   & lt; !——简单的文件输出比;   & lt; appender name="文件"类=癱h.qos.logback.core.rolling.RollingFileAppender”比;   & lt; !——& lt; appender name=氨曜际涑觥眂lass=癱h.qos.logback.core.ConsoleAppender祝辞——比;   & lt; !——编码器ch.qos.logback.classic.encoder违约。PatternLayoutEncoder——比;   & lt; encoder>   & lt; pattern>   [% 5的水平][%号{yyyy-MM-dd HH: mm: ss}] %记录器{96}- %味精% n %线   & lt;/pattern>   & lt; charset> UTF-8& lt; !——此处设置字符集——比;   & lt;/encoder>      & lt; rollingPolicy类=癱h.qos.logback.core.rolling.TimeBasedRollingPolicy”比;   & lt; !——翻转每日配置日志所生成的目录以及生成文件名的规则,默认是相对路径——比;   & lt; fileNamePattern>日志/xalert - % d {yyyy-MM-dd}。% i.log   & lt; !——& lt;属性名=發ogDir”价值=癊:/testlog”/祝辞——比;   & lt; !——绝对路径定义——比;   & lt; !——& lt; fileNamePattern> $ {logDir}/logs/xalert - % d {yyyy-MM-dd}。% i.log——比;   & lt; timeBasedFileNamingAndTriggeringPolicy   类=癱h.qos.logback.core.rolling.SizeAndTimeBasedFNATP”比;   & lt; !——或者当文件大小达到64 MB——比;   & lt; maxFileSize> 64 MB   & lt;/timeBasedFileNamingAndTriggeringPolicy>   & lt;/rollingPolicy>         & lt;过滤器类=癱h.qos.logback.classic.filter.ThresholdFilter”比;   & lt; level> DEBUG

Spring-Boot中如何使用多线程处理任务方法