美文网首页
RoketMQ 顺序消息

RoketMQ 顺序消息

作者: 程序猿TT | 来源:发表于2023-07-30 10:11 被阅读0次

顺序消息DEMO

1. 准备

ProductOrder

public class ProductOrder {
    private String orderId;
    private String type;

    public ProductOrder(String orderId, String type) {
        this.orderId = orderId;
        this.type = type;
    }

    public String getOrderId() {
        return orderId;
    }

    public void setOrderId(String orderId) {
        this.orderId = orderId;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    @Override
    public String toString() {
        return "ProductOrder{" +
                "orderId='" + orderId + '\'' +
                ", type='" + type + '\'' +
                '}';
    }
}

OrderType

public enum OrderType {
    ORDER_CREATE, ORDER_PAYMENT, ORDER_FINISHED
}

Producer

public class OrderProducer {
    private static final List<ProductOrder> orderList = new ArrayList<>();

    static {
        orderList.add(new ProductOrder("ORDER_001", OrderType.ORDER_CREATE.name()));
        orderList.add(new ProductOrder("ORDER_001", OrderType.ORDER_PAYMENT.name()));
        orderList.add(new ProductOrder("ORDER_001", OrderType.ORDER_FINISHED.name()));
        orderList.add(new ProductOrder("ORDER_002", OrderType.ORDER_CREATE.name()));
        orderList.add(new ProductOrder("ORDER_002", OrderType.ORDER_PAYMENT.name()));
        orderList.add(new ProductOrder("ORDER_002", OrderType.ORDER_FINISHED.name()));
        orderList.add(new ProductOrder("ORDER_003", OrderType.ORDER_CREATE.name()));
        orderList.add(new ProductOrder("ORDER_003", OrderType.ORDER_PAYMENT.name()));
        orderList.add(new ProductOrder("ORDER_003", OrderType.ORDER_FINISHED.name()));
        orderList.add(new ProductOrder("ORDER_004", OrderType.ORDER_CREATE.name()));
        orderList.add(new ProductOrder("ORDER_004", OrderType.ORDER_PAYMENT.name()));
        orderList.add(new ProductOrder("ORDER_004", OrderType.ORDER_FINISHED.name()));
    }

    public static void main(String[] args) throws Exception {
        //创建一个消息生产者,并设置一个消息生产者组
        DefaultMQProducer producer = new DefaultMQProducer("default-producer");
        //指定 NameServer 地址
        producer.setNamesrvAddr("localhost:9876");
        //初始化 Producer,整个应用生命周期内只需要初始化一次
        producer.start();

        for (int i = 0; i < orderList.size(); i++) {
            //获取当前order
            ProductOrder order = orderList.get(i);
            //创建一条消息对象,指定其主题、标签和消息内容
            Message message = new Message(
                    /* 消息主题名 */
                    "topicTest_1",
                    /* 消息标签 */
                    order.getType(),
                    /* 消息KEY */
                    order.getOrderId(),
                    /* 消息内容 */
                    (order.toString()).getBytes(StandardCharsets.UTF_8)
            );

            //发送消息并返回结果 使用hash选择策略
            SendResult sendResult = producer.send(message, new SelectMessageQueueByHash(), order.getOrderId());

            System.out.println("product: 发送状态:" + sendResult.getSendStatus() + ",存储queue:" + sendResult.getMessageQueue().getQueueId() + ",orderID:" + order.getOrderId() + ",type:" + order.getType());
        }

        // 一旦生产者实例不再被使用则将其关闭,包括清理资源,关闭网络连接等
        producer.shutdown();
    }
}

Consumer

public class OrderConsumer {
    private static final Random random = new Random();

    public static void main(String[] args) throws Exception {
        //创建一个消息消费者,并设置一个消息消费者组
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer_group_order");
        //指定 NameServer 地址
        consumer.setNamesrvAddr("localhost:9876");
        //设置 Consumer 第一次启动时从队列头部开始消费还是队列尾部开始消费
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
        //订阅指定 Topic 下的所有消息
        consumer.subscribe("topicTest_1", "*");

        //注册消费的监听 这里注意顺序消费为MessageListenerOrderly
        consumer.registerMessageListener((MessageListenerOrderly) (list, context) -> {
            //默认 list 里只有一条消息,可以通过设置参数来批量接收消息
            if (list != null) {
                for (MessageExt ext : list) {
                    try {
                        try {
                            //模拟业务逻辑处理中...
                            TimeUnit.SECONDS.sleep(random.nextInt(10));
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        //重试次数
                        int retryTimes = ext.getReconsumeTimes();
                        //获取接收到的消息
                        String message = new String(ext.getBody(), RemotingHelper.DEFAULT_CHARSET);
                        //获取队列ID
                        int queueId = context.getMessageQueue().getQueueId();
                        //打印消息
                        System.out.println("Consumer-线程名称=[" + Thread.currentThread().getId() + "],重试次数:[" + retryTimes + "],接收queueId:[" + queueId + "],接收时间:[" + new Date().getTime() + "],消息=[" + message + "]");

                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                }
            }
            // 模拟异常
            int num = random.nextInt(10);
            if (num % 3 == 0) {
                System.out.println("系统出现异常,阻塞当前队列...");
                return ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT;
            }
            return ConsumeOrderlyStatus.SUCCESS;
        });

        // 消费者对象在使用之前必须要调用 start 初始化
        consumer.start();
        System.out.println("消息消费者已启动");
    }
}

相关文章

  • RoketMQ-事务消息

    1.事务消息执行流程 1.事务消息代码实现 Provider.java Consumer.java 工具类Rand...

  • rocketMq consumer消息消费

    消息从producer发送到了broker之后,消息的订阅者就可以订阅消费消息。 roketmq消息拉取方式有两种...

  • RoketMQ

    消息队列是一种“ 先进先出的”数据结构消息队列的缺点: 不适合那些要求操作实时性高的需求 1. RoketMQ的...

  • 顺序消息

    rocketmq的顺序消息需要满足2点: 1.Producer端保证发送消息有序,且发送到同一个队列。 2.con...

  • 顺序消息

    顺序消息 顺序消息是指消息消费的顺序和生产者发送消息的顺序一样的。 例如:一个订单产生了三条消息分别是订单创建、订...

  • roketmq安装及demo

    1.下载 目前roketmq最新版为4.4.0 , 之前装过roketmq 3.X版本 ,升级到4版本后roket...

  • RocketMQ 10.顺序消息在高并发下的使用

    前言 顺序消息:指的是消息的消费顺序和生产顺序相同 全局顺序:在某个topic下,所有的消息都要保证顺序局部顺序:...

  • RocketMQ的顺序消息

    顺序消息指的是生产者投递消息的顺序与消息消费的顺序一致。某个Topic上所有消息都是顺序的称为全局顺序消息,如果是...

  • RabbitMQ面试题:如何解决消息的顺序问题? --- 202

    RabbitMQ的消息顺序问题,需要分三个环节看待,发送消息的顺序、队列中消息的顺序、消费消息的顺序。 发送消息的...

  • 消息队列之RocketMQ-顺序消息

    1、什么是顺序消息 顺序消息(FIFO 消息)是 MQ 提供的一种严格按照顺序进行发布和消费的消息类型。顺序消息由...

网友评论

      本文标题:RoketMQ 顺序消息

      本文链接:https://www.haomeiwen.com/subject/rkcspdtx.html