2011-10-27 1 views
1

메신저는 기존 시스템에서 작업 중이며 스프링 트랜잭션 관리자를 마스터 작업 스레드에서 생성되는 스레드에 연결해야합니다. 내가 트랜잭션 주석을 생각할 수있는 그리고 난 아직 캔트이 오류가 취소 얻을 주석이 모든 것을 필자이 예외스프링 트랜잭션이 스폰 된 스레드에서 처리되었습니다.

org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here 
    at org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63) 
    at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:687) 
    at parity.model.datamapping.RefreshTask.execute(RefreshTask.java:95) 
    at com.paritysys.tasks.ASyncTask$1.run(ASyncTask.java:48) 
    at java.lang.Thread.run(Thread.java:662) 

가 계속.

내가

내 방법

@TransactionAS400 
    @TransactionScores 
    public void refresh() { 
     ASyncTaskWorker worker = new ASyncTaskWorker() { 
      public void progress(double percentage, String message) { 
       logger.debug(String.format("%.2f - %s", percentage, message)); 
      } 

      public void handleException(Throwable e) { 
       try { 
        status.allowUpdating(property.getSchema()); 
       } catch (Exception b) { 
        // consume 
       } 

       logger.error("Failed to complete the refresh task", e); 
      } 

      public void done(boolean success) { 
       status.allowUpdating(property.getSchema()); 
       logger.debug(String.format(
         "Reset updating status to default for %s", 
         property.getSchema())); 
      } 
     }; 
     RefreshTask refTask = ServiceProviderContext.find(RefreshTask.class); 

     refTask.init(property, worker); 

     ASyncTaskHandler.getInstance().add(refTask); 
     ASyncTaskHandler.getInstance().process(); 
    } 
+0

트랜잭션을 시작하는 코드와이를 호출하는 코드를 게시해야합니다. – Ralph

+0

글쎄, 트랜잭션을 시작하는 코드가 없습니다. 트랜잭션 주석이 내 봄 콩 내부에서 무엇을하는지. 내 문제는 콩이 어떤 이유로 새로운 스레드로 스폰 될 때 봄이 새로운 스레드에서 새로운 트랜잭션을 시작할 수 있다는 것을 인식하지 못하는 것 같습니다. – scphantm

+1

'@ Transactional'을 사용할 것으로 예상했습니다. 그러나이 주석 메소드를 호출하는 코드를 게시하십시오. – Ralph

답변

2

나는 봄의 측면이 손이 닿지 않는 스레드가 비슷한 상황에 달렸다없는 누구인지.

transactionTemplate.execute(new TransactionCallback() { 
    @Override 
    public Object doInTransaction(TransactionStatus status) { 
     //your code 
    } 
} 

내가 문제를 디버깅하기 위해 사전에 transactionTemplate.setName("myTransactionsName")를 호출 권하고 싶습니다 : 사용 후 정의 및 와이어 org.springframework.transaction.support.TransactionTemplate의 인스턴스를하고 : 은 내가 제안하는 것은 다음입니다.

0

다른 답변에서 제안으로 TransactionTemplate의 잘 작동 것이지만,주의해야 할 두 가지 옵션이 있습니다 : 그 다른 주석을 사용하는 경우

1) 잘 모르겠어요 (@Transactional과 방법을 정의는) <tx:annotation-driven> 또는콩을 선언하십시오

2) <tx:advice> 및 pointcuts를 사용하여 트랜잭션을 정의하십시오.

두 가지 모두는 the Spring manual에 설명되어 있습니다.