【知识积累】RocketMQ-同步消息、异步消息

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();
    }

}

猜你喜欢

转载自blog.csdn.net/axin1240101543/article/details/109601132