RabbitMq-1.4 (RabbitMq的路由(routing)模式-Direct)

RabbitMq的路由模式-Direct:

在广播模式下一条消息可以被所有的服务进行消费,但是有的时候,我们希望不通的消息被不同的队列消费,这个时候就需要用到driectexchange
在这里插入图片描述

在这里插入图片描述

实现步骤:
第一步:项目准备

消息生产方: zt-frank-mq-prod-service-9501
消息消费方1:zt-frank-mq-consumer1-service-9505
消息消费方2:zt-frank-mq-consumer2-service-9506

第二步:消息生产者9501代码编写,向driect类型的exchange发送三次消息,但是每次消息的routingKey不一样

@Controller
@RequestMapping("/mq")
public class RouterModel_4 {

    private static Logger logger = Logger.getLogger(RouterModel_4.class);

    @Autowired
    private  RabbitTemplate rabbitTemplate;

    @PostMapping("/router")
    @ResponseBody
    public String test(){
        logger.info("mq开始生成消息-路由模式");
        ArrayList<String> arr = new ArrayList<>();
        arr.add("info");
        arr.add("warn");
        arr.add("error");
        /**
         * 需要有消费者才能创建exchange,也就是说队列和交换机的创建取决与消费者
         * 参数1:exchange名称
         * 参数2: routingKey 路由的名字   (在广播模式下没有意义给个空字符串)
         * 参数3:要发送消息的内容
         */
        for (String  routerName: arr){
            rabbitTemplate.convertAndSend("routerExchange",routerName,"routing--路由模式 routerName= "+routerName);
        }
        logger.info("mq生成消息结束-路由模式");
        return "OK";
    }
}

第三步:消费方服务9505代码编写,在@QueueBinding注解上绑定队列和exchange的时候指明了路由为error的路由

@Component
public class RouterModelListener_4 {

    private static Logger logger = Logger.getLogger(RouterModelListener_4.class);


    @RabbitListener(bindings = {
            @QueueBinding(                  //exchange与队列的绑定
                    value = @Queue,         //创建临时队列
                    exchange = @Exchange(value = "routerExchange",type = "direct"), //指定exchange的名称和类型
                    key = {"error"}         //只处理路由名称为error 的消息
            )
    })
    public void routerModel(String message){
        logger.info("开始消费消息-路由模式");
        System.out.println("MQ消费消息9505:"+message);
        logger.info("结束消费消息-路由模式");
    }

第四步:消费方服务9506代码编写,在@QueueBinding注解上绑定队列和exchange的时候指明了路由为info/warn的路由

@Component
public class RouterModelListener_4 {

    private static Logger logger = Logger.getLogger(RouterModelListener_4.class);


    @RabbitListener(bindings = {
            @QueueBinding(                  //exchange与队列的绑定
                    value = @Queue,         //创建临时队列
                    exchange = @Exchange(value = "routerExchange",type = "direct"), //指定exchange的名称和类型
                    key = {"info","warn"}         //只处理路由名称为info和warn的消息
            )
    })
    public void routerModel(String message){
        logger.info("开始消费消息-路由模式");
        System.out.println("MQ消费消息9506:"+message);
        logger.info("结束消费消息-路由模式");
    }
}

第四步:测试,期望消费服务9505打印路由名为error的,而9506服务则打印info和warn的;

9505日志:

开始消费消息-路由模式
MQ消费消息9505:routing--路由模式 routerName= error
结束消费消息-路由模式

9506日志:

开始消费消息-路由模式
MQ消费消息9506:routing--路由模式 routerName= info
MQ消费消息9506:routing--路由模式 routerName= warn
结束消费消息-路由模式

结果复合预期效果;

RabbitMQ-C是一个轻量级的RabbitMQ客户端库,它是用C语言编写的,专为那些需要低级别控制或在资源受限的环境中操作AMQP(Advanced Message Queuing Protocol)的应用设计。它提供了直接访问RabbitMQ服务器的功能,包括发送和接收消息。 在RabbitMQ-C中发送消息的基本步骤如下: 1. **初始化连接**:首先,你需要创建一个连接到RabbitMQ服务器的连接实例,通常通过`amqp_connection_new()`创建。 ```c amqp_connection_t *connection = amqp_connection_new(amqp_uri_new("amqp://localhost"), NULL); ``` 2. **声明交换器和队列**:如果消息需要路由到特定的队列,你需要声明这些资源。 ```c amqp_exchange_t *exchange = amqp_exchange_declare(connection, "your_exchange", AMQP_EX_TYPE_DIRECT, 0, NULL, NULL, NULL); amqp_queue_t *queue = amqp_queue_declare(connection, "your_queue", 0, NULL, NULL, NULL, NULL); ``` 3. **绑定队列到交换器**:确保队列收到来自交换器的消息,使用`amqp_queue_bind()`方法。 ```c amqp_queue_bind(connection, queue, exchange, "your_routing_key", NULL, NULL); ``` 4. **构建消息**:定义一个消息体(含数据、头部信息),例如使用`amqp_message_new()`创建一个新的AMQP消息。 ```c amqp_message_t *message = amqp_message_new(0, NULL); amqp_basic_publish_props_t *props = amqp_basic_publish_props_new(); ``` 5. **设置消息属性**:填充消息头,如交换器、路由键等,并设置消息持久化选项。 ```c amqp_message_set_properties(message, props, AMQP_CMSG_NONE, "your_exchange", "your_routing_key", NULL, 0, NULL); amqp_basic_publish(connection, exchange, message, AMQP_NOPARAM, NULL, NULL, NULL); ``` 6. **发送消息**:调用`amqp_basic_publish()`方法将消息发送到交换器。 7. **清理**:记得关闭连接、交换器、队列消息资源。 ```c amqp_message_destroy(message); amqp_queue_delete(connection, queue); amqp_exchange_delete(connection, exchange); amqp_connection_close(connection); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值