一、RabbitMQ简述与其docker安装
这里主要讲解实战整合rabbitMQ,了解RabbitMQ简述与其docker安装请点击:传送门
二、springboot整合rabbitMQ
1.新建springboot项目
2.pom:主要添加以下两个依赖
org.springframework.boot spring-boot-starter-web2.2.2.RELEASE org.springframework.boot spring-boot-starter-amqp2.5.5
3.yaml:
server: port: 5672 spring: rabbitmq: host: 192.168.80.88 #mq服务器ip,默认为localhost # port: 5672 #mq服务器port,默认为5672 # username: guest #mq服务器username,默认为gust # password: guest #mq服务器password,默认为guest
4.主启动类:
@SpringBootApplication public class RabbitMqMain5672 { public static void main(String[] args) { SpringApplication.run(RabbitMqMain5672.class,args); } }
5.业务类发送消息:
5.1先说一下RabbitTemplate发送消息的两个方法:
-
sent():Message需要自己构造
-
(常用) convertAndSent(): message自动序列化发送给MQ
5.2代码:
@SpringBootTest class MyRabbitmqTest { @Autowired RabbitTemplate rabbitTemplate; @Test public void myTest(){ ConcurrentHashMap myMap = new ConcurrentHashMap(); myMap.put(0,"神司马懿"); myMap.put(1,"界徐盛"); myMap.put(2,"曹钝"); myMap.put(3,"骆统"); rabbitTemplate.convertAndSend("swl.direct","1",myMap); } }
5.3 登录rabbitMq验证:
发现名为swl.direct的exchage发送给了queue1一条消息;但是发现内容是一堆乱码(后)
6.业务类接受消息:
6.1先看一下RabbitTemplate收消息的两个方法:可以看到receive转化为Message,而receiveAndConvert转化为Object
6.2 代码:
@Test public void receiveTest(){ Object o = rabbitTemplate.receiveAndConvert("swl.queue1"); String s = o.toString(); System.out.println(s); }
运行发现收到一条消息:
再去mq看发现队列swl.queue1中的消息已经没了
7.更改序列化的方式
7.1为什么为乱码呢?打开RabbitTemplate的源码,可见Rabbitmq默认用的是SimpleMessageConverter()序列化;
7.2另外我们实际开发中发送接受的消息一般为json,我们可以换个序列化方式:我们看到MessageConverter接口的实现类有多个我们选择Jackson2JsonMessageConverter
7.3代码:
@Configuration public class MyMqconfig { @Bean public MessageConverter getMessageConverter(){ return new Jackson2JsonMessageConverter(); } }
7.4再次发送数据,发现已经为json格式,除了集合外,实体类也可以
解释一下为什么将我们设置的MessageConverter 放入容器就可以代替原来的SimpleMessageConverter();看RabbitAutoConfiguration源码发现
其实我们重写RabbitTemplate也可以的
8.设置监听
在一个方法上添加@RabbitListener参数为队列的名,方法参数就是收到的消息。
@Service public class MyRabbitmq { @RabbitListener(queues = "swl.queue1") public void doSomeThing(Object object){ System.out.println("收到!"+object.toString()); } }
9.amqp创建exchage与queue
前面的exchage与queue都是在rabbitMq的控制台创建好的,amqpAdmin可以用在代码创建exchage与queue amqpAdmin与rabbitTemplate一样也是RabbitAutoConfiguration自动注入的组件
新建exchage、新建queue、新建binding即可
@Test public void creatExchage(){ DirectExchange directExchange = new DirectExchange("Exchange666"); amqpAdmin.declareExchange(directExchange); Queue queue111 = new Queue("queue111"); amqpAdmin.declareQueue(queue111); amqpAdmin.declareBinding(new Binding("queue111",Binding.DestinationType.QUEUE,"Exchange666","1", null)); }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)