六、 旧版本的发送简单消息和消费简单消息
RocketMQ5.0之后api的之前版本的api有差异。从发送简单消息和消费简单消息就可以看出来。上一篇的示例用的是RocketMQ5.0的api。现在看下之前版本的发送消息和消费消息。
在MqProducer中添加依赖:
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.9.4</version>
</dependency>
在application.properties添加以下配置:
rocketmq.namesrv=localhost:9876
新建消息发送类:
@Slf4j
@Component
public class OldVersionProducer implements InitializingBean, DisposableBean {
private DefaultMQProducer producer;
@Value("${rocketmq.namesrv}")
private String namesrv;
@Override
public void destroy() throws Exception {
if (producer != null) {
producer.shutdown();
}
}
@Override
public void afterPropertiesSet() throws Exception {
if (producer == null) {
producer = new DefaultMQProducer("my-producer");
}
producer.setNamesrvAddr(namesrv);
producer.start();
}
public SendResult send(String topic,String msg) throws InterruptedException, RemotingException, MQClientException, MQBrokerException {
Message message = new Message(topic, msg.getBytes(StandardCharsets.UTF_8));
return producer.send(message);
}
}
发送消息使用DefaultMQProducer,设置namesrv即可。发送的消息通过topic和二进制消息组成Message,通过DefaultMQProducer发送到broker中。InitializingBean, DisposableBean是Spring的生命周期接口。
在MyController添加以下内容:
@Autowired
private OldVersionProducer oldVersionProducer;
String topic = "MyTopic";
private DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@RequestMapping("/sendByOld")
public List<SendResult> sendByOld() {
List<SendResult> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
try {
list.add(oldVersionProducer.send(topic,"old version message:" + LocalDateTime.now().format(formatter1)));
} catch (InterruptedException e) {
e.printStackTrace();
} catch (RemotingException e) {
e.printStackTrace();
} catch (MQClientException e) {
e.printStackTrace();
} catch (MQBrokerException e) {
e.printStackTrace();
}
}
return list;
}
调用http://localhost:8001/sendByOld,发送消息。
还是使用RocketMQ5.0版本的消费消息api,查看Mq-Consumer的控制台:
可以消费消息。
现在来看下RocketMQ4.0版本的消费消息api。在Mq-Consumer中添加依赖:
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.9.4</version>
</dependency>
在application.properties添加配置:
rocketmq.namesrv=localhost:9876
添加消费者:
@Slf4j
@Component
public class OldVersionConsumer implements InitializingBean, DisposableBean {
private DefaultMQPushConsumer consumer;
@Value("${rocketmq.namesrv}")
private String namesrv;
@Override
public void destroy() throws Exception {
if (consumer != null) {
consumer.shutdown();
}
}
@Override
public void afterPropertiesSet() throws Exception {
consumer = new DefaultMQPushConsumer("my-consumer");
consumer.setNamesrvAddr(namesrv);
// 设置从之前的消费位置开始消费
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
consumer.subscribe(topic, "*");
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
log.info("消费消息:{}", list);
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();
}
}
消费者DefaultMQPushConsumer类,设置消费者组名,namesrv地址,设置消费的开始位置,订阅topic以及添加消费消息监听器。
注释RocketMq5Consumer类上的@Component。重启后,调用http://localhost:8001/sendByOld发送消息,查看Mq-Consumer的控制台:
已经消费消息。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决