내 서비스 계층 코드에서 비동기 메서드 호출을 만들려고합니다. 같은 일부 의사 코드는 다음과 같습니다 :스프링 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>
을 정의하십시오.
그러나 추가 도우미 클래스를 사용하고 싶지 않고 논리가 단일 서비스 계층 클래스에서 제대로 작동하는지 확인하려고합니다.
위 입력 사항은 도움이됩니다.
감사합니다.