Demo工程使用
准备 Demo 环境
- 安装 IDE
您可以安装 IntelliJ IDEA 或者 Eclipse,本文以 IntelliJ IDEA 为例进行说明。
请在 下载 IntelliJ IDEA Ultimate 版本,并参考 IntelliJ IDEA 说明进行安装。 - 下载 Demo 工程
请在 下载 CMQ-HTTP 的 Demo 工程 到本地,解压后即可看到本地新增的 cmq-java-sdk-master 文件夹。
配置 Demo 工程
- 创建资源
您需要在控制台创建所需消息队列资源,包括 CMQ 队列名、SecretID、SecretKey。 - 导入 Demo 工程文件
在 IDEA 的开机界面打开文件夹。
打开文件夹后,Demo 工程文件存于/src/main/java/com/qcloud/cmq/example文件夹下。 - 配置 Demo 参数
修改文件请求地址、密钥对等。以 Producer 为例,配置如下:
String secretId="获取的SecretID"; // 控制台账号访问管理可查看
String secretKey="获取的SecretKey"; // 控制台账号访问管理可查看
String endpoint = "https://cmq-topic-{$region}.api.qcloud.com"; // 控制台获取
String queueName = "test-queue"; // 队列名称
String topicName = "test-topic"; // 主题名称
Account account = new Account(endpoint, secretId, secretKey);
运行 Demo
使用队列模型收发消息
先运行 Producer 类发送消息,再运行 Consumer 类接受消息。
发送消息代码示例:
Queue queue = account.getQueue(queueName);
String msg = "hello!";
String msgId = queue.sendMessage(msg);
System.out.println("==> send success! msg_id:" + msgId);
接收/删除消息代码示例:
Message message = queue.receiveMessage();
System.out.println("==> receive a message msgId: " + message.msgId);
queue.deleteMessage(message.receiptHandle);
使用主题模型收发消息
运行 TopicDemo 类。发布消息示例:
Topic topic = account.getTopic(topicName)
String msg = "hello!";
String msgId = topic.publishMessage(msg);
System.out.println("==> publish success! msg_id:" + msgId);
订阅者可以填写一个 Queue,使用队列来接收发布的消息。订阅者需要去控制台创建
Message message = queue.receiveMessage();
System.out.println("==> receive a message msgId: " + message.msgId);
queue.deleteMessage(message.receiptHandle);

Tag消息
Topic 目前支持消息过滤,即消息标签、消息类型,用来区分某个 CMQ 的 Topic 下的消息分类。MQ 允许消费者按照标签对消息进行过滤,确保消费者最终只消费到他关心的消息类型。该功能默认不开启,未开启时,所有消息向所有订阅者发送;增加标签后,订阅者将仅能收到带该标签的信息。消息过滤标签描述了该订阅中消息过滤的标签(标签一致的消息才会被推送)。单个标签不超过16个字符,单个 Message 可最多添加5个标签。
有4个订阅者 A、B、C、D,A 消息标签是 apple,B 消息标签是 xiaomi,C 的消息标签是 imac+xiaomi,D 没有设置任何标签。
此时,有生产者 publish 到 Topic 100条消息,带的消息标签过滤为:apple、imac、iphone、macbook。此后 Topic 立即投递到 A、B、C、D。
场景分析:
| 订阅者 | 消息标签 | 消息接收说明 |
|---|---|---|
| A | apple | 由于 apple 能匹配消息过滤标签中的 apple,则能正常收到100条消息。 |
| B | xiaomi | 不能收到任何消息。 |
| C | imac+xiaomi | 由于其中一个标签 imac 能匹配,则能正常收到100条消息 。 |
| D | - | 可以收到任何消息。 |
通过以上场景,标签匹配规律如下:
| 订阅者 | 订阅者有无 tag | 有无消息 tag | 消息接收说明 |
|---|---|---|---|
| A | 有 | 无 | 订阅者不匹配,不能收到消息。 |
| B | 无 | 有 | 投递时消息不用匹配,订阅者都能收到消息。 |
| C | 有 | 有 | 两者匹配的,才能收到消息。支持 N:M 匹配,如消息有10个 tag,订阅者有4个 tag,其中有1个 tag 相互能匹配上,则订阅者能收到消息。 |
| D | 无 | 无 | 投递后,所有订阅者都能收到消息。 |
String msg = "hello world, Time:" + new Date();
List<String> tagList = Collections.singletonList("This-is-A-Tag");
String messageId = topic.publishMessage(msg, tagList, null);
路由匹配
- CMQ 的路由键匹配功能类似于 rabbitMQ 的 exchange queue,可以用于消息过滤,根据不同的条件使订阅者获取不同的消息。创建 topic 时,可开启【路由匹配键】。
- Binding key、Routing key 是组合使用的,提供类似于 RabbitMQ 的消息过滤能力。发消息时配的 Routing key 是客户端发消息带的。创建订阅关系时配的 Binding key 是 topic 和 订阅者的绑定关系。
使用限制
- Binding key 的数量不超过5个。单个 binding key 的长度 <= 64字节,用于表示发送消息的路由路径,最多含有15个“.”,即最多16个词组。
- Routing key 的数量由1个字符串组成。单个 Routing key 的长度<=64 字节,用于表示发送消息的路由路径,最多含有15个“.”,即最多16个词组。
通配符说明
- *(星号),可以替代一个单词(一串连续的字母串) ,不能为空。
- #(井号):可以匹配零个或多个字符。
示例:
- 订阅者是『1.*.0』,此时消息为『1.任意字符.0』,则订阅者都能收到消息。
- 订阅者是『1.#.0』,此时消息为『1.2.3.4.4.2.2.0』,『1.0』则订阅者都能收到消息(消息中间元素随意) 。
- 订阅者是『#』,则所有消息订阅者都能收到。

String msg = "hello world, Time:" + new Date();
String routeKey = "first.second.middle.middle2.last";
String messageId = topic.publishMessage(msg, null, routeKey);