(HelloWorld)模型
- P:生产者,也就是要发送消息的程序
- C:消费者:消息的接受者,会一直等待消息到来。
- queue:消息队列,图中红色部分。类似一个邮箱,可以缓存消息;生产者向其中投递消息,消费者从其中取出消息。
maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
application.properties
spring.rabbitmq.host=192.168.56.101
spring.rabbitmq.port=5673
spring.rabbitmq.username=test
spring.rabbitmq.password=123456
spring.rabbitmq.virtual-host=/ems
RabbitConfig
@Configuration
public class RabbitConfig {
//队列TestDirectQueue
@Bean
public Queue TestDirectQueue() {
// durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
// exclusive:默认也是false,是否独占队列
// autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。
return new Queue("TestDirectQueue",true,false,false);
}
}
生产者
@RestController
public class SendMessageController {
@Autowired
RabbitTemplate rabbitTemplate; //使用RabbitTemplate,这提供了接收/发送等等方法
@GetMapping("/sendDirectMessage")
public String sendDirectMessage() {
//第一个参数是交换机名称,由于没有"",第二个是routingKey
//生产端没有指定交换机只有routingKey和Object,也就是说这个消费方产生hello队列,放在默认的交换机(AMQP default)上。
//而默认的交换机有一个特点,只要你的routerKey与这个交换机中有同名的队列,他就会自动路由上。
//生产端routingKey 叫TestQueue,消费端生产TestQueue队列。他们就路由上了
Map<String, Object> map = new HashMap<>();
map.put("messageId", "test");
//使用默认交换机
rabbitTemplate.convertAndSend("", "TestDirectQueue", map);
return "ok";
}
}
消费者
@Component
@RabbitListener(queues = "TestDirectQueue")//监听的队列名称 TestDirectQueue
public class DirectReceiver {
@RabbitHandler
public void process(Map testMessage) {
System.out.println("DirectReceiver消费者收到消息 : " + testMessage.toString());
}
}