我对Spring @Async注释有疑问。 我有一个控制器自动装配服务(GnInsuranceDetailsService)
@RequestMapping(value="/agn/AP0W01A_010/insertDetail.do")
public ResponseEntity<?> insertDetail(@ModelAttribute("dto")GnInsuranceDetailsDTO dto,HttpSession session) throws Exception {
gnInsuranceDetailsDTO.setBkFlag(getAgnUserInfo(session).getBkFlag());
gnInsuranceDetailsService.insertGnInsuranceDetail(dto);//open another thread to insert data
MessageDTO dto = new MessageDTO(AgnConstant.INSERT_SUCCESS);
return new ResponseEntity<MessageDTO>(dto,HttpStatus.OK);// increase return time for client
}
服务insertGnInsuranceDetail方法我声明@Async up方法。
@Transactional(readOnly = false)
@Async
public void insertGnInsuranceDetail(GnInsuranceDetailsDTO gnInsuranceDetailsDTO) throws Exception{
GnInsuranceDetails entity = gnInsuranceDetailsDTO.convert();
gnInsuranceDetailsDAO.save(detailsEntity);
}
我把@Async作为服务方法来增加客户端的控制器响应时间,但它并没有像我想的那样工作。 我是否会失去某些东西?或者我如何以最简单的方式进行修改?
答案 0 :(得分:3)
你不会丢失任何东西,当你在方法服务中放入@Async将在不同的线程中执行时,在返回insertgnInsuranceDetail或抛出任何异常之前,不会返回控制器insertDetail方法。
答案 1 :(得分:0)
我将@Async用于服务方法以增加客户端的控制器响应时间,但它并不像我想的那样工作。
@Async - 将方法标记为异步执行候选的注释。也可以在类型级别使用,在这种情况下,所有类型的方法都被视为异步。
此@Async注释不会帮助您延迟响应时间。要引入延迟,请使用Thread.sleep(milliseconds);
如果您希望主线程(控制器)等待插入数据线程获得结果(成功/失败),您只需从控制器调用数据库层代码即可。如果您希望先发送客户端响应,则在控制器内创建一个新线程并使用该线程插入数据。在后一种为插入数据创建新线程的方法中,客户端不会知道数据插入的状态,因为线程是在控制器中创建的,它将在控制器中结束,不能给客户端提供反馈/响应因为我们不会有客户的详细信息。
希望它有帮助!
参考:https://www.tutorialspoint.com/java/lang/thread_sleep_millis.htm
答案 2 :(得分:0)
@Async
bean中启用{p> @Configuration
:
@Configuration
@EnableAsync
public class AppConfiguration {
[...]
}
对于xml配置添加:<task:annotation-driven>