RabbitMQ整合(2)

111 阅读2分钟

这是我参与更文挑战的第9天,活动详情查看: 更文挑战

四种交换机类型

  • Direct
    要求该消息与一个特定的路由键完全匹配

默认类型,queue和key完全匹配,在使用这个类型的Exchange时,可以不必指定routing key的名字,在此类型下创建的Queue有一个默认的routing key,这个routing key一般同Queue同名。参照第一篇

  • topic
    将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词

    RabbitmqConfig.java配置,创建的两个队列,和交换机,绑定规则

@Configuration
public class RabbitmqConfig {
    @Bean(name = "message")
    public Queue queueMessage() {
        return new Queue("topic.message");
    }

    @Bean(name = "messages")
    public Queue queueMessages() {
        return new Queue("topic.messages");
    }

    @Bean
    public TopicExchange exchange() {
        return new TopicExchange("exchange");
    }
     //@Qualifier 指定bean注入
    @Bean
    Binding bindingExchangeMessage(@Qualifier("message") Queue queueMessage, TopicExchange exchange) {
        return BindingBuilder.bind(queueMessage).to(exchange).with("topic.message");
    }

    @Bean
    Binding bindingExchangeMessages(@Qualifier("messages") Queue queueMessages, TopicExchange exchange) {
        return BindingBuilder.bind(queueMessages).to(exchange).with("topic.#");//*表示一个词,#表示零个或多个词
    }
}

生产者 Sender.java
绑定交换机和队列

@RestController
public class Sender {
    @Autowired
    private AmqpTemplate rabbitTemplate;
    @PostMapping("/send1")
    public void send1() {
        String context = "hello " + new Date();
        System.out.println("Sender : " + context);
        this.rabbitTemplate.convertAndSend("exchange","topic.message", context);
    }
    @PostMapping("/send2")
    public void send2() {
        String context = "world " + new Date();
        System.out.println("Sender : " + context);
        this.rabbitTemplate.convertAndSend("topic.messages", context);
    }
}

消费者 Receiver.java
监听队列,

@RabbitListener(queues="topic.message")    //监听器监听指定的Queue
    public void process1(String str) {
        System.out.println("message:"+str);
    }
    @RabbitListener(queues="topic.messages")    //监听器监听指定的Queue
    public void process2(String str) {
        System.out.println("messages:"+str);
    }
  • Fanout (订阅模式)
    不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。 RabbitmqConfig.java 配置
@Configuration
public class RabbitmqConfig {
    @Bean(name="Amessage")
    public Queue AMessage() {
        return new Queue("fanout.A");
    }
    
    @Bean(name="Bmessage")
    public Queue BMessage() {
        return new Queue("fanout.B");
    }

    @Bean
    FanoutExchange fanoutExchange() {
        return new FanoutExchange("fanoutExchange");//配置广播路由器
    }

    @Bean
    Binding bindingExchangeA(@Qualifier("Amessage") Queue AMessage,FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(AMessage).to(fanoutExchange);
    }

    @Bean
    Binding bindingExchangeB(@Qualifier("Bmessage") Queue BMessage, FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(BMessage).to(fanoutExchange);
    }

}

生产者 Sender.java

rabbitTemplate.convertAndSend("fanoutExchange","","xixi");

消费者 Receiver.java

@Component
public class Receiver {
@RabbitListener(queues="fanout.A")
public void processA(String str1) {
    System.out.println("ReceiveA:"+str1);
}
    @RabbitListener(queues="fanout.B")
    public void processB(String str) {
        System.out.println("ReceiveB:"+str);
    }
}
  • headers (较少使用) RabbitmqConfig.java 配置
@Bean
    public Queue queueN1() {

        return new Queue("queueN1");
    }

    @Bean
    public Queue queueN2() {

        return new Queue("queueN2");

    }

    @Bean
    public HeadersExchange headersExchange(){

        return new HeadersExchange("headersExchange");
    }

    @Bean
    public Binding queueN1Binding(){
        //所有键值匹配
        Map<String,Object> map = new HashMap<>();
        map.put("queueName","queueN1");
        map.put("bindType","whereAll");
        return BindingBuilder.bind(queueN1()).to(headersExchange()).whereAll(map).match();
    }

    @Bean
    public Binding queueN2Binding(){
        //存在键值匹配
        Map<String,Object> map = new HashMap<>();
        map.put("queueName","queueN2");
        map.put("bindType","whereAny");
        return BindingBuilder.bind(queueN2()).to(headersExchange()).whereAny(map).match();
    }

生产者 Sender.java

@Autowired
    private AmqpTemplate rabbitTemplate;
    @PostMapping("/send1")
    public void send1(){
        String messageStr = "hello queueN1";
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setHeader("queueName","queueN1");
        messageProperties.setHeader("bindType","whereAll");
        Message message = new Message(messageStr.getBytes(), messageProperties);
        rabbitTemplate.send("headersExchange",null,message);
    }
    @PostMapping("/send2")
    public void send2(){

        String messageStr = "hello queueN2";
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setHeader("queueName","queueN2");
        messageProperties.setHeader("bindType","whereAll");
        Message message = new Message(messageStr.getBytes(), messageProperties);
        rabbitTemplate.send("headersExchange",null,message);
        rabbitTemplate.convertAndSend("headersExchange",messageStr);
    }

消费者 Receiver.java

@Component
public class Receiver {

    @RabbitListener(queues = "queueN1")
    public void listerQueueN1(byte[] bytes){
        System.out.println("queueN1" + new String(bytes));
    }
    @RabbitListener(queues = "queueN2")
    public void listerQueueN2(byte[] bytes){
        System.out.println("queueN2" + new String(bytes));
    }
}