2014-11-21 47 views
2

我有一个将调用存储函数的方法。我希望它异步地完成它的工作。这是我的,但似乎.doWork()永远不会启动,因为当我呼叫getDao.deleteAll(),存储的功能不会运行。会话异步服务

@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();'。 – 2014-11-21 16:53:45

+0

刚刚尝试过,没有运气 – PhoonOne 2014-11-21 17:11:11

+0

尝试在'executorService.shutdown();'之后使用'while(!executorService.isTerminated()){}'。这将使当前线程等待,直到“ExecutorService”中的线程完成。这是为了测试目的,因为如果它在这里结束,这意味着问题出现在初始化此线程的主线程中。 – 2014-11-21 19:30:46

回答

2

请注意,@Transaction由于事务通常是线程绑定而具有单独的线程时未实现。

您将需要从run()中的工厂获取新的entityManager

也去@Async这是更清洁。

同样知道事务性与@Async

@Async and @Transactional: not working

根据经验,一般情况下,如果你想使一些工作异步 - 可以把它看成一个独立的工作单元和一个单独的事务。

+0

所以目前我的DAO正在扩展一个GenericDAOJpa,它在那里创建实体管理器。所以你说我应该在run()中创建一个新的? @bhantol – PhoonOne 2014-11-24 14:01:56

+0

添加一个新的entityManager的确奏效!但你能告诉我背后的原因吗?谢谢@bhantol – PhoonOne 2014-11-24 15:28:33

+0

你还建议使用@Async而不是@Transactional?或者同时使用? – PhoonOne 2014-11-24 15:30:17