syntax = "proto2";
package Rabbitmq_proto;

//Rabbitmq 配置的通道,队列和消费者,
//注:目前规定
//接受请求消息:同一子节点所有的请求消息写同一个channel通道编号,queue_durable = 1, queue_auto_delete = 0, consume_no_ack = 0,
//接受状态消息:同一子节点所有的状态消息写同一个channel通道编号,queue_durable = 0, queue_auto_delete = 1, consume_no_ack = 1,
message Rabbitmq_channel_queue_consume
{
    optional int32 channel = 1;                             //连接通道,必写, 可以相同, 不同的消息队列可以共用同一个连接通道,
                                                            //配合 amqp_basic_qos 和 amqp_basic_ack , 来阻塞这个通道的接受消息
                                                            //请求消息和状态消息必须分别写不同的通道,例如所有的请求都可以写12, 所有的状态都可以写34
    optional string exchange_name = 2;                      //交换机名称,必写, 可以相同, 不同的消息队列可以共用同一个交换机,
                                                            //配合 routingkey 和 bindingkey , 来分配消息到合适的队列

    //发送队列专属
    optional string routing_key = 3;                        //发送端的路由键, 交换机分配消息的判断条件
    optional int32 timeout_ms = 4;                          //发送超时时间, 单位ms, 服务器会自动删除超时的消息, 如果写0,那么就没有超时删除

    //接受队列专属
    optional string binding_key = 5;                        //接受端的绑定键, 交换机分配消息的判断条件
    optional string queue_name = 6;                         //队列名称,必写, 不能相同
    optional int32 queue_passive = 7[default = 0];          //是否被动,默认0
    optional int32 queue_durable = 8;                       //是否持久,必写, 节点代码可以创建临时队列(所有权归节点), 服务器手动创建永久队列(所有权归服务器)
                                              		        //		1表示永久队列,当节点死掉,队列在服务器保留,仍然可以接受数据,节点上线后,可以接受掉线期间的所有数据
                                              		        //		0表示临时队列,当节点死掉,队列消失,不再接受数据,直到下次恢复正常
    optional int32 queue_exclusive = 9[default = 0];        //是否独立,默认0
    optional int32 queue_auto_delete = 10[default = 0];      //是否自动删除, 固定写0,
                                                            //1表示消息被消费者接受后,就自动删除消息, 当接收端断连后,队列也会删除,
                                                            //0表示消息被消费者接受后,不会自动删除消息, 需要手动ack才会删除消息, 队列不会删除
                                                            //一般情况下设为0,然后让接受者手动删除.
     optional int32 queue_meassage_ttl = 11[default = 0];   //队列配置的扩展参数, x-message-ttl 队列接受消息 的超时时间 (单位毫秒)
                                                            //默认写0, 不配置超时, 一般在状态消息的临时队列写入1000ms


    optional string consume_name = 12;                       //消费者名称,必写, 不能相同
    optional int32 consume_no_local = 13[default = 0];      //是否非本地, 默认0,表示本地
    optional int32 consume_no_ack = 14[default = 0];        //是否确认应答,默认0,表示接收后需要应答
                                                            //请求消息必须写0, 必须应答之后才能接受下一条
                                                            //状态消息必须写1, 可以无限循环接受,收到的瞬间,服务器就会删除这一条消息
    optional int32 consume_exclusive = 15;                  //是否独立,默认0

}



//Rabbitmq 配置参数
message Rabbitmq_parameter
{
    optional string ip = 1;             //服务器ip地址, 不带端口
    optional int32 port = 2;            //端口,默认5672
    optional string user = 3;           //用户名, 默认guest
    optional string password = 4;       //密码, 默认guest

    repeated Rabbitmq_channel_queue_consume rabbitmq_reciever_vector= 5;                //Rabbitmq 接受的通道,队列和消费者, 多个
    repeated Rabbitmq_channel_queue_consume rabbitmq_sender_request_vector= 6;         //Rabbitmq 发送请求的通道
    repeated Rabbitmq_channel_queue_consume rabbitmq_sender_status_vector= 7;          //Rabbitmq 发送状态的通道
    //注:rabbitmq的接受是以队列为目标的, 可以同时接受多个队列的消息.
    //注:rabbitmq的发送是以交换机为目标的,我们发送到交换机后,由交换机按照规则,去分配到下面的队列里面

}

//Rabbitmq 配置参数 总配置
message Rabbitmq_parameter_all
{
    optional Rabbitmq_parameter        rabbitmq_parameters=1;
}
