看到这个标题,相信不少人会感到疑惑,回忆你们自己的场景会发现,在春天的项目中很少有使用多线程处理任务的,没的错,大多数时候我们都是使用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> DEBUGSpring-Boot中如何使用多线程处理任务方法