RocketMq源码解析-Producer启动

Producer启动源码分析:
DefaultMQProducer.start();
    1.启动生产者DefaultMQProducerImpl.start()(同步方法)
        1:判断服务状态 只有 服务状态为 CREATE_JUST 时,才启动 Producer
        2.防止启动多个 Producer,先把 服务状态修改为 START_FAILED
        3. 检查 groupName 是否合法比如不能为空,是否符合正则 ^[%|a-zA-Z0-9_-]+$,并且最大长度不能超过 255(CHARACTER_MAX_LENGTH = 255);
        4.判断是否需要设置 InstanceName实例名称
            如果实例名称为DEFAULT,则设置实例名称为PID+ "#" + System.nanoTime();
        5. 构建 MQClientInstance 客户端实例对象。
            this.mQClientFactory = MQClientManager.getInstance().getOrCreateMQClientInstance(this.defaultMQProducer, rpcHook);
            整个JVM只存在一个MQClientManager实例维护一个MQClientInstance的缓存表
            private ConcurrentMap factoryTable = new ConcurrentHashMap();
            同一个clientId只能创建一个MQClientInstance
            MQClientInstance封装了RocketMQ网络处理API是消息生产者和消费者和broker,nameserv打交道的媒介
        6:注册当前生产者到MQClientManager管理中,方便后续调用网络请求
            如果注册失败,则更改服务状态为CREATE_JUST
        7.记录topic发布信息this.topicPublishInfoTable.put(this.defaultMQProducer.getCreateTopicKey(), new TopicPublishInfo());
        8.启动生产者
        9.更改服务状态为RUNNING
        10.使用ReentrantLock发送心跳给所有broker
            1.判断生产者和消费者是否同时存在,如果既没有生产者也没有消费者,则打印日志信息 不发送心跳信息直接return;
            2:判断broker地址列表是否为空,不为空则进行发送心跳信息(clientId,生产者集合,消费者集合)
            3.定时清除本地无效broker信息
    2.是否开启消息追踪,如果是则开启消息追踪
        启动消息追踪生产者,启动一个守护线程循环从追踪队列中获取追踪信息
        注册消息追踪优雅关闭
        AsyncTraceDispatcher.flush():休眠1s等待追踪队列全部出队。

你可能感兴趣的:(rocketmq,rocketmq,java)