2014-11-21 2 views
2

저장 함수를 호출 할 메서드가 있습니다. async'ly 그것의 일을하고 싶습니다. 이것은 내가 가진 것이지만, getDao.deleteAll()을 호출하면 저장된 함수가 실행되지 않기 때문에 .doWork()가 시작되지 않은 것처럼 보입니다.세션이있는 비동기 서비스

@Transactional 
    public void delete() 
    { 

     final Session session = (Session) entityManager.getDelegate(); 
     ExecutorService executorService = Executors.newSingleThreadExecutor(); 
     executorService.execute(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       LOGGER.warn("starting"); 
       session.doWork(new Work() 
       { 
        @Override 
        public void execute(Connection connection) throws SQLException 
        { 
         try 
         { 

          CallableStatement purgeArchived = connection.prepareCall("{call deleteAll()}"); 
          purgeArchived.execute(); 
         } 
         catch (SQLException exception) 
         { 
          LOGGER.warn("Failed to purge archive points. Reason: " + exception); 
         } 
        } 
       }); 
       LOGGER.warn("stopping"); 
      } 
     }); 
     executorService.shutdown(); 
    } 

왜 이런 일이 나는 로거가 "starting"를 기록했다 볼 수 있지만, 그것은 "stopping"에 없었어?

+0

'run' 메소드 내에서'final Session session = (Session) entityManager.getDelegate(); '를 시도해보십시오. –

+0

그냥 행운을 빕니다 – PhoonOne

+0

'executorService.shutdown();'다음에'while (! executorService.isTerminated()) {}'를 사용해보십시오. 이것에 의해, 현재의 thread는,'ExecutorService '의 thread가 종료 할 때까지 대기합니다. 이것은 테스트 목적을위한 것입니다. 왜냐하면 여기에서 끝나면이 스레드를 초기화하는 주 스레드에 문제가 있음을 의미하기 때문입니다. –

답변

2

Transactions는 일반적으로 스레드 바운드이므로 별도의 스레드가있을 때는 @Transaction이주의해야합니다.

공장 출하시 run() 내부에 entityManager을 새로 가져와야합니다.

@Async는 더 깨끗합니다. 하나의 작업 단위와 별도의 트랜잭션으로 그 치료 - 당신은 몇 가지 작업 비동기를 만들고 싶어

는 다시 엄지 손가락의 일반적으로 @Async

@Async and @Transactional: not working

와 트랜잭션 특성을 알고 있어야.

+0

그래서 현재 나의 DAO는 GenericDAOJpa를 확장하고 있습니다. 거기서 엔티티 관리자가 생성됩니다. 그래서 내가 달리기() 안에 새로운 것을 만들어야한다고 말하는거야? @bhantol – PhoonOne

+0

새로운 entityManager를 추가하면 효과가있었습니다! 그 이유를 말해 줄 수 있니? Thanks @ bhantol – PhoonOne

+0

또한 @Transactional 대신 @Async를 사용하는 것이 좋습니다. 아니면 둘 다 사용합니까? – PhoonOne