MQClientInstance 定时任务之清理下线的broker和发送消费者和生产者的心跳信息到broker

MQClientInstance 定时任务之清理下线的broker和发送消费者和生产者的心跳信息到broker

//1.清理下线的broker 2.发送消费者和生产者的心跳信息到broker
this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {

    @Override
    public void run() {
        try {
            MQClientInstance.this.cleanOfflineBroker();
            MQClientInstance.this.sendHeartbeatToAllBrokerWithLock();
        } catch (Exception e) {
            log.error("ScheduledTask sendHeartbeatToAllBroker exception", e);
        }
    }
}, 1000, this.clientConfig.getHeartbeatBrokerInterval(), TimeUnit.MILLISECONDS);

① cleanOfflineBroker 清理下线的broker

② sendHeartbeatToAllBrokerWithLock 发送消费者和生产者的心跳信息到broker

public void sendHeartbeatToAllBrokerWithLock() {
    if (this.lockHeartbeat.tryLock()) {
        try {
            //发送心跳信息
            this.sendHeartbeatToAllBroker();
            //发送过滤类名到broker
            this.uploadFilterClassSource();
        } catch (final Exception e) {
            log.error("sendHeartbeatToAllBroker exception", e);
        } finally {
            this.lockHeartbeat.unlock();
        }
    } else {
        log.warn("lock heartBeat, but failed.");
    }
}

sendHeartbeatToAllBroker

private void sendHeartbeatToAllBroker() {
    //准备心跳数据 包括生产者和消费者的信息
    final HeartbeatData heartbeatData = this.prepareHeartbeatData();
    final boolean producerEmpty = heartbeatData.getProducerDataSet().isEmpty();
    final boolean consumerEmpty = heartbeatData.getConsumerDataSet().isEmpty();
    if (producerEmpty && consumerEmpty) {
        log.warn("sending heartbeat, but no consumer and no producer");
        return;
    }
    //将心跳数据发送到broker上
    if (!this.brokerAddrTable.isEmpty()) {
        long times = this.sendHeartbeatTimesTotal.getAndIncrement();
        Iterator<Entry<String/*brokerName*/, HashMap<Long/*brokerId*/, String/*brokerAddr*/>>> it = this.brokerAddrTable.entrySet().iterator();
        while (it.hasNext()) {
            Entry<String, HashMap<Long, String>> entry = it.next();
            String brokerName = entry.getKey();
            HashMap<Long, String> oneTable = entry.getValue();
            if (oneTable != null) {
                for (Map.Entry<Long, String> entry1 : oneTable.entrySet()) {
                    Long id = entry1.getKey();
                    String addr = entry1.getValue();
                    if (addr != null) {
                        if (consumerEmpty) {
                            if (id != MixAll.MASTER_ID)
                                continue;
                        }

                        try {
                            int version = this.mQClientAPIImpl.sendHearbeat(addr, heartbeatData, 3000);
                            if (!this.brokerVersionTable.containsKey(brokerName)) {
                                this.brokerVersionTable.put(brokerName, new HashMap<String, Integer>(4));
                            }
                            this.brokerVersionTable.get(brokerName).put(addr, version);
                            if (times % 20 == 0) {
                                log.info("send heart beat to broker[{} {} {}] success", brokerName, id, addr);
                                log.info(heartbeatData.toString());
                            }
                        } catch (Exception e) {
                            if (this.isBrokerInNameServer(addr)) {
                                log.info("send heart beat to broker[{} {} {}] failed", brokerName, id, addr);
                            } else {
                                log.info("send heart beat to broker[{} {} {}] exception, because the broker not up, forget it", brokerName,
                                    id, addr);
                            }
                        }
                    }
                }
            }
        }
    }
}

查看prepareHeartbeatData 方法,看下发送的数据内容

private HeartbeatData prepareHeartbeatData() {
    HeartbeatData heartbeatData = new HeartbeatData();

    // clientID 客户端id
    heartbeatData.setClientID(this.clientId);

    // Consumer 消费者信息
    for (Map.Entry<String, MQConsumerInner> entry : this.consumerTable.entrySet()) {
        MQConsumerInner impl = entry.getValue();
        if (impl != null) {
            ConsumerData consumerData = new ConsumerData();
            consumerData.setGroupName(impl.groupName());//组名
            consumerData.setConsumeType(impl.consumeType());//push还是pull
            consumerData.setMessageModel(impl.messageModel());//集群还是广播
            consumerData.setConsumeFromWhere(impl.consumeFromWhere());//从何处开始消费
            consumerData.getSubscriptionDataSet().addAll(impl.subscriptions());//消费者订阅信息
            consumerData.setUnitMode(impl.isUnitMode());//是否是unitMode

            heartbeatData.getConsumerDataSet().add(consumerData);
        }
    }

    // Producer 生产者信息
    for (Map.Entry<String/* group */, MQProducerInner> entry : this.producerTable.entrySet()) {
        MQProducerInner impl = entry.getValue();
        if (impl != null) {
            ProducerData producerData = new ProducerData();
            producerData.setGroupName(entry.getKey());//组名

            heartbeatData.getProducerDataSet().add(producerData);
        }
    }

    return heartbeatData;
}
posted @ 2020-08-13 18:20  鹿慕叶  阅读(291)  评论(0编辑  收藏  举报