文章目录
消息发送
普通消息
生产者多次循环发送该消息,broker收到消息顺序会不一致,因为convertAndSend并没有等上一条信息发送完并收到响应再发送下一条消息
@GetMapping("/send")
public String send() {
rocketMQTemplate.convertAndSend("topic","普通消息");
return "发送成功";
}
同步消息
producer向 broker 发送消息后同步等待, 直到broker 服务器返回发送结果
@GetMapping("/sync")
public String sync() {
SendResult sendResult = rocketMQTemplate.syncSend("topic:sync", "同步消息");
if (sendResult.getSendStatus() == SendStatus.SEND_OK) {
return "同步发送成功";
}
return "同步发送失败";
}
SendStatus中有四种状态
状态 | 意义 |
---|---|
SendStatus.SEND_OK | 消息发送成功,需要将消息刷盘和消息复制到 slave 节点变为同步才是真正发送成功 |
SendStatus. FLUSH_DISK_TIMEOUT | 消息发送成功但消息刷盘超时 |
SendStatus.FLUSH_SLAVE_TIMEOUT | 消息发送成功但是消息同步到slave节点超时 |
SendStatus.SLAVE_NOT_AVAILABLE | 消息发送成功但是broker的slave节点不可用 |
配置消息刷盘同步,配置消息复制到slave为同步,将flushDiskType刷盘方式设为同步刷盘,将brokerRole角色设为同步双写
/conf/broker.conf
flushDiskType=SYNC_FLUSH #ASYNC_FLUSH 异步刷盘; SYNC_FLUSH 同步刷盘
brokerRole=SYNC_MASTER # Broker的角色: ASYNC_MASTER 异步复制; SYNC_MASTER 同步双写; SLAVE 努力
异步消息
producer向 broker 发送消息注册回调方法,调用 API 后立即返回,消息发送成功或失败的回调任务在一个新的线程中执行
@GetMapping("/async")
public String async() {
rocketMQTemplate.asyncSend("topic:async", "异步消息", new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
System.out.println("异步消息发送成功");
}
@Override
public void onException(Throwable throwable) {
System.out.println("异步消息发送失败");
}
});
return "发送异步消息";
}
topic:async中的topic是主题,async是tag,用于区分一个主题下的不同tag,之间用冒号隔开,在写消费者时,topic写主题,selectorExpression写tag的表达式,支持 * || 这些匹配逻辑
@Component
@RocketMQMessageListener(topic = "topic",
selectorExpression = "async",consumerGroup = "my-consumer-group")
public class Consumer implements RocketMQListener<String> {
@Override
public void onMessage(String message) {
System.out.println(message);
}
}
单向消息
producer向 broker 发送消息,执行 API 时直接返回,不等待broker 服务器的结果 ,也不注册回调函数
@GetMapping("/oneWay")
public String oneWay() {
rocketMQTemplate.sendOneWay("oneWay", "单向消息");
return "单向消息发送成功";
}
顺序消息
RocketMQ的一个主题topic下会有多个消息队列,使用setMessageQueueSelector将信息发送指定的消息队列,如list.get(1)就是指定1这个队列,生产环境可以将id根据队列数list.size()取模,则如果发送多次消息,这多次消息都在该队列中排队即有序,前面完成了有序存储,后面需要消费者有序消费
@RequestMapping("/orderly")
public String orderly() {
rocketMQTemplate.setMessageQueueSelector(new MessageQueueSelector() {
@Override
public MessageQueue select(List<MessageQueue> list, org.apache.rocketmq.common.message.Message message,