2014-07-21 3 views
0

내 서비스 계층 코드에서 비동기 메서드 호출을 만들려고합니다. 같은 일부 의사 코드는 다음과 같습니다 :스프링 threadpooltaskexecutor : 트랜잭션 관리

public void createXXX() 
{ 
    dao.saveOrUpdate(entity); // save an entity 
    ................... 
    ................... 
    callAServiceXXX() 
} 
........... 
........... 
public void callAServiceXXX() 
{ 
    SomeEntity entity = dao.getEntity(); // entity NOT NULL 
    this.threadPoolTaskExecutor.execute(new Runnable() { 
       public void run() { 

       try { 
       callAMethodXXX() 
       }catch() 
       {} 

} 

public void callAMethodXXX() 
{ 
    SomeEntity entity = dao.getEntity(); // entity always NULL 
} 

내 스프링 설정 파일은이 위의 논리를 포함하는 서비스 계층 빈 정의 다음과 같습니다 위에서 말했듯이

<property name="transactionAttributes"> 
       <props> 
        <prop key="callAServiceXXX">PROPAGATION_REQUIRED</prop> 
        <prop key="callAMethodXXX">PROPAGATION_MANDATORY</prop> 
       </props> 
      </property> 

을 때 createXXX() 메소드에 저장 한 엔티티 객체를 가져 오려고 할 때 callAMethodXXX() 메소드에서 dao 호출을 실행하면 항상 NULL입니다.

이 동작에 대한 이유는 확실하지 않습니다. 스프링 설정 파일에서 몇 가지 다른 트랜잭션 속성을 시도했지만 성공하지 못했습니다.

내가이 작품을 만들려고 해결 방법

했다 :

1) 헬퍼 클래스를 만듭니다. 이 서비스 계층 클래스에 삽입하십시오. 2) callAMethodXXX() 메서드를이 도우미 클래스로 이동합니다. 3) callAMethodXXX()가 새 트랜잭션에서 실행되어야하는지 확인하려면 <prop key="callAMethodXXX">PROPAGATION_REQUIRES_NEW</prop>을 정의하십시오.

그러나 추가 도우미 클래스를 사용하고 싶지 않고 논리가 단일 서비스 계층 클래스에서 제대로 작동하는지 확인하려고합니다.

위 입력 사항은 도움이됩니다.

감사합니다.

답변

0

Runnable 스레드는 트랜잭션 관리를 인식하지 못합니다. 은 어쩌면 당신은 그 자체로 관리 빈에 대한 참조를 추가하려고 및 방법 callAMethod에 대한 TRANSACTION_REQUIRES_NEW을 추가 할 수 있습니다

@Component 
public class MyService { 
    @Autowired 
    public MyService myService; 

    public void callAServiceXXX() { 
     SomeEntity entity = dao.getEntity(); 
     this.threadPoolTaskExecutor.execute(new Runnable() { 
      public void run() { 
       try { 
        myService.callAMethodXXX(); 
       }catch(Exception e){ 
       } 
      } 
     }); 
    } 
} 

<property name="transactionAttributes"> 
    <props> 
     <prop key="callAServiceXXX">PROPAGATION_REQUIRED</prop> 
     <prop key="callAMethodXXX">PROPAGATION_REQUIRES_NEW</prop> 
    </props> 
</property> 

면책 조항 :이 비동기 메서드를 호출하는 당신이 여전히 그 접근 방식에 문제가있을 수 있습니다 및 별도의 트랜잭션에서 saveOrUpdate 메소드가 완료되었는지 100 % 확신 할 수 없습니다.

관련 문제