RabbitMQ三种交换机的实现方式

1.使用direct交换机
消费者:

spring.rabbitmq.host=192.168.56.122
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=111111
#交换机名称
mq.rabbit.direct.exchange=log.direct
#info队列名称
mq.rabbit.direct.queue.info=log.info
#info路由键
mq.rabbit.direct.routing.info=log.info.routing.key
#error队列名称
mq.rabbit.direct.queue.error=log.error
#error路由键
mq.rabbit.direct.routing.error=log.error.routing.key
@Component
@RabbitListener(
        bindings = @QueueBinding(
                value = @Queue(value = "${mq.rabbit.direct.queue.info}",autoDelete = "true"),
                exchange = @Exchange(value = "${mq.rabbit.direct.exchange}",type = ExchangeTypes.DIRECT),
                key = "${mq.rabbit.direct.routing.info}"
        )
)
public class InfoConsumer {
    @RabbitHandler
    public void receive(String mes){
        System.out.println("info........Receiver:"+mes);
    }
}
@Component
@RabbitListener(
        bindings = @QueueBinding(
                value = @Queue(value = "${mq.rabbit.direct.queue.error}",autoDelete = "true"),
                exchange = @Exchange(value = "${mq.rabbit.direct.exchange}",type = ExchangeTypes.DIRECT),
                key = "${mq.rabbit.direct.routing.error}"
        )
)
public class ErrorConsumer {
    public void receive(String mes){
        System.out.println("error.........Receiver:"+mes);
    }
}

生产者:

spring.rabbitmq.host=192.168.56.122
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=111111
#交换机名称
mq.rabbit.direct.exchange=log.direct
#info路由键
mq.rabbit.direct.routing.info=log.info.routing.key
#error路由键
mq.rabbit.direct.routing.error=log.error.routing.key

@Component
public class Provider {
    @Autowired
    AmqpTemplate template;

    @Value("${mq.rabbit.direct.exchange}")
    private String exchangeName;

    @Value("${mq.rabbit.direct.routing.info}")
    private String routingKey;

    public void send(String mes){
        template.convertAndSend(exchangeName,routingKey,mes);
    }
}

测试类:

@SpringBootTest
class RabbitmqdirectproviderApplicationTests {
    @Autowired
    Provider provider;

    @Test
    void contextLoads() {
        while (true){
            provider.send("Hello happy");
        }
    }

}

2.使用topic交换机
消费者:

spring.rabbitmq.host=192.168.56.122
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=111111
#交换机名称
mq.rabbit.direct.exchange=log.topic
#info队列名称
mq.rabbit.direct.queue.info=log.info
#error队列名称
mq.rabbit.direct.queue.error=log.error
#logs队列名称
mq.rabbit.direct.queue.logs=log.all
@Component
@RabbitListener(
        bindings = @QueueBinding(
                value = @Queue(value = "${mq.rabbit.direct.queue.info}"),
                exchange = @Exchange(value = "${mq.rabbit.direct.exchange}",type = ExchangeTypes.TOPIC),
                key = "*.log.info"
        )
)
public class UserConsumer {
    @RabbitHandler
    public void receive(String mes){
        System.out.println(".....Info.....Receiver....."+mes);
    }
}
@Component
@RabbitListener(
        bindings = @QueueBinding(
                value = @Queue(value = "${mq.rabbit.direct.queue.error}"),
                exchange = @Exchange(value = "${mq.rabbit.direct.exchange}",type = ExchangeTypes.TOPIC),
                key = "*.log.error"
        )
)
public class ProductConsumer {
    @RabbitHandler
    public void receive(String mes){
        System.out.println(".....Error.....Receiver....."+mes);
    }
}
@Component
@RabbitListener(
        bindings = @QueueBinding(
                value = @Queue(value = "${mq.rabbit.direct.queue.logs}"),
                exchange = @Exchange(value = "${mq.rabbit.direct.exchange}",type = ExchangeTypes.TOPIC),
                key = "*.log.*"
        )
)
public class OrderConsumer {
    @RabbitHandler
    public void receive(String mes){
        System.out.println(".....All.....Receiver....."+mes);
    }
}

生产者:

