springboot整合rabbitMQ
1.新建工程
使用idea中的springboot初始化器新建工程,选rabbitmq和web依赖;
2.yml配置
spring: rabbitmq: host: 192.168.1.38 username: guest #rabbitmq默认用户名和密码都是guest password: guest
3.发送消息
junit测试代码:
使用RabbitTemplate来操作RabbitMQ发送消息;
RabbitTemplate的实例被RabbitMQ的自动配置类注入ioc容器,可以用@Autowired自动装配;
@RunWith(SpringRunner.class) @SpringBootTest public class TestRedis { @Autowired private RabbitTemplate template; @Test public void testDirect(){ Map<String, Object> msg = new HashMap<>(); msg.put("name", "诸葛孔明"); msg.put("job", "丞相"); msg.put("words", "我从未见过有如此厚颜无耻之人"); //参数:交换器名、路由键、消息 template.convertAndSend("exchanger.direct", "cat.voice", msg); } }
结果:
消息队列中新增了一条消息,但默认使用的是jdk提供的序列化器来序列化消息对象的;
4.接收消息
代码:
@Test public void receiveDirect(){ //参数:队列名 Object msg = template.receiveAndConvert("cat.voice"); System.out.println(msg); }
结果:
消息队列中的消息已被取出;队列里少了一条消息;
5.以json的格式发送消息
原理:只需要在ioc容器中放一个消息转换器,用来替换默认的amqp消息转换器即可;
步骤:新建一个配置类,用@Bean想ioc容器中添加组件
消息转换器类:org.springframework.amqp.support.converter.MessageConverter
配置类:
@Configuration public class RabbitConfig { @Bean public MessageConverter messageConverter(){ return new Jackson2JsonMessageConverter(); } }
发送消息测试:
队列新增了一条消息,以json格式保存;
6.消息监听器
比如两个系统通过rabbitmq做数据交互;
订单系统发送消息,库存系统需要监听消息,然后做相关操作;
也就是说消息的消费者需要监听消息队列,只要队列中有消息进来就需要做一些操作;
开启rabbitmq注解模式:
在工程启动类中添加注解
@EnableRabbit
业务类:
使用@RabbitListener注解监听队列
@Service public class RabbitService { //监听队列cat.voice @RabbitListener(queues = "cat.voice") public void listenRabbit(Object msg){ System.out.println("收到消息:"+ msg); } }
发送消息测试:
发送的消息被业务类消费,队列中没有消息;
7.使用AmqpAdmin管理交换器、绑定规则、队列
@RunWith(SpringRunner.class) @SpringBootTest public class TestRabbit { @Autowired private AmqpAdmin admin; //创建exchange @Test public void createExchange(){ admin.declareExchange(new DirectExchange("amqp.admin.exchange")); } //创建队列 @Test public void createQueue(){ admin.declareQueue(new Queue("amqp.admin.queue")); } //创建绑定 @Test public void createBinding(){ admin.declareBinding(new Binding("amqp.admin.queue", Binding.DestinationType.QUEUE, "amqp.admin.exchange", "routing.key", null ) ); } }