今天给大家介绍一下我们项目中是如何集成RabbitMQ,因为用到MQ的地方不是很多,所以只是简单的用到exchange中的direct类型,至于其它的3个类型:topic,fanout,header我就不做过多的介绍了,在以后的章节里面再给大家具体的介绍。关于RabbitMQ的集成其实很简单,比起昨天的Quartz来说算是很简单的了,好了现在就开始我们今天的内容了。
pom添加依赖
首先我们先引入RabbitMQ的相关依赖
org.springframework.boot
spring-boot-starter-amqp
配置RabbitMQ
依赖引入之后,我们就可以配置RabbitMQ的链接了,这边我们用的是RabbitTemplate。具体的代码如下所示:
/**
*
* RabbitMQ的配置文件
* @author qiang220316
* @date 2018/8/9
*/
@Configuration
public class RabbitMqConfig {
@Value("${spring.rabbitmq.host}")
private String addresses;
@Value("${spring.rabbitmq.port}")
private String port;
@Value("${spring.rabbitmq.username}")
private String username;
@Value("${spring.rabbitmq.password}")
private String password;
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setAddresses(addresses+":"+port);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
connectionFactory.setConnectionTimeout(60000);
connectionFactory.setPublisherConfirms(true);
return connectionFactory;
}
/**
* rabbitAdmin代理类
* @return
*/
@Bean
public RabbitAdmin rabbitAdmin(){
return new RabbitAdmin(connectionFactory());
}
@Bean
public MessageConverter jsonMessageConverter() {
return new Jackson2JsonMessageConverter();
}
/**
* 因为要设置回调类,所以应是prototype类型,如果是singleton类型,则回调类为最后一次设置
*/
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
@Bean("rabbitTemplate")
public RabbitTemplate rabbitTemplate() {
RabbitTemplate template = new RabbitTemplate(connectionFactory());
template.setMessageConverter(jsonMessageConverter());
return template;
}
@Bean
public Queue goodsQueue() {
Queue goodsQueue = new Queue("test-queue",true,false,false);
return goodsQueue;
}
@Bean
DirectExchange mqDirectExchange() {
return new DirectExchange("mq-exchange",true,false);
}
@Bean
Binding bindingExchangSmsQueue(Queue smsQueue, DirectExchange mqDirectExchange) {
Binding binding = BindingBuilder.bind(smsQueue).to(mqDirectExchange).with("test-queue");
return binding;
}
}
生产者
配置类搞定之后,我们接下来就需要编写MQ的发送消息类和消息接收处理类,因为这边我为了简单,所以这个项目既是消息的发送者,又是消息的消费者,我们首先看一下消息的发送者是如何实现的。
/**
* 消息发送者
*
* @Author qiang220316
* @Description 消息发送者
*/
@Service
public class TestQueueSend {
private static final Logger LOGGER = LoggerFactory.getLogger(TestQueueSend.class);
@Autowired
private AmqpTemplate rabbitTemplate;
/**
* @param queueName 路由key(这里设置了路由key与队列名称一样了)
* @param object 发送对象
* @throws Exception
*/
public void sendQueue(String queueName, Object object) throws Exception {
rabbitTemplate.convertAndSend("mq-exchange",queueName, object);
LOGGER.info("队列" + queueName + ",【消息提供者】发送成功!");
}
}
消费者
消息发送者最核心的其实就是通过rabbitTemplate调用消息发送就可以了,代码上面来说是非常简单的。发送者说完了,我们再来看一下消息消费者是怎么实现的呢,具体代码如下所示:
/**
* 消息队列监听器
* @author qiang220316
*/
@Component
public class TestQueueListener {
private static final Logger logger = LoggerFactory.getLogger(TestQueueListener.class);
@RabbitHandler
@RabbitListener(queues = "test-queue")
public void process(Message message) {
logger.info("MQ消息接收成功");
}
}
需要注意的是我们需要在处理消息的方法上面添加关于RabbitMQ的监听消息的注释,也就是我们在代码上面看到的@RabbitHandler和@RabbitListener(queues = “test-queue”),其中queues = “test-queue”是我们配置的消息队列名称。
消息测试
发送者和接收者都介绍完了,现在我们可以做最后的工作了,也就是测试了。这边我们先写一个测试控制类,然后通过它来发送消息,看看是否消息会被处理,控制类代码如下所示:
/**
* 接口测试控制类
* @author qiang220316
* @date 2018/8/9
*/
@RestController
public class RabbitMqController {
@Autowired
private TestQueueSend testQueueSend;
@RequestMapping("rabbit")
public String sendMQ(){
try {
testQueueSend.sendQueue("test-queue","我是消息");
} catch (Exception e) {
e.printStackTrace();
}
return "控制类开始发送消息";
}
}
测试结果
控制类搞定了,最后我们通过浏览器测试就可以了。我们先在浏览器中输入发送MQ的地址,如下所示:
在控制台中我们可以明显的看到,消息已经成功被消费者给消费了,这就说明我们集成是成功的。
进入RabbitMQ的后台,我们也可以很明显的看到消息已经添加进去了。
集成MQ过程还是很简单,比较坑的一点是本地测试因为Queue和测试环境的Queue名称一模一样,所以导致消息会被测试环境的消费者给消费掉,然后本地就没有打印消费日志,其实是被测试环境的MQ消费掉了。然后还有一点比较坑的是,因为测试环境的exchange是direct类型,然后本地用的是topic类型,因为类型不一致所以导致消息一直没有被消费掉,这点大家也要注意。最重要的一点,这些测试的前提是RabbitMQ服务器已经搭建完毕,否则所以的测试都是行不通的。
github地址:https://github.com/1913045515/SpringBoot/tree/master/SpringBoot/SpringBootRabbitMQ
推荐阅读
【SpringBoot系列】手把手教你集成Quartz定时任务
【SpringBoot系列】手把手教你集成Log4j2日志
【SpringBoot系列】手把手教你集成MongoDB集群
【SpringBoot系列】手把手教你集成Redis集群
【SpringBoot系列】手把手教你集成Dubbo
【SpringBoot系列】手把手教你集成ElasticSearch