请参阅代码。
当我调用方法@Async loadMarkUpPCT()时,数据未提交到表中。它表现得好像是非牵引性的。
当我从loadMarkUpPCT(Class 1)中删除@Async时,即非异步,则提交数据并按预期正常:transactional)
我期望与@Async和@Transactional有相同的结果,但它不是。请解释或我做错了什么?
编辑:我刚编辑发布代码+日志
流量明智: AppDataLoaderController调用AppDataLoaderService 调用DataMigrationService调用JpaDataMigrationDao
package concepts.web.rest.resource.spring.impl;
@Controller
@RequestMapping("/appdataloader")
public class AppDataLoaderController {
@RequestMapping("/loadMarkupPct")
@ResponseStatus(HttpStatus.ACCEPTED)
public void loadMarkUpPCT() {
try {
this.appDataLoaderService.loadMarkUpPCT();
} catch (ServiceException e) {
e.printStackTrace();
}
}
package concepts.service.impl;
@Service("appDataLoaderService")
public class AppDataLoaderServiceImpl implements AppDataLoaderService {
@Async
@Override
public void loadMarkUpPCT() throws ServiceException {
logger.debug("@Async loadMarkUpPCT");
dataMigrationService.loadMarkUpPCT();
}
package concepts.service.impl;
@Service
@Scope("prototype")
public class DataMigrationServiceImpl implements DataMigrationService {
@Override
public void loadMarkUpPCT() throws ServiceException {
// TODO Auto-generated method stub
Assert.notNull(markUpPCTDataLoader);
List<MarkUpPCT> markUpPCTs=markUpPCTDataLoader.getMarkupCoef();
for (MarkUpPCT markUpPCT: markUpPCTs)
dataMigrationDao.storeMarkUpPCT(markUpPCT);
}
package concepts.persistence.impl.jpa;
@Repository
public class JpaDataMigrationDao extends DataMigrationDaoAdapter{
@PersistenceContext
private EntityManager entityManager;
@Transactional
@Override
public void storeMarkUpPCT(MarkUpPCT markUpPCT) {
entityManager.persist(markUpPCT);
}
一些日志
14 Nov 2013 18:47:05,531 36813 [http-bio-18080-exec-3] DEBUG OpenEntityManagerInViewFilter - Opening JPA EntityManager in OpenEntityManagerInViewFilter
14 Nov 2013 18:47:05,578 36860 [http-bio-18080-exec-3] DEBUG DispatcherServlet - DispatcherServlet with name 'mvc' processing POST request for [/POCQI/appdataloader/loadMarkupPct]
[http-bio-18080-exec-3] DEBUG RequestMappingHandlerMapping - Looking up handler method for path /appdataloader/loadMarkupPct
[http-bio-18080-exec-3] DEBUG RequestMappingHandlerMapping - Returning handler method [public void concepts.web.rest.resource.spring.impl.AppDataLoaderController.loadMarkUpPCT()]
[SimpleAsyncTaskExecutor-1] DEBUG DataMigrationServiceImpl - @Async loadMarkUpPCT
[http-bio-18080-exec-3] DEBUG DispatcherServlet - Null ModelAndView returned to DispatcherServlet with name 'mvc': assuming HandlerAdapter completed request handling
[SimpleAsyncTaskExecutor-1] DEBUG MarkUpPCTDataLoader - {80=1.6, 90=1.8, 100=2.0, 105=2.05, 110=2.1, 115=2.15, 117=2.17, 120=2.2, 125=2.25, 150=2.5}
[http-bio-18080-exec-3] DEBUG DispatcherServlet - Successfully completed request
[http-bio-18080-exec-3] DEBUG OpenEntityManagerInViewFilter - Closing JPA EntityManager in OpenEntityManagerInViewFilter
[http-bio-18080-exec-3] DEBUG EntityManagerFactoryUtils - Closing JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Opening JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Registering transaction synchronization for JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Closing JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Opening JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Registering transaction synchronization for JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Closing JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Opening JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Registering transaction synchronization for JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Closing JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Opening JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Registering transaction synchronization for JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Closing JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Opening JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Registering transaction synchronization for JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Closing JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Opening JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Registering transaction synchronization for JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Closing JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Opening JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Registering transaction synchronization for JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Closing JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Opening JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Registering transaction synchronization for JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Closing JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Opening JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Registering transaction synchronization for JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Closing JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Opening JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Registering transaction synchronization for JPA EntityManager
[SimpleAsyncTaskExecutor-1] DEBUG EntityManagerFactoryUtils - Closing JPA EntityManager
答案 0 :(得分:2)
尝试使用loadMarkUpPCT()
注释@Transactional
方法并告诉我们这是否有效。
答案 1 :(得分:0)
我碰到了同样的问题。原来我忘了添加@EnableAsync注释。