天天看點

@TransactionalEventListener 之Spring的事務監聽器

業務場景: 有時候需要一個動作之後觸發另外一個動作,類似消息的機制。但使用kafka等又太重。 這時候可以使用Spring的事件來處理。比如我這有一個需要觸發一個異步任務的業務場景。

具體業務實作 

     public void publishSyncTaskEvent(SyncTaskEvent event) {
 
        //do something bussiness  .....
this.publisher.publishEvent(event);
    }      

監聽器

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.transaction.event.TransactionPhase;
import org.springframework.transaction.event.TransactionalEventListener;

import javax.annotation.Resource;      
@Async
    @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT,fallbackExecution = true)
    public void invokeSyncTask(SyncTaskEvent syncTaskEvent) {
        try {
            log.info("異步線程觸發syncTask執行:{}", JsonUtils.obj2JsonStr(syncTaskEvent));
            // do something bussiness
        } catch (Exception e) {
            log.error("異步線程觸發syncTask執行異常", e);
        }

    }      

 @EventListener是正常事件監聽器

Spring還有針對事務的的事件監聽器@TransactionalEventListener,事務監聽器可以綁定到事務的階段。比如事務送出成功或復原後才觸發,

@TransactionalEventListener包裝了@EventListener注解,是普通監聽器的加強,但監聽器方法是通過回調觸發的,即在事務進行gcommit或者rollback的時候會回調監聽器方法進行回調。