1、依赖
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.6.1</version>
</dependency>
2、同步消息
消息发送中进入同步等待状态,可以保证消息投递一定到达
public class Producer {
public static void main(String[] args) throws MQClientException, RemotingException, InterruptedException, MQBrokerException {
DefaultMQProducer producer = new DefaultMQProducer("xxoo");
//设置name server地址
producer.setNamesrvAddr("192.168.244.8:9876");
producer.start();
// topic 消息将要发送的地址
// body 消息中具体的数据
Message msg = new Message("myTopic001", "hello".getBytes());
//同步消息发送
SendResult sendResult = producer.send(msg);
System.out.println("sendResult:" + sendResult);
producer.shutdown();
}
}
3、异步消息
想要快速发送消息,又不想丢失的时候可以使用异步消息
public class Producer {
public static void main(String[] args) throws MQClientException, RemotingException, InterruptedException, MQBrokerException {
DefaultMQProducer producer = new DefaultMQProducer("xxoo");
//设置name server地址
producer.setNamesrvAddr("192.168.244.8:9876");
producer.start();
// topic 消息将要发送的地址
// body 消息中具体的数据
Message msg = new Message("myTopic001", "hello1".getBytes());
/**
* 异步可靠消息
* 不会阻塞等待broker的确认
* 采用事件监听方式接受broker返回的确认
*/
producer.send(msg, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
System.out.println("onSuccess:" + sendResult);
}
@Override
public void onException(Throwable throwable) {
//处理异常,重投或者调整逻辑
System.out.println("onException:" + throwable.getMessage());
}
});
//发送异步消息的时候不能随便shutdown,需要等待broker回调
// nException:org.apache.rocketmq.remoting.exception.RemotingConnectException:
// connect to [192.168.244.8:9876] failed
//producer.shutdown();
}
}
4、消费消息
public class Consumer {
public static void main(String[] args) throws MQClientException {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ooxx");
consumer.setNamesrvAddr("192.168.244.8:9876");
//每个consumer关注一个topic
//topic 关注的消息地址
//过滤器 * 表示不过滤
consumer.subscribe("myTopic001", "*");
//注册监听器
consumer.registerMessageListener(new MessageListenerConcurrently(){
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
list.forEach(message -> {
byte[] body = message.getBody();
System.out.println(new String(body));
});
// 返回一个消费状态 CONSUME_SUCCESS:消费成功 RECONSUME_LATER:稍后重新推送消费
// 默认情况下 只会被一个consumer消费到 点对点消费
// ack -> acknowledge
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();
}
}