Spring @Async 注解

Spring @Async annotation

我有一个关于 Spring @Async 注释的问题。 我有一个控制器自动连接了一个服务(GnInsuranceDetailsS​​ervice)

@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 以增加客户端的控制器响应时间,但它并没有像我想的那样工作。 是不是丢东西了?或者怎么修改最简单好用?

你不会丢失任何东西,当你将 @Async 放在方法中时,服务将在不同的线程中执行,控制器的 insertDetail 方法将不会返回,直到你的 insertGnInsuranceDetail 被返回或抛出任何异常。

I put the @Async for the service method to increase controller response time for client side,but it does not work as I think.

@Async - 将方法标记为异步执行候选者的注释。也可以在类型级别使用,在这种情况下,所有类型的方法都被视为异步的。

这个@Async 注释不会帮助您延迟响应时间。要引入延迟,请使用 Thread.sleep(milliseconds);


如果你想让主线程(控制器)等待插入数据线程得到结果(successful/failure)你可以从控制器调用数据库层代码。而如果您希望更早发送客户端响应,则在控制器内创建一个新线程并使用该线程插入数据。在后一种为插入数据创建新线程的方法中,您的客户端将不知道数据插入的状态,因为线程是在控制器中创建的,它将在控制器中结束,所以不能给 feedback/response客户,因为我们不会有客户详细信息。

希望对您有所帮助!

参考:https://www.tutorialspoint.com/java/lang/thread_sleep_millis.htm

@Async 应首先在您的 @Configuration bean 中启用:

@Configuration
@EnableAsync
public class AppConfiguration {

    [...]
}

对于 xml 配置添加:<task:annotation-driven>