2017-06-13 58 views
0

我有一些方法可以通过Spring数据JPA存储库导入机场价格并将其保存到数据库。Spring数据JPA等待发现

导入方法是这样的:

@Transactional 
public Future<Boolean> importFuel(File serverFile, Long providerIdLong) { 
    final FuelProvider fuelProvider = fuelProviderRepository 
      .findOne(providerIdLong); 
    LOG.debug("fuelProvider:" + fuelProvider.getName()); 
    List<AirportFuel> airportFuels = processors 
      .get(providerIdLong).process(serverFile, fuelProvider); 
    if(airportFuels==null){ 
     return new AsyncResult<>(false); 
    } 

    airportFuelRepository.deleteByFpId(providerIdLong); 
    airportFuelRepository.save(airportFuels); 
    fuelProvider.setUpdated(new Date()); 
    fuelProviderRepository.save(fuelProvider); 
    return new AsyncResult<>(true); 
} 

例如,这是阅读方法:

List<AirportFuel> airportFuels = airportFuelRepository.findByIata(airport.getIata()); 

和AirportFuelRepository:

@Repository 
@Transactional(readOnly = true) 
public interface AirportFuelRepository extends CrudRepository<AirportFuel, 
Long> { 


    @Transactional 
    @Modifying 
    @Query("delete from AirportFuel af where af.fpId = :#{#fpId}") 
    void deleteByFpId(@Param("fpId") Long fpId); 

    @Transactional(readOnly = true) 
    List<AirportFuel> findByIata(String iata); 

    List<AirportFuel> findByIataAndFpId(String iata, Long fpId); 

} 

应用是基于Spring开机,休眠,春天数据JPA和MS SQL。

如果import方法正在运行,那么其他方法也使用airportFuelRepository等待这个方法的结束,我不知道为什么。我想这个阅读方法可以在导入之前处理数据,并且不会等待结束导入方法。

谢谢你的建议。

回答

0

如果我理解正确,您希望这两种方法都能够异步访问同一个存储库。

为了做到这一点注释您的方法与@Async注释。

几个环节,让你开始:

+0

导入方法由JmsListener通过MQ调用,前人的精力是异步。但我试过你的建议,但没有结果。如果import方法在最后并提交数据,则read方法为block。我忘了补充说,它的处理数量是几千个。 –