💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 一、概述 平台默认内置了异步线程机制; >[danger] 注意几点: > @Async注解的方法上再使用@Transaction注解是无效的; > @Async注解的方法不能是静态方法; > 建议@Async注解的方法独立的写在由@Component注解的类中,由它来调用设定事务的Service层,然后业务层再调用它; ## 二、用法 默认的,平台提供的异步线程池为`rayAsynTaskExecutor`; 举例: ``` @Async("rayAsynTaskExecutor") public Future<Long> refreshAllReferencedStaff(long roleId) throws InterruptedException { List<SysStaff> staffList = SysRoleDao.getSysStaffListOfSpecRole(roleId); for (SysStaff staff : staffList) { SysStaffSupplement supplement = sysStaffSupplementDao.findByStaffId(staff.getStaffId()); if (supplement == null) { supplement = new SysStaffSupplement(); supplement.setStaffId(staff.getStaffId()); } supplement.setAssociatedRoleNames(ArrayUtil.getStringWithSplit(sysStaffRoleDao.getSysStaffRoleNamesAssociatedBySpecStaff(staff.getStaffId()), "/")); sysStaffSupplementDao.save(supplement); } return new AsyncResult<>(Long.valueOf(staffList.size())); } ``` >[danger] > 1、我们可以定义多个线程池,然后指定异步任务使用的线程池,但平台综合考虑,提供了默认的`rayAsynTaskExecutor`线程池; >2、如果线程池配置的线程数小于当前进池的任务数,那么默认的会导致TaskRejectedException异常,取决于线程池配置的拒绝策略; * AbortPolicy策略:默认策略,如果线程池队列满了丢掉这个任务并且抛出RejectedExecutionException异常。 * DiscardPolicy策略:如果线程池队列满了,会直接丢掉这个任务并且不会有任何异常。 * DiscardOldestPolicy策略:如果队列满了,会将最早进入队列的任务删掉腾出空间,再尝试加入队列。 * CallerRunsPolicy策略:如果添加到线程池失败,那么主线程会自己去执行该任务,不会等待线程池中的线程去执行。