发送消息的3种方式

单向发送

// 创建生产者,指定生产者组(oneway-producer-group)
DefaultMQProducer producer = new DefaultMQProducer("oneway-producer-group"); 
// 指定 NameServer
producer.setNamesrvAddr("127.0.0.1:9876"); 
// 启动生产者
producer.start(); 
// 构建消息,指定 Topic(onewayTopic)
Message message = new Message("onewayTopic", "我是一个单向消息".getBytes()); 
// 单向发送,没有返回值,不知道成功与否
producer.sendOneway(message);
// 关闭生产者
producer.shutdown();

同步发送

DefaultMQProducer producer = new DefaultMQProducer("test-producer-group");
producer.setNamesrvAddr("127.0.0.1:9876");
producer.start();
// 发送 10 个消息,这10个消息将分摊到4个队列(2-2-3-3)
for (int i = 0; i < 10; i++) {
    Message message = new Message("testTopic", "我是一个简单的消息".getBytes());
  	// 同步发送,有返回值(返回值中有消息ID,发送到哪个队列了,位点等信息)
    SendResult sendResult = producer.send(message);
    System.out.println("消息发送状态:" + sendResult.getSendStatus());
}
producer.shutdown();

异步发送

DefaultMQProducer producer = new DefaultMQProducer("async-producer-group");
producer.setNamesrvAddr("127.0.0.1:9876");
producer.start();
Message message = new Message("asyncTopic", "我是一个异步消息".getBytes());
// 回调方法接收服务器响应,是异步的,不阻塞当前
producer.send(message, new SendCallback() {
    @Override
    public void onSuccess(SendResult sendResult) {
        System.out.println("发送成功");
    }

    @Override
    public void onException(Throwable e) {
        System.err.println("发送失败:" + e.getMessage());
    }
});
producer.shutdown();

消费者

// 创建一个消费者(消费者组为 test-consumer-group)
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test-consumer-group");
// 连接 name server
consumer.setNamesrvAddr("127.0.0.1:9876");
// 订阅一个主题  * 标识订阅这个主题中所有的消息(可以根据 Tag 过滤)
consumer.subscribe("testTopic", "*");
// 设置一个监听器(MessageListenerConcurrently:并发模式)
consumer.registerMessageListener(new MessageListenerConcurrently() {
    @Override
    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
        // 全部内容有很多,包括消息头和消息体,消息体就是生产者发送的内容
        System.out.println("消息全部内容" + msgs.get(0).toString());
        System.out.println("消息体:" + new String(msgs.get(0).getBody()));
        System.out.println("消费上下文:" + context);
        // 返回值 CONSUME_SUCCESS 成功,消息会从 mq 出队
        // 返回值 RECONSUME_LATER 失败, 消息会重新回到队列(默认重试16次)
        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
    }
});
// 启动
consumer.start();
posted @ 2025-06-29 16:57  CyrusHuang  阅读(40)  评论(0)    收藏  举报