복붙노트

[SPRING] 최대 절전 모드, 트랜잭션 커밋 또는 트랜잭션 롤백 후에 어떤 메소드를 호출하는 방법

SPRING

최대 절전 모드, 트랜잭션 커밋 또는 트랜잭션 롤백 후에 어떤 메소드를 호출하는 방법

트랜잭션 성공 또는 롤백 후에 어떤 메소드를 호출해야합니다. 나는 다음과 같이 사용하고있다.

    <bean name="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
                <property name="sessionFactory">
                    <ref local="mysessionFactory"/>
                </property>
    </bean>

    <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref local="mysessionFactory"/>
        </property>
    </bean>

<tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"/>

응용 프로그램은 내부 트랜잭션이 롤백 될 때 "정리"해야하는 일부 외부 웹 서비스를 사용합니다. 선언적 트랜잭션 관리를 사용하지 않고이를 수행하는 방법이 있습니까?

해결법

  1. ==============================

    1.편집하다

    편집하다

    Spring Aop을 사용하여 @Transactional로 주석 처리 된 모든 메소드에 동기화를 추가하는 예

    @Aspect
    class TransactionAspect extends TransactionSynchronizationAdapter {
    
        @Before("@annotation(org.springframework.transaction.annotation.Transactional)")
        public void registerTransactionSyncrhonization() {
            TransactionSynchronizationManager.registerSynchronization(this);
    
        }
    
        @Override
        public void afterCompletion(int status) {
            // code 
        }
    }
    
  2. ==============================

    2.Spring에는 여기에 관심을 가질만한 다양한 클래스가있다.

    Spring에는 여기에 관심을 가질만한 다양한 클래스가있다.

    http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/transaction/support/TransactionSynchronization.html

    http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/transaction/support/TransactionSynchronizationAdapter.html

    http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/transaction/support/TransactionSynchronizationManager.html

    여기에 몇 가지 예제 코드가 있습니다.

    http://azagorneanu.blogspot.co.uk/2013/06/transaction-synchronization-callbacks.html

    Spring 4.2에서 소개 된 이벤트 처리 인프라는 이것을 훨씬 간단하게 만든다.

    만나다:

    https://spring.io/blog/2015/02/11/better-application-events-in-spring-framework-4-2#transaction-bound-events

    @Component
    public class MyComponent {
    
      @TransactionalEventListener(condition = "#creationEvent.awesome")
      public void handleOrderCreatedEvent(CreationEvent<Order> creationEvent) { 
        ...
      }
    
    }
    
  3. ==============================

    3.Spring 4+ 사용 : 글로벌 측면 및 구성을 사용하지 않고 가장 쉽고 / 깨끗한 방법은 여기 내 대답을 기반으로합니다 : https://stackoverflow.com/a/43322052/986160

    Spring 4+ 사용 : 글로벌 측면 및 구성을 사용하지 않고 가장 쉽고 / 깨끗한 방법은 여기 내 대답을 기반으로합니다 : https://stackoverflow.com/a/43322052/986160

    성공적으로 커밋 한 후에 @Transactional 메서드에 콜백이 필요한 경우 메서드 시작 부분에 추가합니다.

    @Service
    public class OneService {
    
        @Autowired
        OneDao dao;
    
        @Transactional
        public void a transactionalMethod() {
            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter(){
                public void afterCommit(){
                    //do stuff right after commit
                    System.out.println("commit!!!");
    
                }
            });
            //do db stuff
            dao.save();
        }
    }
    
  4. from https://stackoverflow.com/questions/23651464/spring-hibernate-how-to-call-some-method-after-transaction-commit-or-transacti by cc-by-sa and MIT license