异步执行导出操作, 使用@Async 注解项目运行报错 UT010018: Async not started

@Component
@Slf4j
public class MyTask {
    @Autowired
    private IPayoffDataService payoffDataService;
    @Autowired
    private SysBaseAPIClient sysBaseAPIClient;

    @Async
    public void exportAlLData (String token ) throws IOException {
        /*
        1. 查询所有的结算单-审批
        2. 处理封装数据,生成url
        3. 将URL通过消息传递给前端
 注解方式 ExcelExportUtil.exportBigExcel(ExportParams entity, Class<?> pojoClass,IExcelExportServer server, Object queryParams)
         */
        try {
            System.out.println("导出数据线程正在执行,名称为:  "+ Thread.currentThread().getName());
            LocalDate currentDate = LocalDate.now();
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
            // 添加时间戳作为文件名, 避免文件重名
            String suffixPath = currentDate.format(formatter);
            Workbook workbook = null;
            String projectPath = System.getProperty("user.dir");
            List<PayoffData> payoffDataList = payoffDataService.list(new QueryWrapper<PayoffData>().isNotNull("attr_name106")
                    .or().ne("attr_name106", "未提交"));
            ExportParams params = new ExportParams("结算单审批表", "导出信息");
            params.setType(ExcelType.XSSF);
            workbook = ExcelExportUtil.exportBigExcel(params, PayoffData.class, payoffDataList);
            ExcelExportUtil.closeExportBigExcel();
            File savefile = new File(projectPath+"/excel/");
            if (!savefile.exists()) {
                savefile.mkdirs();
            }
            String path = projectPath+"/excel/"+suffixPath+"payoffDataApprove.xlsx";
            FileOutputStream fos = new FileOutputStream(path);
            workbook.write(fos);
            fos.close();
            // 将路径 以站内信的形式发送给前端告知用户
            // 获取用户名字
            //String token = request.getHeader(DefContants.X_ACCESS_TOKEN);
            String username = JwtUtil.getUsername(token);
            LoginUser sysUser = sysBaseAPIClient.getUserByName(username);
            String fromuser= "admin";
            String toUser = sysUser.getRealname();   // 获取当前登录用户
            String title ="下载成功";
            String msgContent ="下载链接已准备好,请点击"+path+"下载!";
            sysBaseAPIClient.sendSysAnnouncement(new SystemMessage(fromuser,toUser,title,msgContent));

        } catch (IOException e) {
            String errMessage = e.getMessage();
            log.info("导出excel文件时发生异常:"+errMessage);
            throw new RuntimeException(e);
        }

    }
}
接口:   
   @PostMapping(value = "/exportAllData")
    @AutoLog("导出所有审批结算单")
    public  Result exportAlLData(HttpServletRequest request) throws IOException {
        //exportData(request);
        String token = request.getHeader(DefContants.X_ACCESS_TOKEN);
        myTask.exportAlLData(token);
        return Result.ok("数据正在处理中, 请稍后在通知中查看!");
    }

报错信息:

2024-05-08 15:18:18.931 [XNIO-1 task-4] ERROR o.jeecg.common.exception.JeecgBootExceptionHandler:57 - UT010018: Async not started
java.lang.IllegalStateException: UT010018: Async not started
	at io.undertow.servlet.spec.HttpServletRequestImpl.getAsyncContext(HttpServletRequestImpl.java:1067)
	at io.undertow.servlet.spec.HttpServletRequestImpl.getAsyncContext(HttpServletRequestImpl.java:100)
	at javax.servlet.ServletRequestWrapper.getAsyncContext(ServletRequestWrapper.java:486)
	at com.alibaba.fastjson.serializer.ASMSerializer_3_ShiroHttpServletRequest.write(Unknown Source)
	at com.alibaba.fastjson.serializer.JSONSerializer.writeWithFieldName(JSONSerializer.java:333)
	at com.alibaba.fastjson.serializer.JSONSerializer.writeWithFieldName(JSONSerializer.java:311)
	at com.alibaba.fastjson.serializer.ObjectArrayCodec.write(ObjectArrayCodec.java:118)
	at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:285)
	at com.alibaba.fastjson.JSON.toJSONString(JSON.java:758)
	at com.alibaba.fastjson.JSON.toJSONString(JSON.java:696)
	at com.alibaba.fastjson.JSON.toJSONString(JSON.java:661)
	at org.jeecg.modules.system.aspect.AutoLogAspect.getReqestParams(AutoLogAspect.java:147)
	at org.jeecg.modules.system.aspect.AutoLogAspect.saveSysLog(AutoLogAspect.java:87)
	at org.jeecg.modules.system.aspect.AutoLogAspect.around(AutoLogAspect.java:55)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
	at org.jeecg.modules.payoffData.controller.PayoffDataApproveController$$EnhancerBySpringCGLIB$$db6be054.exportAlLData(<generated>)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:665)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:750)
	at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
	at com.github.xiaoymin.swaggerbootstrapui.filter.SecurityBasicAuthFilter.doFilter(SecurityBasicAuthFilter.java:84)
	at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
	at com.github.xiaoymin.swaggerbootstrapui.filter.ProductionSecurityFilter.doFilter(ProductionSecurityFilter.java:53)
	at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
	at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)
	at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
	at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
	at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
	at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
	at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
	at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
	at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
	at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
	at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)
	at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
	at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
	at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
	at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:124)
	at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
	at org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:90)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
	at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:117)
	at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:106)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
	at com.alibaba.csp.sentinel.adapter.servlet.CommonFilter.doFilter(CommonFilter.java:91)
	at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
	at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
	at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
	at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
	at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
	at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132)
	at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
	at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
	at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
	at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
	at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
	at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
	at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
	at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
	at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
	at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
	at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
	at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
	at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
	at io.undertow.server.Connectors.executeRootHandler(Connectors.java:364)
	at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:750)
