工作第一天,让我完成用rabbitmq完成对某个信息的修改功能,由于我是新人,太久没使用rabbitmq,所以我花费了 大量时间,同时遇到了些bug,我也会在中间分享,然后再分享下我的代码。
第一个最变态的bug,提示框那里会一直刷新,主要是下面一直会刷新很烦,不晓得报啥错,你可以暂停下。
这个咋解决的我也搞忘了,但是为了防止它一直在刷新,你可以try,catch下,这样你可以看到报错。好像是传输的参数有问题,这个我弄了半天,后面解决的。一种方法是序列化,但是带我的人不推荐我使用,使用了另外一种,发过去的还是string类型,不过是json字符串,然后把json字符串再转换为对象。
org.springframework.amqp.rabbit.support.ListenerExecutionFailedException: Failed to convert message
还有就只direct交换机,那里参数不要加上routingkey,不然不行,不晓得为啥子,直接给交换机即可。
例如
rabbitTemplate.convertAndSend(RabbitDirectConfig.QUEUE_TASK_MES, JSONUtil.toJsonStr(vo));
绑定死信队列那里也遇上bug,明明没有问题,但是一直没绑定上,原来是要原本的队列删除掉,才可以绑定。
第一步
rabbitmqconfig,申明队列和交换机都在里面
package com.example.cloud.dataAcquisition.config;
import org.springframework.amqp.core.*;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitDirectConfig {
public static final String DIRECTNAME = "zhw-direct";
public static final String QUEUE_TASK_MES = "queue_task_mes";
public static final String ROUTINGKEY = "direct";
//死信
public static final String DEAD_EXCHANGE = "dead_exchange";
public static final String DEAD_QUEUE = "dead_queue";
public static final String DEAD_ROUTE = "dead_route";
//死信交换机
@Bean
public Exchange deadExchange() {
return ExchangeBuilder.directExchange(DEAD_EXCHANGE).build();
}
//死信队列
@Bean
public Queue deadQueue() {
return QueueBuilder.durable(DEAD_QUEUE).build();
}
//死信交换机绑定死信队列
@Bean
public Binding deadBinding(Exchange deadExchange,Queue deadQueue) {
return BindingBuilder.bind(deadQueue).to(deadExchange).with(DEAD_ROUTE).noargs();
}
@Bean("queue_task_mes")
public Queue queue(){
return QueueBuilder.durable(QUEUE_TASK_MES).deadLetterExchange(DEAD_EXCHANGE).deadLetterRoutingKey(DEAD_ROUTE).build();
}
@Bean("zhw-direct")
public DirectExchange directExchange(){
return new DirectExchange(DIRECTNAME,true,false);
}
@Bean
public Binding binding(@Qualifier("queue_task_mes") Queue queue, @Qualifier("zhw-direct") DirectExchange exchange){
return BindingBuilder.bind(queue).to(exchange).with(ROUTINGKEY);
}
}
发送和接受我就不发了,那还是挺简单,这个config绝对没有问题,本人亲测,死信队列绑上了去的