รองรับ Async สำหรับคอนโทรลเลอร์ Spring ใน Java

เมื่อฉันพยายามโทรหาสปริงเว็บไคลเอ็นต์ ฉันได้รับข้อผิดพลาด:

HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalStateException: Async support must be enabled on a servlet and for all filters involved in async request processing. This is done in Java code using the Servlet API or by adding "true" to servlet and filter declarations in web.xml.

ฉันไม่มีสิทธิ์เข้าถึง / ไม่อยากยุ่งกับไฟล์ web.xml ตัวควบคุมสปริงของฉันเป็นดังนี้:

@Controller
@RequestMapping("/test/test")
public class MyController
{
     //Using DeferedResult and Http get / post
}

สิ่งที่ฉันลอง: วาง @Async ไว้เหนือคลาสและอยู่เหนือวิธีการรับ/โพสต์ ลองวาง @EnableAsync ไว้เหนือคลาสด้วย ฉันจะเปิดใช้งานการสนับสนุน async ในโค้ด java โดยไม่ต้องทำใน web.xml ได้อย่างไร ไม่พบความช่วยเหลือทางออนไลน์มากนัก


person Rajesh K    schedule 01.07.2015    source แหล่งที่มา
comment
แสดงไฟล์ web.xml ของคุณ   -  person Strelok    schedule 01.07.2015
comment
ฉันไม่มีสิทธิ์เข้าถึงไฟล์ web.xml ตามที่ฉันบอก ฉันต้องทำมันด้วยวิธีจาวา   -  person Rajesh K    schedule 01.07.2015
comment
ใช่ แต่ web.xml ของคุณอาจมีการกำหนดค่าไม่ถูกต้อง มันไม่ใช่แค่เกี่ยวกับการทำแบบจาวาเท่านั้น   -  person Strelok    schedule 01.07.2015
comment
คุณใช้การกำหนดค่าตาม Java สำหรับเซิร์ฟเล็ตของคุณหรือไม่?   -  person Ian Dallas    schedule 01.07.2015


คำตอบ (1)


หากคุณใช้บริบทแอปพลิเคชันสไตล์ Java แทน xml การกำหนดค่าด้านล่างควรใช้งานได้

@Configuration
@EnableAutoConfiguration
@EnableAsync
@ComponentScan("your.package")
public class AppConfig extends SpringBootServletInitializer implements AsyncConfigurer {

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(20);
        executor.setMaxPoolSize(100);
        executor.setQueueCapacity(200);
        executor.initialize();
        return executor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new MyAsyncExceptionHandler();
    }
}

นี่คือตัวอย่างสำหรับ asyncExceptionHandler

public class MyAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {

    static Logger log = Logger.getLogger(MyAsyncExceptionHandler.class.getName());

    @Override
    public void handleUncaughtException(Throwable throwable, Method method, Object... obj) {
        log.error("Exception message - " + throwable.getMessage());
        log.error("Method name - " + method.getName());
        for (Object param : obj) {
            log.error("Parameter value - " + param);
        }

    }

}
person Steve Park    schedule 01.07.2015