安装RabbitMQ
由于RabbitMQ是基于erlang开发出来的,所以需要安装ErLang环境,再安装RabbitMQ。
附上安装教程链接~
RabbitMQ的流程逻辑
安装成功后,即可访问http://localhost:15672/,MQ的服务端。
这个页面中,Exchange标签对应的是交换机、Queue标签对应的是队列 。消费者是从队列中获取消息,而队列是和交换机进行绑定的,可以看如下流程图。
在RabbitMQ中有七个默认的交换机,常用的交换机有直连交换机(DirectExchange)、扇形交换机(FanoutExchange)、主题交换机(TopicExchange)
,本节主要记录一下直连交换机的用法,下节再讲扇形交换机与主题交换机。
直连交换机(DirectExchange)
开始编码
生产者代码与消费者代码可以放到一个项目中,也可以分开使用不同的项目进行存放。为方便学习,新建两个项目mqproducer以及mqcustomer。
先开始编写生产者代码mqproducer
pom文件依赖如下:
<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>
然后application.properties文件如下:
##项目名
spring.application.name = MqProducer
##配置rabbitmq
spring.rabbitmq.host = localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
##端口号
server.port=8961
接下来使用直连交换机,并将队列和交换机进行绑定。可以直接绑定MQ上的交换机,也可以自定义交换机进行绑定。
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ProducerConfig {
@Bean
Queue topicQueue(){
/**
* 四个参数
* 1.name:对应的是队列的名称
* 2.durable:对应的是队列是否持久化
* 3.exclusive:若设置为true,那么该队列只能被当前连接使用,连接关闭则队列删除。 优先级高于durable
* 4.autoDelete:对应的是是否自动删除队列(没有生产者或消费者使用此队列,则此队列自动删除)
*/
return new Queue("topicQueue",true);
}
@Bean
Binding bindingExchange(){
return BindingBuilder.bind(topicQueue()).to(new TopicExchange("amq.topic")).with("topic.*");
}
}
配置完毕后,启动项目就会新增队列,并和交换机进行绑定
接下来写一个简单的消息发送接口,按业务需求进行开发。
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@RestController
@RequestMapping("/mq")
public class ProducerAction {
@Autowired
RabbitTemplate rabbitTemplate;
@RequestMapping("/sending")
public void sending(){
try{
String uuid = String.valueOf(UUID.randomUUID());
String message = "This is a first message!";
String date = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date());
Map<String,Object> m = new HashMap<>();
m.put("messageId", uuid);
m.put("createTime",date);
m.put("message",message);
rabbitTemplate.convertAndSend("amq.topic","topic.man",m);
}catch(Exception e){
e.printStackTrace();
}
}
}
开发完成,启动项目后,访问接口,就可以发现现在有一条数据准备被消费。
生产者开发完成后,接下来新建消费者项目,开发消费者代码mqcustomer
pom文件依赖如下:
<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>
交换机与队列配置(在消费者中,该代码可以不用,只需要写底下的注解监听代码就可以了。但是加上了,会使得消费者也能生产消息。
)
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MqCustomerConfig {
@Bean
Queue directQueue(){
return new Queue("directQueue",true);
}
@Bean
Binding bindingExchange(){
return BindingBuilder.bind(directQueue()).to(new DirectExchange("amq.direct")).with("directRouting");
}
}
接下来就写一下监听消息的代码
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
@RabbitListener(queues = {"directQueue"})
public class MqCustomerListener {
@RabbitHandler
public void process(Map m){
System.out.println("接受到的消息为:"+m.toString());
}
}
RabbitListener注解是查看要监听哪个队列下再通过RabbitHandler注解处理数据
启动一下消费者项目,就会看到,消息已经被消费下来了
再访问一下生产者项目,发送一条消息。
消费者就实时消费了。
以上就是关于RabbitMQ在SpringBoot上简单的整合,并使用直连交换机生产消息与消费消息。