前提:需要下载Erlang OTP和RabbitMQ.(需要版本兼容)
Erlang OTP下载
链接:https://pan.baidu.com/s/14V0o5eY3dCYW67T_O39EVQ
提取码:i9pl
RabbitMQ下载
链接:https://pan.baidu.com/s/1vsH4tloTYuiGvN0j7iUddw
提取码:6xyr
怎么安装可以百度.
创建好一个maven项目,导入需要的依赖
<parent>
<groupId>org.springframework.boot</groupId>
<version>2.0.1.RELEASE</version>
<artifactId>spring-boot-starter-parent</artifactId>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
配置文件
spring:
rabbitmq:
host: localhost
username: guest
password: guest
virtual-host: /
port: 5672
rabbitMQ配置类
package com.mq.rabbitmq.config;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 配置类
*/
@EnableRabbit//声明开启
@Configuration
public class RabbitMQConfig {
//队列名称
public static final String QUEUE_NAME="boot-queue";
//队列名称
public static final String QUEUE_QUEUE="queue_queue";
//交换机
public static final String EXCHANGE_NAME="boot_exchange";
@Bean("queueQueue")
public Queue queueQueue(){
return QueueBuilder.durable(QUEUE_QUEUE).build();
}
@Bean("bootExchange")
public Exchange bootExchange(){
return ExchangeBuilder.topicExchange(EXCHANGE_NAME).durable(true).build();
}
@Bean("bootQueue")
public Queue bootQueue(){
return QueueBuilder.durable(QUEUE_NAME).build();
}
/**
* 连接交换机和队列
* @param queue
* @param exchange
* @return
*/
@Bean
public Binding bindQueueExchange(@Qualifier("bootQueue")Queue queue,@Qualifier("bootExchange")Exchange exchange){
return BindingBuilder.bind(queue).to(exchange).with("boot.#").noargs();
}
}
消费者类
package com.mq.rabbitmq.listener;
import com.mq.rabbitmq.config.RabbitMQConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Service;
/**
* 监听消费者
*/
@Slf4j
@Service
public class QueueConsumer {
/**
* fileBody:承载的是消息体
* @RabbitListener 监听消费者
* queue 队列名
* @param fileBody
*/
@RabbitListener(queues = {"ss007"})
public void receive(@Payload String fileBody){
log.info("ss007队列:"+fileBody);
}
}
生产者类
package com.mq.rabbitmq.controller;
import com.mq.rabbitmq.config.RabbitMQConfig;
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;
@RestController
public class SimpleProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
@RequestMapping("/ceshi")
public String ceshi( String messageId){
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = simpleDateFormat.format(new Date());
//ss007是队列的名称,format发送的消息
rabbitTemplate.convertAndSend("ss007",format);
System.out.println("rabbitMQ 简单模式消息发送成功!");
return "true";
}
}
结果是:
同一个生产者可以多种消息类型,消费者可以根据传递消息的类型直行不同的方法;
@RabbitListener既可以放在方法上有可以放在类上,放在类上的时候需要
@RabbitHandler放在方法上配合使用.
消费者类
package com.mq.rabbitmq.listener;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* 简单模式
* 消息消费者
*/
@Component
@Slf4j
@RabbitListener(queues = "my_queue")//监听的队列名称
public class SimpleConsumer {
//消费者如果监听到消息队列有消息传入,则会自动消费
@RabbitHandler
public void receive(Map message) {
System.out.println("简单模式 -> 消费者收到map类型消息 : " + message.toString());
}
//@RabbitListener(queues = "my_queue")//监听的队列名称
@RabbitHandler
public void receive2(String message) {
System.out.println("简单模式 -> 消费者收到string类型消息 : " + message.toString());
}
}
生产者类
package com.mq.rabbitmq.controller;
import com.mq.rabbitmq.config.RabbitMQConfig;
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;
@RestController
public class SimpleProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
@RequestMapping("/send")
public String send(String messageId, String messageData) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = simpleDateFormat.format(new Date());
messageId = "1";
messageData = "2";
Map<String, Object> map = new HashMap<>();
map.put("messageId", messageId);
map.put("messageData", messageData);
map.put("createTime", format);
rabbitTemplate.convertAndSend("my_queue", map);
System.out.println("rabbitMQ 简单模式消息发送成功!");
return "true";
}
@RequestMapping("/send1")
public String send1(String messageId) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = simpleDateFormat.format(new Date());
rabbitTemplate.convertAndSend("my_queue", format);
System.out.println("rabbitMQ 简单模式消息发送成功!");
return "true";
}
}
两个方法执行的结果:
使用exchange的fanout类型,fanout表示向所有的队列都发送该消息.
RabbitMQ配置类
package com.mq.rabbitmq.config;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 配置类
*/
@EnableRabbit//声明开启
@Configuration
public class RabbitMQConfig {
public static final String QUEUE_QUEUE="queue_queue";
public static final String QUEUE_QUEUE1="queue_queue1";
public static final String QUEUE_QUEUE2="queue_queue2";
public static final String EXCHANGE_QUEUE="queue_exchange";
@Bean("queueQueue")
public Queue queueQueue(){
return QueueBuilder.durable(QUEUE_QUEUE).build();
}
@Bean("queueQueue1")
public Queue queueQueue1(){
return QueueBuilder.durable(QUEUE_QUEUE1).build();
}
@Bean("queueQueue2")
public Queue queueQueue2(){
return QueueBuilder.durable(QUEUE_QUEUE2).build();
}
//设置交换机:fanout
@Bean("queueExchange")
public Exchange queueExchange(){
return ExchangeBuilder.fanoutExchange(EXCHANGE_QUEUE).durable(true).build();
}
@Bean
public Binding bindingQueueExchange(@Qualifier("queueQueue")Queue queue,@Qualifier("queueExchange")FanoutExchange exchange){
return BindingBuilder.bind(queue).to(exchange);
}
@Bean
public Binding fanoutQueueExchange(@Qualifier("queueQueue1")Queue queue,@Qualifier("queueExchange")FanoutExchange exchange){
return BindingBuilder.bind(queue).to(exchange);
}
@Bean
public Binding fanoutTwoQueueExchange(@Qualifier("queueQueue2")Queue queue,@Qualifier("queueExchange")FanoutExchange exchange){
return BindingBuilder.bind(queue).to(exchange);
}
}
消费者类
package com.mq.rabbitmq.listener;
import com.mq.rabbitmq.config.RabbitMQConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Service;
/**
* 监听消费者
*/
@Slf4j
@Service
public class QueueConsumer {
@RabbitListener(queues = RabbitMQConfig.QUEUE_QUEUE)
public void queue(@Payload String fileBody){
log.info(RabbitMQConfig.QUEUE_QUEUE+"测试成功");
System.out.println("第0个"+fileBody);
}
@RabbitListener(queues = RabbitMQConfig.QUEUE_QUEUE1)
public void queue1(@Payload String fileBody){
log.info(RabbitMQConfig.QUEUE_QUEUE1+"测试成功1");
System.out.println("第1个"+fileBody);
}
@RabbitListener(queues = RabbitMQConfig.QUEUE_QUEUE2)
public void queue2(@Payload String fileBody){
log.info(RabbitMQConfig.QUEUE_QUEUE2+"测试成功2");
System.out.println("第2个"+fileBody);
}
}
生产者类
package com.mq.rabbitmq.controller;
import com.mq.rabbitmq.config.RabbitMQConfig;
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;
@RestController
public class SimpleProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
@RequestMapping("/queue")
public String queue(String messageId) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = simpleDateFormat.format(new Date());
rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_QUEUE, format, "分发给每个绑定的队列.");
System.out.println("exchange的fanout类型分发给所有的队列,消息发送成功!");
return "true";
}
}
测试结果: