業務場景: 有時候需要一個動作之後觸發另外一個動作,類似消息的機制。但使用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的時候會回調監聽器方法進行回調。