美文网首页
快速上手RabbitMQ

快速上手RabbitMQ

作者: fanbuer | 来源:发表于2019-04-12 14:31 被阅读0次

    生产者

    @RunWith(SpringRunner.class)//用springrunning替代Junit原生的runner
    @SpringBootTest(classes = RabbitApplication.class)
    public class ProductTest {
    
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        /**
         * 直接模式
         * 任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue。
         * 1.一般情况可以使用rabbitMQ自带的Exchange:""(该Exchange的名字为空字符串,下文称其为default Exchange)
         * 2.这种模式下不需要将Exchange进行任何绑定(binding)操作
         * 3.消息传递时需要一个“RouteKey”,可以简单的理解为要发送到的队列名字
         * 4.如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃
         */
        @Test
        public void sendMsgDirect(){
            rabbitTemplate.convertAndSend("routingkey","直接模式测试");
        }
    
        /**
         * 分裂模式
         * 任何发送到Fanout Exchange的消息都会被转发到与该Exchange绑定(Binding)的所有 Queue上。
         * 1.可以理解为路由表的模式
         * 2.这种模式不需要RouteKey
         * 3.这种模式需要提前将Exchange与Queue进行绑定,一个Exchange可以绑定多个 Queue,一个Queue可以同多个Exchange进行绑定。
         * 4.如果接受到消息的Exchange没有与任何Queue绑定,则消息会被抛弃。
         */
        @Test
        public void sendMsgFanout(){
            rabbitTemplate.convertAndSend("exchange", "", "分裂模式测试");
        }
    
        /**
         * 主题模式
         * 任何发送到Topic Exchange的消息都会被转发到所有关心RouteKey中指定话题的Queue 上
         * 1.这种模式较为复杂,简单来说,就是每个队列都有其关心的主题,所有的消息都带有一 个“标题”(RouteKey),
         *  Exchange会将消息转发到所有关注主题能与RouteKey模糊匹配的 队列。
         * 2.这种模式需要RouteKey,也需要提前绑定Exchange与Queue。
         * 3.在进行绑定时,要提供一个该队列关心的主题,
         *  如“#.log.#”表示该队列关心所有涉及log的消息(一个RouteKey为”MQ.log.error”的消息会被转发到该队列)。
         * 4.同样,如果Exchange没有发现能够与RouteKey匹配的Queue,则会抛弃此消息
         * 交换器说到底是一个名称与队列绑定的列表。当消息发布到交换器时,
         * 实际上是由你所连接的信道,将消息路由键同交换器上绑定的列表进行比较,最后路由消息。
         * routingKey:
         *      符号 # 匹配一个或多个词,#.log.# 表示包含log的所有
         *      符号 * 表示仅仅匹配一个词,例:hello.*,hello.a可以匹配,hello.a.b不可以
         */
        @Test
        public void sendMsgTopic(){
            rabbitTemplate.convertAndSend("exchange", "hello.#", "主题模式测试");
        }
    

    直接模式消费者

    @Component
    @RabbitListener(queues = "routingkeyDirect")
    public class CustomerDirect {
    
        /**
         * 开启多个消费者工程,测试运行消息生产者工程,会发现只有一个消费者工程可以接收 到消息。
         */
        @RabbitHandler
        public void getMsgDirect(String msg){
            System.out.printf("(Direct)直接模式消费消息:"+msg);
        }
    
    }
    

    分裂模式消费者

    @Component
    @RabbitListener(queues = "routingkeyFanout1")
    public class CustomerFanout1 {
            /**
         * 开启多个消费者工程,测试运行分裂生产者工程,会发现所有消费者工程可以接收到消息。
         */
        @RabbitHandler
        public void getMsgFanout(String msg){
            System.out.printf("(Fanout)分裂模式 消费消息:"+msg);
        }
    
    }
    

    主题模式消费者

    @Component
    @RabbitListener(queues = "hello.abc")
    public class CustomerDirect {
    
        /**
         * 开启多个消费者工程,测试运行消息生产者工程,会发现只有queues匹配消费者工程可以接收到消息。
         */
        @RabbitHandler
        public void getMsgDirect(String msg){
            System.out.printf("(Topic)主题模式消费消息:"+msg);
        }
    
    }
    

    相关文章

      网友评论

          本文标题:快速上手RabbitMQ

          本文链接:https://www.haomeiwen.com/subject/ubjcwqtx.html