- 我有一個呼叫控制器的應用程式,它執行一些資料庫操作并在 spring 的控制器周期結束后提交它們
- 同樣在這個控制器本身中,我們引發了一個異步事件,該事件需要我們在執行控制器時持久保存在資料庫中的資料。
- 由于資料尚未保存在 db 中,我們無法在控制器仍在執行時在異步事件中訪問它。
我想要的是,這個異步事件的執行應該在控制器本身執行之后開始,是否可以在春天這樣做?
uj5u.com熱心網友回復:
使用注解@TransactionalEventListener(phase = TransactionPhase.AFTER_COMPLETION)定義在資料庫中的事務完成后觸發的事件監聽器:
@Component
public class TransactionEventListener {
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMPLETION)
public void afterCompletion(PayloadApplicationEvent<EventData> event) {
System.out.println("Event data: " event.getPayload().data);
}
}
使用 保存資料后發布事件ApplicationEventPublisher。請注意,該方法必須帶有注釋,@Transactional因為需要事務才能觸發事件。
@Autowired
private DataRepo dataRepo;
@Autowired
private ApplicationEventPublisher publisher;
@Async
@Transactional
public void storeData() {
...
dataRepo.save(data);
publisher.publishEvent(eventData);
...
}
uj5u.com熱心網友回復:
你可以使用spring aop來做到這一點。如果您使用的是 spring boot,您可以將 @EnableAspectJAutoProxy 添加到您的配置類之一,然后為您的控制器方法創建一個方面:
@Aspect
@Component
public class SomeAspect {
@Pointcut("execution(* org.demo..controller.SomeController.someMethod(..))")
private void someMethodJointcut(){}
@After("someMethodJointcut()")
public void doAfter(JoinPoint joinPoint) {
//use joinPoint.getArgs() get parameters that passed to the controller
//call your async method here
}
}
如果您需要訪問控制器呼叫的執行結果,請使用 around 建議。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/411877.html
標籤:
上一篇:異步加載React組件
下一篇:從物件陣列中洗掉重復項并更新鍵
