MQ队列命名规范

  1. 业务线_队列的生产者项目名_消费的项目名称_[Q/R/X]_自定义标识
    如 : GDS_WMS_WOS_Q_FORECAST
      对应的Exchange名为:GDS_WMS_WOS_X_FORECAST
      对应的Routing key名为:GDS_WMS_WOS_R_FORECAST
    ;
      对应的死信队列名为:GDS_WMS_WOS_Q_FORECAST_DEAD
      对应的死信Exchange名为:GDS_WMS_WOS_X_FORECAST_DEAD
      对应的死信Routing key名为:GDS_WMS_WOS_R_FORECAST_DEAD
  2. 生产者队列的消息统一通过 [MQ的shovels插件] 转发到消费者队列
  3. 生产者不需要创建死信队列
  4. 消费者队列必须测试一下消息失败是否会进入对应的死信 这,很重要

MQ队列/Exchange 定义规范

  1. [生产者端]需要定义队列+Exchange 并且建立队列和Exchange的绑定关系
    • 队列需要定义:

      durable=true
      exclusive=false, autoDelete=false
      队列创建使用rabbitAdmin.declareQueue(queue); 防止队列窜到别的VH中

    • Exchange 需要定义

      durable=true
      autoDelete=false
      Exchange创建使用rabbitAdmin.declareExchange(exchange);防止队列窜到别的VH中

    • 建立绑定关系

      rabbitAdmin.declareBinding(BindingBuilder.bind(queue).to(exchange).with(“GDS_WMS_WMS_R_TASK_ASYNC_CONSUME”));

例子

1
2
3
4
5
6
7
//定义队列
Queue queue = new Queue("GDS_WMS_WMS_Q_TASK_ASYNC_CONSUME", true, false, false);
DirectExchange exchange = new DirectExchange("GDS_WMS_WMS_X_TASK_ASYNC_CONSUME", true, false);
rabbitAdmin.declareQueue(queue);
rabbitAdmin.declareExchange(exchange);
rabbitAdmin.declareBinding(BindingBuilder.bind(queue).to(exchange).with("GDS_WMS_WMS_R_TASK_ASYNC_CONSUME"));

  1. [消费者端]需要定义队列+Exchange 死信队列+死信Exchange 并且建立队列和Exchange的绑定关系
    • 队列/死信队列需要定义:

      durable=true
      exclusive=false, autoDelete=false
      队列创建使用rabbitAdmin.declareQueue(queue); 防止队列窜到别的VH中

    • Exchange/死信Exchange 需要定义

      durable=true
      autoDelete=false
      Exchange创建使用rabbitAdmin.declareExchange(exchange);防止队列窜到别的VH中

      • 建立绑定关系

        rabbitAdmin.declareBinding(BindingBuilder.bind(queue).to(exchange).with(“GDS_WMS_WMS_R_TASK_ASYNC_CONSUME”));

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//定义队列
Map<String, Object> map = new HashMap<>(2);
map.put("x-dead-letter-exchange", "GDS_WMS_WMS_X_TASK_ASYNC_CONSUME_DEAD");
map.put("x-dead-letter-routing-key", "GDS_WMS_WMS_R_TASK_ASYNC_CONSUME_DEAD");
Queue queue = new Queue("GDS_WMS_WMS_Q_TASK_ASYNC_CONSUME", true, false, false, map);
DirectExchange exchange = new DirectExchange("GDS_WMS_WMS_X_TASK_ASYNC_CONSUME", true, false);
rabbitAdmin.declareQueue(queue);
rabbitAdmin.declareExchange(exchange);
rabbitAdmin.declareBinding(BindingBuilder.bind(queue).to(exchange).with("GDS_WMS_WMS_R_TASK_ASYNC_CONSUME"));
//定义预报的死信队列(若配置转发生产者不需要定义死信队列)
Queue deadQueue = new Queue("GDS_WMS_WMS_Q_TASK_ASYNC_CONSUME_DEAD", true, false, false);
DirectExchange deadExchange = new DirectExchange("GDS_WMS_WMS_X_TASK_ASYNC_CONSUME_DEAD", true, false);
rabbitAdmin.declareQueue(deadQueue);
rabbitAdmin.declareExchange(deadExchange);
rabbitAdmin.declareBinding(BindingBuilder.bind(deadQueue).to(deadExchange).with("GDS_WMS_WMS_R_TASK_ASYNC_CONSUME_DEAD"));