zoukankan      html  css  js  c++  java
  • springboot下使用多线程

    1 启动类加上异步任务注解

    @SpringBootApplication
    @EnableScheduling
    @EnableAsync//开启异步任务
    public class NpApplication{
    
        public static void main(String[] args) {
            SpringApplication.run( NpApplication.class, args);
        }
    
        @Bean(name="taskExecutor")
        public TaskExecutor workExecutor() {//线程池配置
            ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
            threadPoolTaskExecutor.setThreadNamePrefix("Async-");
            threadPoolTaskExecutor.setCorePoolSize(5);
            threadPoolTaskExecutor.setMaxPoolSize(20);
            threadPoolTaskExecutor.setQueueCapacity(20000);
            threadPoolTaskExecutor.afterPropertiesSet();
            return threadPoolTaskExecutor;
        }
    
    
    }

    2 在需要的方法加上@Async注解(方法内的代码为业务代码,无须纠结)

    @Async
        public Future<BmloanInfoQueryResponseRoot> sendLoanQuery(BmloanInfoQueryRequestBody requestBody) throws Exception {//需要响应结果,用future包装
            BmloanInfoQueryRequestRoot root = new BmloanInfoQueryRequestRoot();
            root.setBody(requestBody);
    
            BmInitRequestHead.initRequestHeaderXml(root.getRequestHead(), bmChannelid, bmChanbankid, bmChanuserid, bmKhTranid);
            String sendXml = XMLUtil.convertToXml(root);
    //        log.info("贷款申请信息批量查询接口请求报文:{}", sendXml);
            ESBClient esbclient = new ESBClientImpl();
            esbclient.setTimeOut(600000);
            String res = esbclient.sendSync(sendXml, bmOpenandapplyUrl);
    //        log.info("贷款申请信息批量查询接口返回报文:{}", res);
            BmloanInfoQueryResponseRoot queryResponse = (BmloanInfoQueryResponseRoot) XMLUtil.convertXmlStrToObject(BmloanInfoQueryResponseRoot.class, res);
            return new AsyncResult<BmloanInfoQueryResponseRoot>(queryResponse);//包装响应结果
        }

    3 调用异步方法方法内的代码为业务代码,无须纠结

    public void syncInfo() {
    		List<String> businos = loanInfoDao.listNotSynch(100);
    		if (businos.size() == 0) {
    			return;
    		}
    		int size = businos.size();
    		for (int i = 0; i < businos.size(); i++) {
    			String busino = businos.get(i);
    			BmloanInfoQueryRequestBody body = new BmloanInfoQueryRequestBody();
    			body.setBusino(busino);
    			try {
    				Future<BmloanInfoQueryResponseRoot> queryResFuture = bmService.sendLoanQuery(body);//这里调用的异步方法
    				futures.add(queryResFuture);//将异步结果加入list中,注意不能在这里直接获取异步的结果,否则线程将阻塞,异步无效
    				                           //futrues的定义===>>> List<Future<BmloanInfoQueryResponseRoot>> futures = new ArrayList<Future<BmloanInfoQueryResponseRoot>>();
    				businoList.add(busino);
    			} catch (Exception e) {
    				log.error("贷款申请信息批量查询异常=>流水号:{},错误信息:{}", busino, e.getMessage());
    			}
    		}
    		dataHandle();
    		syncInfo();//再调用
    	}
    

      

    4 注意事项

     4.1  第三步调用异步的方法 和 第二步的异步方法不能在同一个类中。

     4.2 异步方法得定义为public。

     4.3 在@Async标注的方法,并有@Transactional注解的;在其调用数据库操作之时,将无法产生事务管理的控制,原因就在于其是基于异步处理的操作。

          可以将需要事务管理操作的方法放置到异步方法内部,在内部被调用的方法上添加@Transactional.

  • 相关阅读:
    使用excel2003中的solver解决最优化问题
    图的邻接表存储方式的建立
    LINUX下使用VI
    LINUX下基本命令
    应用程序各对象创建的顺序
    zookeeper常遇错误详解
    MapReduce_partition
    MapReduce_TopK
    MapReduce_MaxValue
    Hbase用java基础操作
  • 原文地址:https://www.cnblogs.com/SunAutumn/p/10949931.html
Copyright © 2011-2022 走看看