一. 创建SpringBoot项目
参照Spring官网,可快速创建一个SpringBoot的项目。
pom.xml的文件
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
启动成功后如下:
二, 了解RabbitMQ的模型
概念 | 解释 |
Broker | 即RabbitMQ的实体服务器。提供一种传输服务,维护一条从生产者到消费者的传输线路, 保证消息数据能按照指定的方式传输 |
Exchange | 消息交换机,指定消息按照什么规则路由到哪个队列Queue |
Queue | 消息队列,消息的载体,每条消息都会被投送到一个或多个队列中 |
Binding | 绑定。作用就是将Exchange和Queue按照某种路由规则绑定起 |
Routing Key | 路由关键字。Exchange根据Routing Key进行消息投递。定义绑定时指定的关键字称为 Binding Key |
Vhost | 虚拟主机。一个Broker可以有多个虚拟主机,用作不同用户的权限分离。一个虚拟主机持有 一组Exchange、Queue和Binding。 |
Producer | 消息生产者。主要将消息投递到对应的Exchange上面。一般是独立的程序 |
Consumer | 消息消费者。消息的接收者,一般是独立的程序 |
Connection | Producer 和 Consumer 与Broker之间的TCP长连接。 |
Channel | 消息通道,也称信道。在客户端的每个连接里可以建立多个Channel,每个Channel代表一 个会话任务。在RabbitMQ Java Client API中,channel上定义了大量的编程接口。 |
Consumer
***************************************************************************************************************************
@Configuration
public class RabbitConfig {
@Bean("firstQueue")
public Queue getFirstQueue(){ return new Queue("FIRST_QUEUE");}
@Bean("secondQueue")
public Queue getSecondQueue(){ return new Queue("SECOND_QUEUE");}
@Bean("thirdQueue")
public Queue getThirdQueue(){ return new Queue("THIRD_QUEUE");}
@Bean("fourthQueue")
public Queue getFourthQueue(){ return new Queue("FOURTH_QUEUE");}
@Bean("topicExchange")
public TopicExchange getTopicExchange(){return new TopicExchange("TOPIC_EXCHANGE");}
@Bean("directExchange")
public DirectExchange getSecondDirectExchange(){return new DirectExchange("DIRECT_EXCHANGE");}
@Bean("fountExchange")
public FanoutExchange getHarryFountExchange(){return new FanoutExchange("FOUNT_EXCHANGE");}
@Bean
public Binding bingFirst(@Qualifier("topicExchange") TopicExchange exchange,
@Qualifier("firstQueue") Queue queue){
return BindingBuilder.bind(queue).to(exchange).with("*.ginny.*");
}
@Bean
public Binding bingSecond(@Qualifier("directExchange") DirectExchange exchange,
@Qualifier("secondQueue") Queue queue){
return BindingBuilder.bind(queue).to(exchange).with("ginny.test");
}
@Bean
public Binding bingThird(@Qualifier("fountExchange") FanoutExchange exchange,
@Qualifier("thirdQueue") Queue queue){
return BindingBuilder.bind(queue).to(exchange);
}
@Bean
public Binding bingFourth(@Qualifier("fountExchange") FanoutExchange exchange,
@Qualifier("fourthQueue") Queue queue){
return BindingBuilder.bind(queue).to(exchange);
}
/**
* 创建监听
* @param connectionFactory 如果不创建监听,此处默认RabbitMQ的localhost
* @return
*/
@Bean("rabbitListenerContainerFactory")
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setMessageConverter(new Jackson2JsonMessageConverter());
factory.setAcknowledgeMode(AcknowledgeMode.NONE);
factory.setAutoStartup(true);
return factory;
}
}
***************************************************************************************************************************
@Component
@RabbitListener(queues = "FIRST_QUEUE", containerFactory="rabbitListenerContainerFactory")
public class FirstConsumer {
@RabbitHandler
public void process(@Payload String msg){
System.out.println("First Queue received msg : " + msg);
}
}
***************************************************************************************************************************
@Component
@RabbitListener(queues = "FOURTH_QUEUE", containerFactory="rabbitListenerContainerFactory")
public class FourthConsumer {
@RabbitHandler
public void process(@Payload String msg){
System.out.println("Fourth Queue received msg : " + msg);
}
}
***************************************************************************************************************************
@Component
@RabbitListener(queues = "SECOND_QUEUE", containerFactory="rabbitListenerContainerFactory")
public class SecondConsumer {
@RabbitHandler
public void process(@Payload String msg){
System.out.println("Second Queue received msg : " + msg);
}
}
***************************************************************************************************************************
@Component
@RabbitListener(queues = "THIRD_QUEUE", containerFactory="rabbitListenerContainerFactory")
public class ThirdConsumer {
@RabbitHandler
public void process(@Payload String msg){
System.out.println("Third Queue received msg : " + msg);
}
}
***************************************************************************************************************************
Consumer启动后,管理页面:自动创建对应的Exchange和Queue,以及对应的Binging
Producer
***************************************************************************************************************************
@Configuration
public class RabbitConfig {
/**
* 所有的消息发送都会转换成JSON格式发到交换机
* @param connectionFactory
* @return
*/
@Bean
public RabbitTemplate ginnyTemplate(final ConnectionFactory connectionFactory) {
final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
return rabbitTemplate;
}
}
***************************************************************************************************************************
@Component
public class RabbitSender {
@Autowired
RabbitTemplate ginnyTemplate;
public void send() {
ginnyTemplate.convertAndSend("DIRECT_EXCHANGE","ginny.test", "a direct msg : 中原镖局,汉中省解放路266号");
ginnyTemplate.convertAndSend("TOPIC_EXCHANGE","shanghai.ginny.test","a topic msg : shanghai.ginny.test");
ginnyTemplate.convertAndSend("TOPIC_EXCHANGE","changsha.ginny.test","a topic msg : changsha.ginny.test");
// 发送JSON字符串
//ObjectMapper mapper = new ObjectMapper();
String json = "a fanoutExchange msg : this message is from fanout";
ginnyTemplate.convertAndSend("FOUNT_EXCHANGE","", json);
}
}
***************************************************************************************************************************
Producer和Consumer启动后,Producer发送消息,运行结果如下: