相關背景:
微服務場景下,配置了統一全域性異常處理,導致seata在at模式下無法正常回滾問題
spring boot版本 2.2.2 cloud 版本 hoxton.release
seata版本1.4
假設服務a呼叫服務b, 服務b發生異常,由於全域性異常處理的存在(@controlleradvice), seata 無法攔截到b服務的異常,從而導致分布式事務未生效
利用aop攔截@globaltransactional 檢查是否發生異常,如有異常,則回滾事務
上**
/**
* seata at模式下事務異常回滾操作, 僅需在全域性事務發起端配置此handle
*/@slf4j
@aspect
@component
public
class
attransactionalhandler
@afterthrowing
(throwing =
"throwable"
, pointcut =
"txannotation()"
)public
void
doafterreturning
(throwable throwable)
log.
info
("aop
----
--- 全域性事務回滾--
---xid:
----
--》", globaltransaction.
getxid()
);trycatch
(transactionexception e)
}}
由於aop只能處理主事務端異常,而無法處理從事務端異常,而且我們配置了全域性異常處理,所以rpc一定會有返回值
所以在每個全域性事務方法最後, 需要判斷rpc是否發生異常
發生異常則丟擲runtimeexception, 配置的aop攔截則會回滾事務
分布式全域性異常處理
1 定義異常類 public class bizexception extends runtimeexception public bizexception int errorcode,string errormsg public bizexception string errormsg publi...
SpringMvc全域性異常處理器配置
在程式開發中,我們的程式無法避免的會碰到各種異常情況,配置全域性異常處理可以方便開發人員編寫和管理異常處理的 第一步 自定義異常類如customexception類繼承exception類 public class customexception extends exception public s...
如何建立真正的STRUTS2 全域性異常配置
近期看了下struts2.0 發現可以對異常以配置的方式進行特定的處理,這可是非常實用的功能,於是乎拉出來練練。原來一些書籍中描述的全域性配置只是針對某給包內的全域性配置,如下 error.jsp orgorg addorg.jsp 那該所謂的全域性異常只是針對該包內的配置起作用,那如何配置真正的全...