RocketMQ 的基本使用

依赖

<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-common</artifactId>
    <version>4.9.1</version>
</dependency>
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-client</artifactId>
	<version>4.9.1</version>
</dependency>

发送消息

/**
 * 消息发送
 * @throws Exception
 */
public void sendMessage() throws Exception {
    DefaultMQProducer producer = new DefaultMQProducer("mygroup");
    //设置nameserver
    producer.setNamesrvAddr("127.0.0.1:9876");
    producer.start();
    // 异步发送时 重试次数,默认 2
    producer.setRetryTimesWhenSendAsyncFailed(2);
    // 同步发送时 重试次数,默认 2
    producer.setRetryTimesWhenSendFailed(2);
    // 是否向其他broker发送请求 默认false
    producer.setRetryAnotherBrokerWhenNotStoreOK(true);
    //topic -- 消息要发送的地址; body -- 具体的消息
    String body = UUID.randomUUID().toString();
    Message message = new Message("mytopic", body.getBytes());
    //单向消息,无回调
    producer.sendOneway(message);
    //有回调
    SendResult sendResult = producer.send(message);
    System.out.println("发送完成");
    System.out.println("发送结果:" + sendResult);
    body = UUID.randomUUID().toString();
    //tag -- 用来过滤消息,消息分组
    message = new Message("mytopic", "mytag", body.getBytes());
    producer.send(message);
    System.out.println("发送完成");
    body = UUID.randomUUID().toString();
    //tag -- 用来过滤消息,消息分组;key -- 用来找消息
    message = new Message("mytopic", "mytag", "mykey", body.getBytes());
    producer.send(message);
    System.out.println("发送完成");
    //一起发送多条消息
    ArrayList<Message> messages = new ArrayList<>();
    for (int i = 0; i < 5; i++) {
        String bodyTemp = UUID.randomUUID().toString();
        Message messageTemp = new Message("mytopic", bodyTemp.getBytes());
        messages.add(messageTemp);
    }
    SendResult sendResults = producer.send(messages);
    System.out.println("发送完成");
    System.out.println("发送结果:" + sendResults);
    //关闭连接
    producer.shutdown();
}
/**
 * 有回调的发送
 * @throws Exception
 */
public void sendMessage2() throws Exception {
    DefaultMQProducer producer = new DefaultMQProducer("mygroup");
    //设置nameserver
    producer.setNamesrvAddr("127.0.0.1:9876");
    producer.start();
    //topic -- 消息要发送的地址; body -- 具体的消息
    String body = UUID.randomUUID().toString();
    Message message = new Message("mytopic", body.getBytes());
    producer.send(message, new SendCallback() {
        @Override
        public void onSuccess(SendResult sendResult) {
            System.out.println(sendResult.getSendStatus());
        }
        @Override
        public void onException(Throwable throwable) {
            System.out.println("发送失败!!!发送失败!!!发送失败!!!");
        }
    });
    System.out.println("发送完成");
    //注:不能关闭连接
    //producer.shutdown();
}
/**
 * 指定 queue 选择器发送
 * @throws Exception
 */
public void sendMessage3() throws Exception {
    DefaultMQProducer producer = new DefaultMQProducer("mygroup");
    //设置nameserver
    producer.setNamesrvAddr("127.0.0.1:9876");
    producer.start();
    for (int i = 0; i < 100; i++) {
        //设置重投时间
        producer.setRetryTimesWhenSendAsyncFailed(10);
        //topic -- 消息要发送的地址; body -- 具体的消息
        String body = UUID.randomUUID().toString();
        Message message = new Message("mytopic", body.getBytes());
        Object arg = System.currentTimeMillis();
        producer.send(
                // 要发的那条消息
                message,
                // queue 选择器 ,向 topic中的哪个queue去写消息
                new MessageQueueSelector() {
                    // 手动 选择一个queue
                    @Override
                    public MessageQueue select(
                            // 当前topic 里面包含的所有queue
                            List<MessageQueue> mqs
                            // 具体要发的那条消息
                            , Message msg
                            // 对应到 send() 里的 args
                            , Object arg) {
                        // TODO Auto-generated method stub
                        System.out.println(mqs.size());
                        // 向固定的一个queue里写消息
                        MessageQueue queue = mqs.get(0);
                        // 选好的queue
                        return queue;
                    }
                }
                // 自定义参数
                , arg);
    }
    System.out.println("发送完成");
    //关闭连接
    producer.shutdown();
}

接收消息

/**
 * 接收消息
 * @throws Exception
 */
public void receiveMessage() throws Exception {
    DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("mygroupp");
    //设置nameserver
    consumer.setNamesrvAddr("127.0.0.1:9876");
    //topic -- 关注的消息地址; * -- 不过滤
    consumer.subscribe("mytopic", "*");
    //只消费Tag=mytag的消息
    //defaultMQPushConsumer.subscribe("mytopic", "mytag");
    //设置最大线程数
    consumer.setConsumeThreadMax(2);
    //设置最小线程数
    consumer.setConsumeThreadMin(2);
    consumer.registerMessageListener(new MessageListenerConcurrently() {
        @Override
        public ConsumeConcurrentlyStatus consumeMessage(
                List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
            for (MessageExt messageExt : list) {
                byte[] body = messageExt.getBody();
                String s = new String(body);
                String name = Thread.currentThread().getName();
                System.out.println(s + "\t" + name);
            }
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        }
    });
    //设置消费模式;BROADCASTING -- 广播模式;CLUSTERING -- 集群模式
    consumer.setMessageModel(MessageModel.CLUSTERING);
    consumer.start();
}
posted @ 2022-03-07 18:03  叕叕666  阅读(49)  评论(0)    收藏  举报