源码
连接上linux服务器
运行RabbitMQ,docker run -d -p 5672:5672 -p 15672:15672 --name myrabbitmq 9df8e9792ce6
第一个-p是客户端与RabbitMQ通信的端口
第二个-p是管理界面访问web界面的端口
绑定关系
消息队列要想起作用就要和交换器绑定
在Exchanges中点击需要绑定的交换器
可以看到*.news
匹配规则的都消息数量都增加了1,所以topic是有选择的广播
- 自动配置类(RabbitAutoConfiguration)
- 1、CachingConnectionFactory:;连接工厂
- 2、RabbitProperties: 封装了RabbitMQ的所有配置
- 3、RabbitTemplate:给RabbitMQ发送和接收消息
- 4、AmqpAdmin:RabbitMQ的系统管理组件
/*Message需要自己构造一个;定制消息体内容和消息头*/
rabbitTemplate.send(exchange,routeKey,message);
/*object默认当成消息体,只需要传入要发送的对象,自动序列化发送给rabbitmq*/
rabbitTemplate.convertAndSend(exchange,routeKey,object);
@Test
public void test01(){
Map map = new HashMap();
map.put("msg","这是第一个消息");
map.put("data", Arrays.asList("helloworld",123,true));
rabbitTemplate.convertAndSend("exchange.direct","atdanqing.news",map);
}
运行这个测试类,登录的web的管理界面,可以看到新增了一条消息
这些字节码是通过默认的java序列化后的样子,不直观,我们希望用json的序列化形式展现出来
如何将数据转化为json呢???
在与主程序相同的路径下创建config包,在该包下创建MyAMQPConfig类
在该类添加代码如下:
@Configuration
public class MyAMQPConfig {
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}
@Test
public void receive(){
Object o = rabbitTemplate.receiveAndConvert("atdanqing.news");
System.out.println(o.getClass());
System.out.println(o);
}
可以看到封装的HashMap数据,当我们取出这个数据时,队列当中就会失去这个消息
public class Book {
private String bookName;
private String author;
public Book(String bookName,String author) {
this.bookName = bookName;
this.author = author;
}
public Book() {
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Override
public String toString() {
return "Book{" +
"bookName='" + bookName + '\'' +
", author='" + author + '\'' +
'}';
}
}
@Test
public void test02(){
rabbitTemplate.convertAndSend("exchange.fanout","",new Book("三国演义","施耐庵"));
}
三个消息队列都会收到消息
只需要指定相应的路由键就可以了,和上面的类似,这里略过了
@Service
public class BookService {
@RabbitListener(queues = "atdanqing.news")//指定监听那一个消息队列
public void receive(Book book){
System.out.println("收到消息"+book);
}
}
@Test
public void test03(){
rabbitTemplate.convertAndSend("exchange.fanout","",new Book("西游记","吴承恩"));
}
这样得到的消息是没有消息头的,如果想要得到消息头用下面的方法
@RabbitListener(queues = "atdanqing")//指定监听那一个消息队列
public void receive02(Message message){
System.out.println(message.getBody());
System.out.println(message.getMessageProperties());
}
启动项目如果atdanqing消息队列里有消息就可以看到如图类似的形式,没有的话可以添加几个消息。
上面的这些操作都是因为Exchange和Queue都已经创建好了,如果没有创建好就需要在程序中用AmqpAdmin组件去创建。
AmqpAdmin的作用:创建和删除Quence,Exchange
@Autowired
AmqpAdmin amqpAdmin;
@Test
public void createExchange(){
amqpAdmin.declareExchange(new DirectExchange("amqpadmin.exchange"));
System.out.println("创建完成!!!");
}
amqpAdmin.declareQueue(new Queue("amqpadmin.queue",true));
amqpAdmin.declareBinding(new Binding("amqpadmin.queue",Binding.DestinationType.QUEUE,"amqpadmin.exchange","amqp.haha",null));