此次主要介紹jmsTemplate errorHandler
目標:可以讓jmsTemplate 有errorHandler(例外處理)
雖然很白話但這是事實,不過我們先開始介紹一下ExceptionHandler
以前接觸的spring web
是使用@ControllerAdvice可以註冊 當Request Api來的請求,若發生錯誤可以進行例外處理
現在接觸的spring jms
是使用一般的ErrorHandler實作出來 註冊到jmsTemplate這個機制中
必須知識:
java 8
spring系列
MVC 分層抽離
mq的基本知識
可能需要會通靈,解釋性資訊不多XD
spring boot核心應用為以下
- spring starter
- mq spring starterspring
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.11</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependency> <groupId>com.ibm.mq</groupId> <artifactId>mq-jms-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency>
JmsErrorHandler.class 實作ErrorHandler
@Slf4j
@Configuration
public class JmsErrorHandler implements ErrorHandler {
private static final Gson gson = new GsonBuilder().setPrettyPrinting().create();
@Override
public void handleError(Throwable t) {
Throwable retrieved = t.getCause();
Exception exception = (Exception) retrieved;
String errorResponse = exception.toString();
log.info(gson.toJson(errorResponse)); // 因為此範例會將錯誤顯示在server log/ console
}
}
上篇用到的class 設定到jmsTemplate
factory.setErrorHandler(jmsErrorHandler);
@Slf4j
@EnableJms
@Component
public class JmsListener {
@Autowired
JmsErrorHandler jmsErrorHandler;
@Bean
public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory,
DefaultJmsListenerContainerFactoryConfigurer configurer) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
configurer.configure(factory, connectionFactory);
factory.setErrorHandler(jmsErrorHandler);
return factory;
}
}
應用時
JmsMessageService省略介面
直接實作
@Service
public JmsMessageServie implment JmsMessageService{
if(Bollean.FALSE.equals(sthFlag)){
throw new IOException("存取錯誤");
}
}
補充:
需要有mq服務 建議可以使用containter方便又快速
主要是給自己的一個紀錄,也分享給有需要的夥伴
註解部分有提及一些參考的連結,有興趣可以點進去看看喔
這是一個心血來潮,產生的文章
若有喜歡或交流的部分都歡迎在下方留言,多多關照。