我有一個(gè) Spring 應(yīng)用程序,我們使用 spring-amqp 發(fā)布和監(jiān)聽來自 Rabbitmq 的消息。如果我的監(jiān)聽器拋出異常,我想修改我的 Rabbitmq 消息。當(dāng)偵聽器拋出異常時(shí),將使用恢復(fù)器和重試處理程序?qū)⑵渲匦虏东@。我正在修改偵聽器類中存在的 catch 塊中的消息。一旦消息被修改,我就會(huì)拋出異常,以便在一段固定的時(shí)間后再次重試該消息。這是我用來修改消息的代碼。public void onMessage(Message message, Channel channel) throws Exception{ try { if(message.getMessageProperties().getHeaders().get("x-retried-header") != null)//self defined header { throw new MyException(); } else { //some logic } } catch(MyException e) { MyClass myObject = new MyClass(); myObject.setMessage("Hello Message Is Being Retried"); MessageProperties properties = message.getMessageProperties(); properties.setHeader("x-retried-header", 1); message = MessageBuilder.withBody(myObject.toByteArray()).andProperties(properties).build(); throw new Exception(); } }當(dāng)我的恢復(fù)程序收到 RabbitMq 消息時(shí),消息正文沒有更改,而我添加到修改后的消息中的標(biāo)頭正在正確反映。我還可以在兔子處理程序中處理或修改我的消息,但我不想更改恢復(fù)程序和重試處理程序中的任何內(nèi)容,因?yàn)槠渌麄陕犉饕彩褂昧诉@些處理程序。有人可以幫我解決這個(gè)問題嗎?為什么我收到的是原始消息正文而不是修改后的消息正文?Spring-amqp 在這里使用任何克隆對(duì)象嗎?當(dāng)偵聽器拋出異常時(shí),是否有其他方法可以使用 spring-amqp 修改我的 RabbitMq 消息正文?
1 回答

慕哥9229398
TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊
消息正文一旦發(fā)送到 RabbitMQ 隊(duì)列,就無法修改。
如果它被消費(fèi)者接受,即沒有錯(cuò)誤,它就會(huì)從隊(duì)列中刪除該消息。如果消費(fèi)者沒有正確使用它,即發(fā)生錯(cuò)誤,RabbitMQ 會(huì)重新排隊(duì)消息(如果啟用了自動(dòng)重新排隊(duì))。
解決方法:
您可以通知 RabbitMQ 消息已成功消費(fèi),但您可以克隆消息并將消息作為新消息重新發(fā)送。
希望能幫助到你。
添加回答
舉報(bào)
0/150
提交
取消