RocketMQ--核心

rocketmq常用应用场景

解耦

流量削峰

大数据处理

系统异构

消息发送

连接过程

同步消息

事务

两阶段提交(RocketMQ使用)

三阶段提交(RocketMQ没有使用)

事务执行大致流程

事务实例代码,发送端

package com.rocketmq;

import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.LocalTransactionState;
import org.apache.rocketmq.client.producer.TransactionListener;
import org.apache.rocketmq.client.producer.TransactionMQProducer;
import org.apache.rocketmq.client.producer.TransactionSendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageExt;

public class TransactionProducer {
    public static void main(String[] args) throws MQClientException {
        TransactionMQProducer producer = new TransactionMQProducer("xoxogp");
        producer.setNamesrvAddr("192.168.0.104:9876");
        //回调
        producer.setTransactionListener(new TransactionListener() {
            public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
                //执行本地事务
                System.out.println("******executeLocalTransaction******");
                System.out.println("msg = " + new String(msg.getBody()));
                System.out.println("msg = " + msg.getTransactionId());
                /**
                 * 事务方法写这里,同步执行
                 * a()
                 * b()
                 * c()
                 * d()
                 */
                try {
                    // 业务
                } catch (Exception e) {
                    return LocalTransactionState.ROLLBACK_MESSAGE;
                }
                //真正发出去的数据 可用
                return LocalTransactionState.COMMIT_MESSAGE;
            }

            public LocalTransactionState checkLocalTransaction(MessageExt msg) {
                //Broker 端回调,检察事务
                System.out.println("******checkLocalTransaction******");
                System.out.println("msg = " + new String(msg.getBody()));
                System.out.println("msg = " + msg.getTransactionId());
                return LocalTransactionState.COMMIT_MESSAGE;
            }
        });
        producer.start();
        TransactionSendResult sendResult = producer.sendMessageInTransaction(
                new Message("xxxooo001", "测试!这是事务消息".getBytes()), null);
        System.out.println("sendResult = " + sendResult);
        System.out.println("已经停机");
    }
}

RocketMQ消费流程

RocketMQ顺序消费

示例代码发送端

package com.rocketmq;

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;

import java.util.List;

public class Producer02 {
    public static void main(String[] args) throws Exception {
        DefaultMQProducer producer = new DefaultMQProducer("mq02");
        producer.setNamesrvAddr("192.168.1.9:9876");
        producer.start();

        for (int i = 0; i < 20; i++) {
            Message message = new Message("myTopic02", ("hi! " + i).getBytes());
            //实现的消息队列选择器有三种: SelectMessageQueueByRandom, SelectMessageQueueByHash, SelectMessageQueueByMachineRoom
            producer.send(message, new MessageQueueSelector() {
                public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
                    MessageQueue messageQueue = mqs.get((Integer) arg);
                    return messageQueue;
                }
            }, 1, 5000);
        }
    }
}

示例代码接收端

package com.rocketmq;

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.*;
import org.apache.rocketmq.common.message.MessageExt;

import java.util.List;

public class Consumer02 {
    public static void main(String[] args) throws Exception {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("mq02");
        consumer.setNamesrvAddr("192.168.1.9:9876");
        consumer.subscribe("myTopic02", "*");

        //设置最大和最小消费线程数为1
        consumer.setConsumeThreadMax(1);//默认大小为20
        consumer.setConsumeThreadMin(1);//默认大小为20

        //两种消费模式
        /*consumer.registerMessageListener(new MessageListenerConcurrently() {//并发消费
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
                //默认状态有两种: RECONSUME_LATER 和 CONSUME_SUCCESS
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });*/
        consumer.registerMessageListener(new MessageListenerOrderly() {//顺序消费
            public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) {
                for (MessageExt msg : msgs) {
                    System.out.println("msg = " + new String(msg.getBody()));
                }
                //默认状态有四种 SUCCESS, ROLLBACK, COMMIT, SUSPEND_CURRENT_QUEUE_A_MOMENT;
                return ConsumeOrderlyStatus.SUCCESS;
            }
        });
        consumer.start();
    }
}

consumer的启动过程(简述,源码)

Client和Server的交互方式

长连接和轮询(RocketMQ未使用)

长轮询(RocketMQ使用的这种)

交互过程:

1. Client->Server,有没有消息,有,返回,一次长轮询结束

2. Client->Server,有没有消息,没有,挂起,

Server有消息了,推给Client,一次长轮询结束

猜你喜欢

转载自blog.csdn.net/qq_43204550/article/details/112460712