spring.rabbitmq.host=192.168.56.122
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=111111
#交换机名称
mq.rabbit.direct.exchange=log.topic
public class UserProvider {
    @Autowired
    AmqpTemplate template;
    @Value("${mq.rabbit.direct.exchange}")
    String exchangeName;
    @RabbitHandler
    public void send(String mes){
        template.convertAndSend(exchangeName,"user.log.info",mes);
        template.convertAndSend(exchangeName,"user.log.error",mes);
        template.convertAndSend(exchangeName,"user.log.warn",mes);
        template.convertAndSend(exchangeName,"user.log.debug",mes);
    }
}
@Component
public class ProductProvider {
    @Autowired
    AmqpTemplate template;
    @Value("${mq.rabbit.direct.exchange}")
    String exchangeName;
    @RabbitHandler
    public void send(String mes){
        template.convertAndSend(exchangeName,"product.log.info",mes);
        template.convertAndSend(exchangeName,"product.log.error",mes);
        template.convertAndSend(exchangeName,"product.log.warn",mes);
        template.convertAndSend(exchangeName,"product.log.debug",mes);
    }
}

@Component
public class OrderProvider {
    @Autowired
    AmqpTemplate template;
    @Value("${mq.rabbit.direct.exchange}")
    String exchangeName;
    @RabbitHandler
    public void send(String mes){
        template.convertAndSend(exchangeName,"order.log.info",mes);
        template.convertAndSend(exchangeName,"order.log.error",mes);
        template.convertAndSend(exchangeName,"order.log.warn",mes);
        template.convertAndSend(exchangeName,"order.log.debug",mes);
    }
}

测试类:

@SpringBootTest
class RabbitmqtopicproviderApplicationTests {
    @Autowired
    UserProvider userProvider;

    @Autowired
    ProductProvider productProvider;

    @Autowired
    OrderProvider orderProvider;

    @Test
    void contextLoads() {
        userProvider.send("Hello User");
        productProvider.send("Hello Product");
        orderProvider.send("Hello Order");
    }

}

3使用fanout交换机
消费者:

spring.rabbitmq.host=192.168.56.122
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=111111

#交换机名称
mq.rabbit.direct.exchange=log.fanout
#info队列名称
mq.rabbit.direct.queue.sms=log.sms
#info队列名称
mq.rabbit.direct.queue.service=log.service
mq.rabbit.direct.queue.phone=log.phone

@Component
@RabbitListener(
        bindings = @QueueBinding(
                value = @Queue(value = "${mq.rabbit.direct.queue.sms}",autoDelete = "true"),
                exchange = @Exchange(value = "${mq.rabbit.direct.exchange}",type = ExchangeTypes.FANOUT)
        )
)
public class SmsConsumer {
    @RabbitHandler
    public void receive(String mes){
        System.out.println(".....Sms.....Receiver....."+mes);
    }
}
@Component
@RabbitListener(
        bindings = @QueueBinding(
                value = @Queue(value = "${mq.rabbit.direct.queue.service}",autoDelete = "true"),
                exchange = @Exchange(value = "${mq.rabbit.direct.exchange}",type = ExchangeTypes.FANOUT)
        )
)
public class ServiceConsumer {
    @RabbitHandler
    public void receive(String mes){
        System.out.println(".....Service.....Receiver....."+mes);
    }
}
@Component
@RabbitListener(
        bindings = @QueueBinding(
                value = @Queue(value = "${mq.rabbit.direct.queue.phone}",autoDelete = "true"),
                exchange = @Exchange(value = "${mq.rabbit.direct.exchange}",type = ExchangeTypes.FANOUT)
        )
)
public class PhoneConsumer {
    @RabbitHandler
    public void receiver(String mes){
        System.out.println(".....Phone.....Receiver....."+mes);
    }
}

生产者:

spring.rabbitmq.host=192.168.56.122
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=111111

#交换机名称
mq.rabbit.direct.exchange=log.fanout

@Component
public class MyProvider {
    @Autowired
    AmqpTemplate template;

    @Value("${mq.rabbit.direct.exchange}")
    String exchangeName;

    public void send(String mes){
        template.convertAndSend(exchangeName,"",mes);
    }
}

测试类:

@SpringBootTest
class RabbitmqfanoutproviderApplicationTests {
    @Autowired
    MyProvider provider;
    @Test
    void contextLoads() {
        provider.send("Hello RabbitMQ");
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值