1 个赞

检查下线程池呢

还有就是@EnableAsync 注解在启动类上加了没有

@Component
@Slf4j
public class MyTask {
@Autowired
private IPayoffDataService payoffDataService;
@Autowired
private SysBaseAPIClient sysBaseAPIClient;

@Async
public void exportAlLData (String token ) throws IOException {
    /*
    1. 查询所有的结算单-审批
    2. 处理封装数据,生成url
    3. 将URL通过消息传递给前端
注解方式 ExcelExportUtil.exportBigExcel(ExportParams entity, Class<?> pojoClass,IExcelExportServer server, Object queryParams)
*/
try {
System.out.println(“导出数据线程正在执行,名称为: “+ Thread.currentThread().getName());
LocalDate currentDate = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(“yyyy-MM-dd”);
// 添加时间戳作为文件名, 避免文件重名
String suffixPath = currentDate.format(formatter);
Workbook workbook = null;
String projectPath = System.getProperty(“user.dir”);
List payoffDataList = payoffDataService.list(new QueryWrapper().isNotNull(“attr_name106”)
.or().ne(“attr_name106”, “未提交”));
ExportParams params = new ExportParams(“结算单审批表”, “导出信息”);
params.setType(ExcelType.XSSF);
workbook = ExcelExportUtil.exportBigExcel(params, PayoffData.class, payoffDataList);
ExcelExportUtil.closeExportBigExcel();
File savefile = new File(projectPath+”/excel/”);
if (!savefile.exists()) {
savefile.mkdirs();
}
String path = projectPath+“/excel/”+suffixPath+“payoffDataApprove.xlsx”;
FileOutputStream fos = new FileOutputStream(path);
workbook.write(fos);
fos.close();
// 将路径 以站内信的形式发送给前端告知用户
// 获取用户名字
//String token = request.getHeader(DefContants.X_ACCESS_TOKEN);
String username = JwtUtil.getUsername(token);
LoginUser sysUser = sysBaseAPIClient.getUserByName(username);
String fromuser= “admin”;
String toUser = sysUser.getRealname(); // 获取当前登录用户
String title =“下载成功”;
String msgContent =“下载链接已准备好,请点击”+path+“下载!”;
sysBaseAPIClient.sendSysAnnouncement(new SystemMessage(fromuser,toUser,title,msgContent));

    } catch (IOException e) {
        String errMessage = e.getMessage();
        log.info("导出excel文件时发生异常:"+errMessage);
        throw new RuntimeException(e);
    }

}
}
接口:
@PostMapping(value = “/exportAllData”)
@AutoLog(“导出所有审批结算单”)
public Result exportAlLData(HttpServletRequest request) throws IOException {
//exportData(request);
String token = request.getHeader(DefContants.X_ACCESS_TOKEN);
myTask.exportAlLData(token);
return Result.ok(“数据正在处理中, 请稍后在通知中查看!”);
}

还是这样看着舒服点,我康康

1 个赞

加了,

顺便问问, 怎么弄成这个格式的

markdown

1 个赞

调试下源码看异步任务的线程池启动了没有,spring线程池初始化的具体代码百度下吧

线程启动了吧,代码里边打印了异步线程的名称的

你贴代码不如贴报错

你是怎么调用的,是用postman类似的接口工具吗?还是用测试类junit之类的;后者需要对这种异步处理进行配置,你可以搜搜,postman调用应该是没问题的

这个注解应该有个对应的配置类吧

1 个赞

直接前端调的

这玩意会默认自己给一个线程池,我就怕他是启动类每家@EnableAsync

不如贴一下异常信息瞅瞅

稍等