Spring @Async注释

时间:2016-10-05 05:41:56

标签: spring multithreading spring-transactions spring-annotations xml-configuration

我对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作为服务方法来增加客户端的控制器响应时间,但它并没有像我想的那样工作。 我是否会失去某些东西?或者我如何以最简单的方式进行修改?

3 个答案:

答案 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>