最近在做項目時依痊,在“發(fā)送系統(tǒng)通知”功能模塊采用kafka作為消息中間件都伪,使用生產者發(fā)送消息時出現(xiàn)空指針異常,后發(fā)現(xiàn)與日志記錄功能(使用AOP織入)出現(xiàn)沖突策州,修改后解決問題埠褪,具體如下浓利。
版權聲明:本文為博主原創(chuàng)文章,禁止轉載
作者博客:codesong.cn
created: 2019-12-05
功能描述
項目為一個類似于百度貼吧的社區(qū)項目钞速,采用Spring Boot框架贷掖。
在評論(comment)、點贊(like)渴语、關注(follow)等高頻使用的功能上采用了kafka消息隊列苹威,出現(xiàn)以上三種行為時,生產者(producer)會發(fā)送一個事件(event)到消息隊列中驾凶。
觸發(fā)事件后牙甫,生產者將消息以JSON串的格式發(fā)送到隊列中。在評論调违、點贊等功能對應的controller加入生產者窟哺,部分代碼如下:
// 觸發(fā)評論事件
Event event = new Event()
.setTopic(TOPIC_COMMENT)
.setUserId(hostHolder.getUser().getId()) //用戶id
.setEntityType(comment.getEntityType()) //實體類型
.setEntityId(comment.getEntityId()) //實體id
.setData("postId", discussPostId); //帖子id
eventProducer.fireEvent(event); //發(fā)送系統(tǒng)通知
報錯及原因
啟動zookeeper、kafka后啟動項目進行測試技肩,在帖子下發(fā)表評論且轨,訪問數據庫發(fā)現(xiàn)評論事件沒有存在數據庫中(沒有加入消息隊列),且控制臺出現(xiàn)如下報錯:
點擊錯誤信息虚婿,發(fā)現(xiàn)之前“統(tǒng)一記錄日志”功能中旋奢,使用AOP織入了日志記錄功能:
空指針異常出現(xiàn)在attribute對象,attribute是與請求有關的對象然痊,在加入生產者-消費者模型之前至朗,AOP攔截的是service,而所有的service都是通過controller調用的剧浸。
加入消費者之后锹引,消費者會調用評論、點贊等service辛蚊,而不是controller調用了service粤蝎,因此沒有請求(request),此時attribute對象為空袋马,導致報錯。
解決方法
在記錄日志功能的AOP出現(xiàn)異常的地方秸应,判斷當前對象是否為空虑凛,如果為空(消費者調用而不是controller調用)就返回
重新啟動項目進行測試碑宴,發(fā)現(xiàn)數據庫中已經能查詢到評論、點贊桑谍、關注等操作觸發(fā)的消息事件延柠,說明使用生產者-消費者模式統(tǒng)一發(fā)送通知功能已經正確實現(xiàn),問題解決锣披。
因此贞间,在寫代碼時要多考慮業(yè)務的邏輯,思考會不會出現(xiàn)為空的情況雹仿。