Spring整合RocketMQ(二)
消息过滤
根据tag
这个就是案例中消费者的yml中配置的,每个消费者只会接收到自己订阅的消息
根据SQL
生产者
// 为message设置用户属性
msg.putUserProperty("index", String.valueOf(index));
消费者
consumer.subscribe("test_topic", MessageSelector.bySql("index >= 5"));
测试
发送index为1的消息
控制台
发送index为10的消息
控制台
按照发送方式分类
同步消息
Producer发送同步消息后,需要等待broker响应信息,一般用于比较重要的消息,必须确认消息是否发送成功
案例中使用的都是同步消息
异步消息
Producer发送异步消息后,不需要等待broker响应即可直接返回,这就是一开始提到的MQ提供的特性,异步消息
Producer可以定义一个回调函数去接收broker响应结果
使用如下方法发送消息即可
defaultMQProducer.request(new Message(topic, tags, message.getBytes()), new RequestCallback() {
@Override
public void onSuccess(Message message) {
System.out.printf("异步消息发送成功:%s", message);
}
@Override
public void onException(Throwable throwable) {
System.out.printf("出现了异常,异常信息:%s", throwable.getMessage());
}
}, 10);
单向消息
单向消息主要用于对发送结果不敏感,不会影响业务的模块,无需Producer监听broker响应,常用于日志发送
使用如下方法发送消息即可
defaultMQProducer.sendOneway(msg);
对比
发送方式 | 发送速度 | 反馈 | 可靠性 |
---|---|---|---|
同步发送 | 快 | 有(同步方式接收) | 无消息丢失 |
异步发送 | 快 | 有(回调方式接收) | 无消息丢失 |
单向发送 | 最快 | 无 | 可能丢失 |
按照功能对消息分类
生产者可以发送四类消息分别是
普通消息
刚刚的案例中发送的就是普通消息
延时消息
现在RocketMq并不支持任意时间的延时,需要设置几个固定的延时等级,从1s到2h分别对应着等级1到18
等级 | 对应延迟时间 |
---|---|
1 | 1s |
2 | 5s |
3 | 10s |
4 | 30s |
5 | 1m |
6 | 2m |
7 | 3m |
8 | 4m |
9 | 5m |
10 | 6m |
11 | 7m |
12 | 8m |
13 | 9m |
14 | 10m |
15 | 20m |
16 | 30m |
17 | 1h |
18 | 2h |
只需要在发送消息的时候设置延迟级别即可
Message msg = new Message(topic, tags, message.getBytes());
msg.setDelayTimeLevel(1);
顺序消息和事务消息放在后面两篇文章