java - Spring中使用@Async插入数据库

标签 java spring asynchronous

我正在编写一个提供图像文件上传的网络应用程序。

文件上传(使用 JavaScript)后,用户需要提交表单。 提交后,图像文件将被处理(制作缩略图等),这就是为什么我想将 HttpServletRequest 传递给 @Async 服务。

不幸的是,当我使用 @Async 时,我的应用程序不会在数据库中插入任何内容。也没有错误。这只是没有发生。

当我删除@Async时,它工作正常,但表单提交需要很长时间。

我还在@Service之后使用了@EnableAsync。

出了什么问题?

@ResponseBody
public String addAdvertisement(Model model, HttpServletRequest request){

    addAdvertisementService.addAdvertisement(request);

    return "OK";
}

和异步服务

@Service
@EnableAsync
public class AddAdvertisementService {
    public String addAdvertisement(HttpServletRequest request){

       ...

       System.out.println(" REQUEST " );

int customerId = customerNotRegisteredService.addCustomer("", ipAddress, email, phoneNumber);

控制台上显示 REQUEST,但未调用“addCustomer”...

最佳答案

这可能是由于请求对象的作用域性质造成的。

使用@Async,您可以在不同的线程中处理它。因此 servlet 线程是空闲的并且您的请求已完成。

正确做法是克隆您的请求并传递克隆的对象,或者您可以使用 Future 对象并阻止主线程。

可以通过 HttpServletResponseWrapper 类克隆 HTTP 请求和响应 http://docs.oracle.com/javaee/1.3/api/javax/servlet/http/HttpServletResponseWrapper.html

关于java - Spring中使用@Async插入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32640647/

相关文章:

java - 再次出现 NullPointerException - intersects()

java - 递归查找 "indirect relationships"

c# - 如何使用 Socket.BeginReceive Overload 3?

java hsperfdata 目录

java - 删除数组中的重复元素 Java

java - Spring框架有一个 "POJO implementation"是什么意思

spring - gradle-aspectj:编织和ajc编译器选项在编译时起作用,但在测试任务中不起作用

java - Spring框架中的DAO和Service层到底是什么?

java - 使用阻塞 API 时的 Java 异步编程

javascript - 如何在 RxJS 中按功能组合函数( f(g(h)))?