每个队列的消息只能被消费一次
交换机4中类型
1、最简单的 是没有交换机模式(会有一个默认交换机)
2、广播模式fanout ,没有routingKey 所有队列都会受到
3、direct模式, 通过routingKey 向绑定的队列发送消息,可以绑定多个队列
4、topic 模式,routingKey 用的通配符绑定的队列。
控制台使用
Channels(信道)
链接中的信道信息:Channel是在连接中存在的,一个Connection中可以有多个Channel。在Java代码中 通过连接来创建信道。当代码执行完 connection.createChannel(); 之后我们通过如下界面可以看到新创建的信道信息。
Exchanges(交换机)
Exchange作为消费的生产者和消息队列的一个中介,其将Producer生产的消息进行分发给消息队列。在没有使用交换机的简单模式中,实际上则使用的是默认的交换机(AMQP-Default)
direct模式
生产者
rabbitTemplate.convertAndSend("direct交换机名称", routingkey, object);
消费者
1、接收 设置2个
@RabbitListener(queues = "directqueue1")
public void displayMail(Mail mail) throws Exception {
System.out.println("directqueue1队列监听器1号收到消息"+mail.toString());
}
@RabbitListener(queues = "directqueue2")
public void displayMail(Mail mail) throws Exception {
System.out.println("directqueue2队列监听器2号收到消息"+mail.toString());
}
@RabbitListener(queues = "directqueue3")
public void displayMail(Mail mail) throws Exception {
System.out.println("directqueue3队列监听器3号收到消息"+mail.toString());
}
2、设置交换机绑定队列(使用routingkey区分发送到哪个队列)
package boot.spring.config;
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;
//direct直连模式的交换机配置,包括一个direct交换机,两个队列,三根网线binding
@Configuration
public class DirectExchangeConfig {
/**
* 一对一
*
* @return
*/
@Bean
public DirectExchange directExchange(){
DirectExchange directExchange=new DirectExchange("direct");
return directExchange;
}
@Bean
public Queue directQueue1() {
Queue queue=new Queue("directqueue1");
return queue;
}
@Bean
public Queue directQueue2() {
Queue queue=new Queue("directqueue2");
return queue;
}
@Bean
public Queue directQueue3() {
Queue queue=new Queue("directqueue3");
return queue;
}
//3个binding将交换机和相应队列连起来
@Bean
public Binding bindingorange(){
Binding binding=BindingBuilder.bind(directQueue1()).to(directExchange()).with("orange");
return binding;
}
//一个routingKey 绑定2个queue 那么这2个queue都会收到消息
@Bean
public Binding bindingorange2(){
Binding binding=BindingBuilder.bind(directQueue3()).to(directExchange()).with("orange");
return binding;
}
@Bean
public Binding bindingblack(){
Binding binding=BindingBuilder.bind(directQueue2()).to(directExchange()).with("black");
return binding;
}
@Bean
public Binding bindinggreen(){
Binding binding=BindingBuilder.bind(directQueue2()).to(directExchange()).with("green");
return binding;
}
}
fanout模式
生产者
rabbitTemplate.convertAndSend("fanout交换机名称", "", mail);
消费者
1、交换机和队列绑定,此处绑定了2个
package boot.spring.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//发布订阅模式的配置,包括两个队列和对应的订阅者,发布者的交换机类型使用fanout(子网广播),两根网线binding用来绑定队列到交换机
@Configuration
public class PublishSubscribeConfig {
@Bean
public Queue myQueue1() {
Queue queue=new Queue("queue1");
return queue;
}
@Bean
public Queue myQueue2() {
Queue queue=new Queue("queue2");
return queue;
}
/**
* 广播,
* @return
*/
@Bean
public FanoutExchange fanoutExchange(){
FanoutExchange fanoutExchange=new FanoutExchange("fanout交换机名称");
return fanoutExchange;
}
@Bean
public Binding binding1(){
Binding binding=BindingBuilder.bind(myQueue1()).to(fanoutExchange());
return binding;
}
@Bean
public Binding binding2(){
Binding binding=BindingBuilder.bind(myQueue2()).to(fanoutExchange());
return binding;
}
}
2、监听
@RabbitListener(queues = "myqueue")
public void displayMail(Mail mail) throws Exception {
System.out.println("队列监听器1号收到消息"+mail.toString());
}
@RabbitListener(queues = "myqueue")
public void displayMail(Mail mail) throws Exception {
System.out.println("队列监听器2号收到消息"+mail.toString());
}
消息创建时机
1、是在生产者端创建的,如果生产者没有创建,需要先手动在rabbitmq里创建出队列,否则消费者在绑定不存在的mq时会报错
Failed to declare queue(s):[XXX]