rabbitmq简介
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。 ----百度百科
安装rabbitmq
我之前在我的阿里云的docker里装了一个rabbitmq,带图形化界面的,大家有需要可以去我的docker学习四来学习怎么在docker里面装,即装即用非常方便
与Springboot整合
pom文件中添加
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
</dependency>
添加aoolication.yml配置你的rqbbitmq
rabbitmq:
username: guest
host: 你的公网ip
password: guest
这个端口默认为5672,访问你的根目录
主类开启@EnableRabbit
@SpringBootApplication
@MapperScan("com.fehead.testproject.dao")
@EnableRabbit//开启注解的rabbitmq
public class App
{
public static void main( String[] args )
{
System.out.println( "Hello World!" );
SpringApplication.run(App.class,args);
}
}
新建一个配置类,改变rabbitmq默认的jdk序列化
package com.fehead.testproject.configuration;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyAMQPConfig {
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}
测试类测试
这里首先要注入 RabbitTemplate
@Autowired
private RabbitTemplate rabbitTemplate;
单播
@Test
public void contextLoads(){
//Message需要自己构造一个;定义消息体的内容和消息头
// rabbitTemplate.send(exchange,routeKey,message);
//object默认当成消息体,只需要传入要发送的对象,自动化序列发给irabbitmq
//rabbitTemplate.convertAndSend(exchange,routeKey,object);
Map<String,Object> map=new HashMap<>();
map.put("name",Arrays.asList("dasd",1323,"dsada"));
//单播,对象经序列化后发出去
rabbitTemplate.convertAndSend("exchange.direct","kaikai.news",map);
}
- convertAndSend跟三个参数,第一个参数为你的交换器名字(广播,单播等等),第二个参数为你的队列名字,第三个参数为你消息
这个方法可以直接连接到我们的rabbitmq指定交换器与队列名发送消息
这个测试方法用来接收指定队列的消息,返回一个object类型
@Test
public void receive(){
Object mes= rabbitTemplate.receiveAndConvert("kaikai.news");
System.out.println(mes.getClass());
System.out.println(mes);
}
- receiveAndConvert跟的参数为队列名字
返回值的类型与值入下
广播
/**
* 广播模式
*/
@Test
public void sending(){
UserDO userDO=new UserDO();
userDO.setId(2);
userDO.setUserEmail("shabiqiaojia@qq.com");
rabbitTemplate.convertAndSend("exchange.fanout","",userDO);
}
开启广播即可不用指定队列名,这里我们传入一个对象做消息
后台在队列中即可看见消息头和消息体
我们想要实时监听消息怎么办呢
这里我们建了个service层,在里面监听接受消息的队列
@Service
public class UserserviceImpl implements UserService {
@RabbitListener(queues = "kaikai.news")
public void receive(UserDO userDO){
System.out.println("received! Meg:" + userDO);
}
@RabbitListener(queues = "kaikai")
public void receive2(Message message){
System.out.println(message.getMessageProperties());
System.out.println(message.getBody());
}
}
- @RabbitListener(queues = “kaikai.news”),运用注解监听指定队列名
可以返回你的useDO实体类,也可以返回一个Message对象
- getMessageProperties(),得到消息头
- getBody(),得到消息体
返回如下信息
received! Meg:UserDO(id=2, userName=null, userPhone=null, userAge=null, userEmail=aijiajia@qq.com)
MessageProperties [headers={__TypeId__=com.fehead.testproject.dataobject.UserDO}, contentType=application/json, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=exchange.fanout, receivedRoutingKey=, deliveryTag=3, consumerTag=amq.ctag-Ar-TE6kXA3VfrZcVEmFdUA, consumerQueue=kaikai]
[B@11b4d10