docker启动rabbitMQ,通过java创建交换机、队列、绑定

通过docker启动rabbitMQ

docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 rabbitmq:management 

 
 
将其修改为自启动:docker update rabbitmq --restart=always
 
 
以下为通过java代码进行创建交换机、队列、绑定

@Autowired
    private AmqpAdmin amqpAdmin;//用于在rabbitMq中创建Exchange(交换机)、Queue(队列)、Binding(绑定关系)

    @Test
    void createExchange() {
        //声明一个简单的直接交换机(使用精确匹配的方式进行匹配绑定的队列)
        /**
         * DirectExchange(String name, boolean durable, boolean autoDelete, Map<String, Object> arguments) {
         * 创建DirectExchange交换机的参数列表
         * String name 交换机的名称,
         * boolean durable 是否长久存储(在下一次启动rabbit的时候是否还存在),
         * boolean autoDelete 是否自动删除(在不存在任何绑定的时候),
         * Map<String, Object> arguments 参数
         */
        DirectExchange directExchange = new DirectExchange("hello-java-exchange",
                true,false);
        amqpAdmin.declareExchange(directExchange);
        log.info("Exchange(交换机)创建成功!!");
    }

    @Test
    void createQueue(){
        //在rabbitMq中声明一个队列,用于存放消息
        /**
         * Queue的参数列表
         * Queue(String name, boolean durable, boolean exclusive, boolean autoDelete, @Nullable Map<String, Object> arguments)
         * String name 队列的名称,
         * boolean durable 是否长期存储(是否存在连接消费者的connection),
         * boolean exclusive 是否为排他(该队列一旦被连接,就不能在连接了,只存在一个连接,默认都为false),
         * boolean autoDelete 是否自动删除,
         * @Nullable Map<String, Object> arguments  参数
         */
        Queue queue = new Queue("hello-java-queue",true,false,false);
        amqpAdmin.declareQueue(queue);
        log.info("Queue(队列)创建成功!!");
    }

    @Test
    void createBinding(){
        //声明一个Binding(绑定)
        /**
         * 创建Binding的参数列表
         * Binding(String destination, Binding.DestinationType destinationType, String exchange, String routingKey, @Nullable Map<String, Object> arguments)
         * String destination 被绑定的队列获取交换机  A,
         * Binding.DestinationType destinationType 被绑定的为交换机还是队列,
         * String exchange 为那个交换机进行绑定  B,
         * String routingKey 路由键(通过路由键进行推送消息),
         * @Nullable Map<String, Object> arguments 参数
         *
         * 上述为 为   B 绑定  A
         */
        Binding binding = new Binding("hello-java-queue", Binding.DestinationType.QUEUE,
                "hello-java-exchange","hello.java",null);
        amqpAdmin.declareBinding(binding);
        log.info("Binding(绑定)创建成功!!");
    }

 
 
 
通过java代码发送信息:

@Test
    void sendMessage(){
        //将发送的信息进行转化之后发送
        /**
         * 可以发送一个对象,但是这个对象必须实现可序列化的接口Serializable
         */
        String message="hello world";
        rabbitTemplate.convertAndSend("hello-java-exchange",
                "hello.java",message);
        log.info("消息【{}】发送成功!!!",message);
    }

如果发送的消息是一个对象的话,查看到的结果为对象序列化之后的结果,对我们阅读不是很友好,我们可以将其修改将对象序列化为为json格式
操作如下:
添加一个配置类,在配置类中添加

@Configuration
public class MyRabbitMQConf {
    /**
     * 用于消息转化
     */
    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }
}

 
 
 
接收RabbitMq中发送的信息,通过使用@RabbitListener注解和@RabbitHandler注解进行获取,使用这个注解需要确保开启了Rabbit服务(是否添加@EnableRabbit注解)
其中@RabbitListener可以使用的方法上,也可以使用在类上,@RabbitHandler只能使用在类上,将他们联合使用,可以解决在同一个队列中,储存的消息的类型不同,在获取到该消息之后执行的方法也是不同的
实例代码如下:

@RabbitListener(queues = "hello-java-queue")
public class Test {

     //当接收到的信息的类型为Dog的时候执行的方法,RabbitMQ中存放的全部信息都在Message中,spring rabbit会自动将Message中body信息转化为我们传入的对象的类型
    @RabbitHandler
    public void m1(Message message,Dog dog){
        System.out.println("当前获取的对象信息为:"+dog);
    }

     //当接收到的信息的类型为Cat的时候执行的方法
    @RabbitHandler
    public void m2(Message message,Cat cat){
        System.out.println("当前获取的对象信息为:"+cat);
    }
}

 
 
 
还存在一种创建队列、交换机、绑定关系的方式:就在Spring容器中直接使用@Bean注解添加Queue、Exchange、Binding对象就可以了
实例:

/**
 * @author just1t
 * @date 2023/5/20 16:00
 * @introduce 在RabbitMQ中创建交换机、队列、绑定关系的两种方式
 * 第一种方式:通过使用AmqpAdmin进行创建
 * 第二种方式:直接在Spring容器中添加对应的对象,Spring连接到RabbitMQ之后,MQ会自动创建,前提是MQ之前不存在的情况
 */
@Configuration
public class MyMQConf {
    /**
     * order服务的主交换机
     * @return
     */
    @Bean
    public Exchange orderEventExchange(){
        //创建一个模糊匹配的交换机,不同的交换机匹配规则就不同
        return new TopicExchange("order-event-exchange",true,false);
    }
}
posted @ 2023-04-26 18:40  just1t  阅读(146)  评论(0编辑  收藏  举报