常见类概述
DefaultMQProducer、TransactionMQProducer、OrderlyMessageProducer、 DefaultMQPushConsumer、DefaultMQPullConsumer、MessageListenerOrderly、 RocketMQTemplate、@RocketMQMessageListener与RocketMQListener
1. DefaultMQProducer (发送普通消息)
DefaultMQProducer
是 RocketMQ 的标准生产者类,用于发送普通消息。
示例代码:
DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName");
producer.setNamesrvAddr("localhost:9876");
producer.start();
try {
Message msg = new Message("TopicName", "TagA", "Hello RocketMQ".getBytes());
SendResult sendResult = producer.send(msg);
System.out.println("Message sent: " + sendResult);
} catch (Exception e) {
e.printStackTrace();
} finally {
producer.shutdown();
}
2. TransactionMQProducer(发送事务消息)
TransactionMQProducer
是 RocketMQ 的事务生产者类,用于发送事务消息。
示例代码:
TransactionMQProducer producer = new TransactionMQProducer("TransactionProducerGroupName");
producer.setNamesrvAddr("localhost:9876");
producer.setTransactionListener(new TransactionListener() {
@Override
public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
// 执行本地事务
return LocalTransactionState.COMMIT_MESSAGE;
}
@Override
public LocalTransactionState checkLocalTransaction(MessageExt msg) {
// 检查本地事务状态
return LocalTransactionState.COMMIT_MESSAGE;
}
});
producer.start();
try {
Message msg = new Message("TopicName", "TagA", "Hello RocketMQ".getBytes());
SendResult sendResult = producer.sendMessageInTransaction(msg, null);
System.out.println("Transaction message sent: " + sendResult);
} catch (Exception e) {
e.printStackTrace();
} finally {
producer.shutdown();
}
3. OrderlyMessageProducer(发送顺序消息)
OrderlyMessageProducer
是 RocketMQ 的顺序消息生产者类,用于发送顺序消息。
也是用DefaultMQProducer类操作,只不过加了个匿名内部类,通过是实现MessageQueueSelector接口的select方法从而实现发送顺序消息
示例代码:
DefaultMQProducer producer = new DefaultMQProducer("OrderlyProducerGroupName");
producer.setNamesrvAddr("localhost:9876");
producer.start();
try {
for (int i = 0; i < 10; i++) {
Message msg = new Message("TopicName", "TagA", ("Orderly message " + i).getBytes());
SendResult sendResult = producer.send(msg, new MessageQueueSelector() {
@Override
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
int index = (Integer) arg;
return mqs.get(index % mqs.size());
}
}, i);
System.out.println("Orderly message sent: " + sendResult);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
producer.shutdown();
}
4. DefaultMQPushConsumer (被动接收/消费消息)
DefaultMQPushConsumer
是 RocketMQ 的推送消费者类,用于接收推送的消息。
示例代码:
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroupName");
consumer.setNamesrvAddr("localhost:9876"); consumer.subscribe("TopicName", "*");
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
for (MessageExt msg : msgs) {
System.out.println("Received message: " + new String(msg.getBody()));
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();
5. DefaultMQPullConsumer (主动拉取/消费消息,已过时。一般用@RocketMQMessageListener替代)
DefaultMQPullConsumer
是 RocketMQ 的拉取消费者类,用于主动拉取消息。
示例代码:
DefaultMQPullConsumer consumer = new DefaultMQPullConsumer("PullConsumerGroupName");
consumer.setNamesrvAddr("localhost:9876");
consumer.start();
Set<MessageQueue> mqs = consumer.fetchSubscribeMessageQueues("TopicName");
for (MessageQueue mq : mqs) {
PullResult pullResult = consumer.pull(mq, "*", 0, 32);
System.out.println(pullResult.getMsgFoundList());
}
consumer.shutdown();
6. MessageListenerOrderly (顺序消费消息)
MessageListenerOrderly
是 RocketMQ 的顺序消息监听器,用于顺序消费消息。
示例代码:
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("OrderlyConsumerGroupName");
consumer.setNamesrvAddr("localhost:9876");
consumer.subscribe("TopicName", "*");
consumer.registerMessageListener(new MessageListenerOrderly() {
@Override
public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) {
for (MessageExt msg : msgs) {
System.out.println("Received orderly message: " + new String(msg.getBody()));
}
return ConsumeOrderlyStatus.SUCCESS;
}
});
consumer.start();
7. RocketMQTemplate (封装了很多消息推送的方法,具体可查看源码)
RocketMQTemplate
是 Spring Boot 提供的模板类,用于简化消息的发送操作。
示例代码:
@Service
public class MyMessageProducer {
@Autowired
private RocketMQTemplate rocketMQTemplate;
public void sendMessage(String message) {
rocketMQTemplate.convertAndSend("TopicName:TagA", message);
}
}
8. @RocketMQMessageListener和RocketMQListener (简化消费者的配置)
@RocketMQMessageListener
是 Spring Boot 提供的注解,用于简化 RocketMQ 消费者的配置。
示例代码:
@Service
@RocketMQMessageListener( topic = "TopicName", consumerGroup = "ConsumerGroupName", selectorExpression = "TagA || TagB", consumeMode = ConsumeMode.CONCURRENTLY, messageModel = MessageModel.CLUSTERING )
public class MyMessageListener implements RocketMQListener<String> {
@Override
public void onMessage(String message) {
System.out.println("Received message: " + message);
}
}
常见组合方式
1. 普通消息生产与消费
- 生产者:
DefaultMQProducer
- 消费者:
DefaultMQPushConsumer
或DefaultMQPullConsumer
2. 事务消息生产与消费
- 生产者:
TransactionMQProducer
- 消费者:
DefaultMQPushConsumer
3. 顺序消息生产与消费
- 生产者:
OrderlyMessageProducer
- 消费者:
DefaultMQPushConsumer
配合MessageListenerOrderly
4. 使用 RocketMQTemplate 发送消息
- 生产者:
RocketMQTemplate
- 消费者:
@RocketMQMessageListener
5. 使用 RocketMQTemplate 发送事务消息
- 生产者:
RocketMQTemplate
配合事务消息发送方法 - 消费者:
@RocketMQMessageListener
6. 使用 RocketMQTemplate 发送顺序消息
- 生产者:
RocketMQTemplate
配合顺序消息发送方法 - 消费者:
@RocketMQMessageListener
配合MessageListenerOrderly
在 Spring Boot 项目中,推荐使用 RocketMQTemplate
和 @RocketMQMessageListener
来简化消息的生产和消费。RocketMQTemplate
提供了更高级的 API,而 @RocketMQMessageListener
简化了消费者的配置。
总结
DefaultMQProducer
: 用于发送普通消息。TransactionMQProducer
: 用于发送事务消息。OrderlyMessageProducer
: 用于发送顺序消息。DefaultMQPushConsumer
: 用于接收推送的消息。DefaultMQPullConsumer
: 用于主动拉取消息。MessageListenerOrderly
: 用于顺序消费消息。RocketMQTemplate
: 用于简化消息的发送操作。@RocketMQMessageListener
: 用于简化 RocketMQ 消费者的配置。
其中@RocketMQMessageListener
和 RocketMQListener
是需要同步使用的,它们通常一起配合使用来实现消息的消费。@RocketMQMessageListener
是一个注解,用于标记一个类为 RocketMQ 的消费者,而 RocketMQListener
是一个接口,需要被消费者类实现,用于定义消息处理逻辑。
注意:
- 普通消息:适用于简单的消息传递,不需要保证消息的顺序和事务一致性,适合大量消息的快速传递。
- 事务消息:适用于需要保证消息发送和本地事务一致性的场景,例如订单处理、支付系统、分布式事务等。
- 顺序消息:适用于需要保证消息顺序的场景,例如订单处理、物流跟踪、金融交易等。