日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
為什么我不推薦你使用RabbitMQ的消息轉(zhuǎn)換功能

改版:

創(chuàng)新互聯(lián)是專業(yè)的鄉(xiāng)寧網(wǎng)站建設(shè)公司,鄉(xiāng)寧接單;提供成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行鄉(xiāng)寧網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

發(fā)送消息與訂閱消息取消使用amqp提供的消息序列化與反序列化功能,使用String類型,發(fā)送消息時(shí)手動(dòng)轉(zhuǎn)化為json字符串再發(fā)送,消費(fèi)消息時(shí)手動(dòng)json反序列化。

背景:

如果使用自動(dòng)序列化與反序列化功能,即給Rabbitmq配置Jackson2JsonMessageConverter消息轉(zhuǎn)化器,當(dāng)我們修改消息Body的java類型名稱或者包名時(shí),消費(fèi)歷史消息就會(huì)拋出ClassNotFoundException異常。

1、不做兼容上線,但需要:

  • 確保不會(huì)有新的消息進(jìn)入隊(duì)列;
  • 確保隊(duì)列中的消息已經(jīng)消費(fèi)完。

2、粗暴方式,直接清空隊(duì)列,丟棄歷史消息;

3、做兼容,給舊消息創(chuàng)建一個(gè)類名匹配的消息Body類型,添加一個(gè)@RabbitHandler方法處理舊消息。

這是因?yàn)镽abbitmq為了實(shí)現(xiàn)一個(gè)隊(duì)列支持多個(gè)方法消費(fèi)(即@RabbitHandler注解的方法),每個(gè)方法消費(fèi)不同Java類型的消息Body,在消費(fèi)到消息時(shí),就需要先反序列化出消息Body,才能根據(jù)消息Body的類型去匹配一個(gè)消費(fèi)方法消費(fèi)消息,如DelegatingInvocableHandler#invoke方法源碼所示。

 
 
 
 
  1. // org.springframework.amqp.rabbit.listener.adapter.DelegatingInvocableHandler#invoke 
  2. public InvocationResult invoke(Message message, Object... providedArgs) throws Exception {  
  3.    // 獲取消息body類型 
  4.    Class payloadClass = message.getPayload().getClass(); 
  5.    // 匹配的方法 
  6.    InvocableHandlerMethod handler = getHandlerForPayload(payloadClass); 
  7.    // 調(diào)用方法消費(fèi) 
  8.    Object result = handler.invoke(message, providedArgs); 
  9.    //.... 

由于需要在匹配消息消費(fèi)方法之前就需要解析出消息Body,也就是要先知道消息Body的Java類型才能實(shí)現(xiàn)json反序列化,這就要求消息生產(chǎn)者在發(fā)送消息時(shí)不得不在消息頭添加一個(gè)參數(shù)表示消息Body的Java類型,如下圖所示。

在消息消費(fèi)階段,Jackson2JsonMessageConverter也需要先根據(jù)消息頭的TypeId獲取JavaType,再執(zhí)行反序列化操作,當(dāng)類名修改時(shí),或者生產(chǎn)者和消費(fèi)者各自定義的類名不同,都將會(huì)導(dǎo)致反序列化失敗。

除非確保消息Body的類名不會(huì)變,且生產(chǎn)者與消費(fèi)者定義的完整類名相同,否則不建議使用自動(dòng)序列化與反序列化功能。

本文轉(zhuǎn)載自微信公眾號(hào)「Java藝術(shù)」,作者wujiuye 。轉(zhuǎn)載本文請(qǐng)聯(lián)系Java藝術(shù)公眾號(hào)。  


網(wǎng)頁題目:為什么我不推薦你使用RabbitMQ的消息轉(zhuǎn)換功能
文章來源:http://m.5511xx.com/article/dpjphpj.html