zoukankan      html  css  js  c++  java
  • Spring ThreadPoolTaskExecutor队列满的异常处理

    <!-- 配置线程池 -->
    <bean id="threadPool" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize" value="5" />
    <property name="keepAliveSeconds" value="30000" />
    <property name="maxPoolSize" value="50" />
    <property name="queueCapacity" value="100" />
    </bean>

     corePoolSize:默认开启线程数;maxPoolSize:最大线程数;queueCapacity:缓冲任务队列的长度;
    创建线程的方式:

    @Autowired
    private ThreadPoolTaskExecutor threadPool;


    threadPoolTaskExecutor.execute(new Runnable() {
                   public void run() {
                       //异步任务
                    }
                });
     
     
     
    Spring ThreadPoolTaskExecutor没有使用阻塞模式将任务加入到对象中,因此对象满的时候会抛出异常,对于这种情况,一般的企业执行环境不能无限制的增大内存队列容量,因此不得不阻塞队列的加入,spring内置提供的异常处理机制不好用,因为ThreadPoolExecutor.CallerRunsPolicy的处理方式是将异常任务放在调用线程中执行,这样对于单个执行时间长的任务,即使队列有空闲了,剩下的任务也要等这个任务在主线程执行完了才能继续往队列里面添加。有一个处理方法就是捕获executor.execute()的异常,只要发现有异常就等待一段时间,直到没有异常为止,这样就能模仿阻塞队列的效果,下面是代码:
     
    while(true){
        try{
            taskExecutor.execute(new MailSender(tUserIssueInfo));
            break;
        }catch(TaskRejectedException e){
            try{
                Thread.sleep(1000);
            }catch(Exception e2){}
        }
    }
  • 相关阅读:
    session和cookie
    数据库备份
    使用pip安装.whl文件时出现is not a supported wheel on this platform的解决办法
    multiprocessing模块
    threading模块
    python中多线程相关
    python中实现单例模式
    Flask-SQLAlchemy相关与Flask-Migrate相关
    redis模块
    Flask-Login中装饰器@login_manager.user_loader的作用及原理
  • 原文地址:https://www.cnblogs.com/flywang/p/5067036.html
Copyright © 2011-2022 走看看