我正在编写一个提供图像文件上传的网络应用程序。
文件上传(使用 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/