1,rabbitmq发送消息的流程图如下
在springboot整合rabbitmq时大致的流程我简要说明一下,建立消息发送者,发送消息到绑定的路由器上,消息接受者通过路由键寻找到自己所要监听的消息队列。
2,交换机几种路由模式
从图中能看出交换机是通过绑定键与消息队列中的路由键进行关联的,具体的关联规则包含direct(直连),topic(匹配),fanout(广播),headers(头消息匹配)。
在讲解代码之前先引入支持rabbitmq的jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
这是spring-boot为我们提供支持AMQP协议的jar包
2.1direct模式
发送端
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Configuration
public class DirectSend {
@Value("${rabbitmq.exchangeDirectName}")
public String exchangeDirectName;
@Value("${rabbitmq.bindingDirectKey}")
public String bindingDirectKey;
@Autowired
private AmqpTemplate rabbitTemplate;
@Scheduled(cron = "0/5 * * * * *")
public void directSend(){
System.out.println("准备开始发送direct模式的消息=======>");
rabbitTemplate.convertAndSend(exchangeDirectName,bindingDirectKey,"这是一条direct模式发送的消息");
System.out.println("发送direct模式的消息完毕");
}
}
接受端
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component;
@Component
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "queues.direct",autoDelete = "true"),exchange = @Exchange(value = "${rabbitmq.exchangeDirectName}",type = ExchangeTypes.DIRECT),key = "${rabbitmq.bindingDirectKey}"
))
public class DirectMessageConsumer {
@RabbitHandler
public void directMessageConsumer(String msg){
System.out.println("direct模式接受的消息为:"+msg);
}
}
application.properties设置的变量
#设置交换机的名称
rabbitmq.exchangeDirectName=exchange-test-direct
#设置交换机的绑定键
rabbitmq.bindingDirectKey=binding.direct
这种direct模式是根据路由键进行全匹配,只有交换机的绑定键(bindingkey)和消息队列的路由键(routingkey)相同时才会进行绑定。需要注意的是@Scheduled是定时任务的注解,需要在启动类中注明@EnableScheduling元注解。否则定时任务不会生效
运行结果