第三章 消息发送与消费 v1.0
第一部分 Spring Boot集成
一、添加依赖
xml
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>二、配置文件
yaml
rocketmq:
name-server: localhost:9876
producer:
group: my-producer-group
send-message-timeout: 3000
retry-times-when-send-failed: 2第二部分 消息发送
一、同步发送
同步发送会等待Broker返回发送结果,可靠性高,适用于重要消息。
java
@Autowired
private RocketMQTemplate rocketMQTemplate;
public void sendSyncMessage() {
Message<String> message = MessageBuilder.withPayload("Hello RocketMQ").build();
SendResult result = rocketMQTemplate.syncSend("topic-name", message);
System.out.println("发送结果: " + result.getSendStatus());
}二、异步发送
异步发送通过回调处理结果,性能高,适用于对响应时间敏感的场景。
java
public void sendAsyncMessage() {
Message<String> message = MessageBuilder.withPayload("Hello RocketMQ").build();
rocketMQTemplate.asyncSend("topic-name", message, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
System.out.println("发送成功");
}
@Override
public void onException(Throwable e) {
System.out.println("发送失败: " + e.getMessage());
}
});
}三、单向发送
单向发送不等待Broker响应,性能最高,适用于日志等不重要的消息。
java
public void sendOneWayMessage() {
Message<String> message = MessageBuilder.withPayload("Hello RocketMQ").build();
rocketMQTemplate.sendOneWay("topic-name", message);
}四、顺序消息
java
public void sendOrderlyMessage() {
Message<String> message = MessageBuilder.withPayload("Hello RocketMQ").build();
// 使用orderId作为分区Key,保证同一订单的消息顺序消费
rocketMQTemplate.syncSendOrderly("topic-name", message, "orderId");
}五、延时消息
java
public void sendDelayedMessage() {
Message<String> message = MessageBuilder.withPayload("Hello RocketMQ").build();
// 延时3秒投递
rocketMQTemplate.syncSend("topic-name", message, 3000);
}六、批量消息
java
public void sendBatchMessage() {
List<Message> messages = new ArrayList<>();
messages.add(MessageBuilder.withPayload("Message1").build());
messages.add(MessageBuilder.withPayload("Message2").build());
messages.add(MessageBuilder.withPayload("Message3").build());
rocketMQTemplate.syncSend("topic-name", messages);
}第三部分 消息消费
一、基本消费
java
@Component
@RocketMQMessageListener(
topic = "topic-name",
consumerGroup = "my-consumer-group"
)
public class MyConsumer implements RocketMQListener<String> {
@Override
public void onMessage(String message) {
System.out.println("收到消息: " + message);
}
}二、消费Tag过滤
java
@Component
@RocketMQMessageListener(
topic = "topic-name",
consumerGroup = "my-consumer-group",
selectorExpression = "tag1 || tag2" // 只消费tag1和tag2的消息
)
public class TagConsumer implements RocketMQListener<String> {
@Override
public void onMessage(String message) {
System.out.println("收到消息: " + message);
}
}三、顺序消费
java
@Component
@RocketMQMessageListener(
topic = "topic-name",
consumerGroup = "my-consumer-group",
consumeMode = ConsumeMode.ORDERLY // 顺序消费模式
)
public class OrderlyConsumer implements RocketMQListener<String> {
@Override
public void onMessage(String message) {
System.out.println("顺序消费: " + message);
}
}四、广播消费
java
@Component
@RocketMQMessageListener(
topic = "topic-name",
consumerGroup = "my-consumer-group",
messageModel = MessageModel.BROADCASTING // 广播消费模式
)
public class BroadcastConsumer implements RocketMQListener<String> {
@Override
public void onMessage(String message) {
System.out.println("广播消费: " + message);
}
}五、消费重试与死信队列
消费失败时,RocketMQ会自动重试。超过重试次数后,消息会被投递到死信队列(DLQ)。
java
@Component
@RocketMQMessageListener(
topic = "topic-name",
consumerGroup = "my-consumer-group"
)
public class RetryConsumer implements RocketMQListener<String> {
@Override
public void onMessage(String message) {
try {
// 业务处理
processMessage(message);
} catch (Exception e) {
// 抛出异常触发重试
throw new RuntimeException("消费失败", e);
}
}
}第四部分 消息查询
一、按MessageId查询
java
public MessageExt queryByMessageId(String messageId) throws Exception {
return rocketMQTemplate.getProducer().queryMessage("topic-name", messageId).getMessageExt();
}二、按Key查询
java
public List<MessageExt> queryByKey(String key) throws Exception {
QueryResult result = rocketMQTemplate.getProducer().queryMessage("topic-name", key, 32, 0, System.currentTimeMillis());
return result.getMessageList();
}