rabbitmq

rabbitmq模式

Direct模式相当于一对一模式,一个消息被发送者发送后,会被转发到一个绑定的消息队列中,然后被一个接收者接收!


topic和direct的区别,没有什么大的区别,就是binding key和routing key的匹配方式可以通过通配符的方式,也就是说路由模式是topic模式的一个特例。


Fanout Exchange形式又叫广播形式,因此我们发送到路由器的消息会使得绑定到该路由器的每一个Queue接收到消息,这个时候就算指定了Key,或者规则(即convertAndSend方法的参数2),也会被忽略!


依赖

<dependency>

     <groupId>org.springframework.boot</groupId>

     <artifactId>spring-boot-starter-amqp</artifactId>

</dependency>


流程

application.yml配置文件

spring:

  rabbitmq:

    host: rabbitmq.qfjava.cn

    port: 8800

    virtual-host: /test

    username: nore

    password: 2090


MassageLisrener 消息监听器

import org.springframework.amqp.rabbit.annotation.RabbitHandler;

import org.springframework.amqp.rabbit.annotation.RabbitListener;

import org.springframework.stereotype.Component;


@Component

@RabbitListener(queues = "jla") //声明当前类是用于接收指定队列消息的,必须在方法上面添加RabbitHandler注解

public class MessageListener {

    @RabbitListener(queues = "jla",autoStartup = "true")//指定当前方法是用于处理哪个队列的消息的,不需要在类上面添加注解

    public void laowangkaishiyuehuileyebuzhidaohuiquyueshui(String message) {

        System.err.println("收到了消息====>" + message);

    }


    @RabbitHandler //需要在类上面添加@RabbitListener(queues = "shenmemingzi")

    public void laowangyouyueleyigeren(String message) {

        System.err.println("handler收到的消息" + message);

    }

}


RabbitMQConfig 配置文件


import org.springframework.amqp.core.*;

import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;

import org.springframework.amqp.rabbit.connection.ConnectionFactory;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.context.annotation.Bean;


@SpringBootApplication

public class RabbitMQConfig {

    @Bean

    public Queue queue1() {

        return new Queue("jla");

    }

//    @Bean

//    public Queue queue2() {

//        return new Queue("shenmemingzi2");

//    }

    @Bean

    public ConnectionFactory connectionFactory() {

        CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();

        cachingConnectionFactory.setHost("baseservice.qfjava.cn");

        cachingConnectionFactory.setPort(8800);

        cachingConnectionFactory.setUsername("nore");

        cachingConnectionFactory.setPassword("2090");

        cachingConnectionFactory.setVirtualHost("/test");

        return cachingConnectionFactory;

    }


    @Bean

    public FanoutExchange fanoutExchange() {

        return new FanoutExchange("springbootfanout");

    }


    @Bean

    public Binding bindFanout(FanoutExchange exchange, Queue queue) {

        return BindingBuilder.bind(queue).to(exchange);//绑定指定队列到指定的交换机

    }


    @Bean

    public DirectExchange directExchange() {

        return new DirectExchange("springbootdirect");

    }



    @Bean

    public Binding bindDirect(DirectExchange exchange, Queue queue) {

        return BindingBuilder.bind(queue).to(exchange).with("chifan");//绑定并且指定key

    }



//    @Bean

//    public Binding bindDirect2(DirectExchange exchange, Queue queue) {

//        return BindingBuilder.bind(queue).to(exchange).with("chifan2");//绑定并且指定key

//    }


    @Bean

    public TopicExchange topicExchange() {

        return new TopicExchange("springboottopic");

    }


    @Bean

    public Binding bindTopic(TopicExchange exchange, Queue queue) {

        return BindingBuilder.bind(queue).to(exchange).with("*.chifan");

    }


}


Sender 发送消息

import org.springframework.amqp.core.AmqpTemplate;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;


@Component

public class Sender {

    @Autowired

    private AmqpTemplate template;


    public void sendMessage(String queue, String message) {

        template.convertAndSend(queue,message);

    }

}


TestMain 启动测试

import org.springframework.context.ApplicationContext;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;


public class TestMain {

    public static void main(String[] args) {

        ApplicationContext context = new AnnotationConfigApplicationContext(RabbitMQConfig.class);

        Sender sender= context.getBean(Sender.class);

        sender.sendMessage("jla", "一起吃饭去");


    }

}