SpringCloud 應(yīng)用錯誤處理

2023-11-26 16:16 更新

有兩種類型的應(yīng)用程序級錯誤處理。可以在每個綁定訂閱中處理錯誤,或者全局處理程序可以處理所有綁定訂閱錯誤。讓我們查看詳細信息。

圖29.1 具有自定義和全局錯誤處理程序的Spring Cloud Stream接收器應(yīng)用程序

自定義與全局錯誤通道

對于每個輸入綁定,Spring Cloud Stream創(chuàng)建具有以下語義<destinationName>.errors的專用錯誤通道。

 <destinationName>由綁定的名稱(例如input)和組的名稱(例如myGroup)組成。

考慮以下:

spring.cloud.stream.bindings.input.group=myGroup
@StreamListener(Sink.INPUT) // destination name 'input.myGroup'
public void handle(Person value) {
	throw new RuntimeException("BOOM!");
}

@ServiceActivator(inputChannel = Processor.INPUT + ".myGroup.errors") //channel name 'input.myGroup.errors'
public void error(Message<?> message) {
	System.out.println("Handling ERROR: " + message);
}

在前面的示例中,目標(biāo)名稱為input.myGroup,專用錯誤通道名稱為input.myGroup.errors。

 @StreamListener批注的使用專門用于定義橋接內(nèi)部通道和外部目標(biāo)的綁定。假設(shè)目標(biāo)特定錯誤通道沒有關(guān)聯(lián)的外部目標(biāo),則該通道是Spring Integration(SI)的特權(quán)。這意味著必須使用SI處理程序注釋之一(即@ ServiceActivator,@ Transformer等)定義用于此類目標(biāo)的處理程序。

 如果未指定group,則使用匿名組(類似于input.anonymous.2K37rb06Q6m2r51-SPIDDQ),這不適用于錯誤處理方案,因為在創(chuàng)建目標(biāo)之前,您不知道它將是什么。

另外,如果您綁定到現(xiàn)有目的地,例如:

spring.cloud.stream.bindings.input.destination=myFooDestination
spring.cloud.stream.bindings.input.group=myGroup

完整的目標(biāo)名稱為myFooDestination.myGroup,然后專用錯誤通道名稱為myFooDestination.myGroup.errors

回到例子...

預(yù)訂名為input的通道的handle(..)方法會引發(fā)異常。給定錯誤通道input.myGroup.errors的訂閱者,所有錯誤消息均由該訂閱者處理。

如果您有多個綁定,則可能需要一個錯誤處理程序。Spring Cloud Stream 通過將每個單獨的錯誤通道橋接到名為errorChannel的通道來自動提供對全局錯誤通道支持,從而允許單個訂閱者處理所有錯誤,如以下示例所示:

@StreamListener("errorChannel")
public void error(Message<?> message) {
	System.out.println("Handling ERROR: " + message);
}

如果錯誤處理邏輯相同,則與哪個處理程序產(chǎn)生錯誤無關(guān),這可能是一個方便的選擇。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號