单向发送
// 创建生产者,指定生产者组(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();