Rocketmq-producer启动(二)

DefaultMQProducerImpl.start()中有一个MQClientInstance.start()方法里面包含了大量定时任务何启动服务.

public void start() throws MQClientException {
        PackageConflictDetect.detectFastjson();
        synchronized (this) {
            switch (this.serviceState) {
                case CREATE_JUST:
                    this.serviceState = ServiceState.START_FAILED;
                    //1.如果没有namesrvAddr则去查找
                    if (null == this.clientConfig.getNamesrvAddr()) {            this.clientConfig.setNamesrvAddr(this.mQClientAPIImpl.fetchNameServerAddr());
                    }
                    //2.启动client端远程通信,并获取当前客户端ip
                    this.mQClientAPIImpl.start();
                    //3.启动各种定时任务
                    this.startScheduledTask();
                    //4.启动拉去服务消息
                    this.pullMessageService.start();
                    //5.启动消费端负载均衡服务
                    this.rebalanceService.start();
this.defaultMQProducer.getDefaultMQProducerImpl().start(false);
                    log.info("the client factory [{}] start OK", this.clientId);
                    this.serviceState = ServiceState.RUNNING;
                    break;
                case RUNNING:
                    break;
                case SHUTDOWN_ALREADY:
                    break;
                case START_FAILED:
                    throw new MQClientException("The Factory object[" + this.getClientId()
                            + "] has been created before, and failed.", null);
                default:
                    break;
            }
        }
    }

fetchNameServerAddr()
关于namesrvAddr的设置一般在两个地方,还有一个是在环境变量里设置.如果这两个地方都没有设置会走该方法.

  • 一个是在创建producer时候设置producer.setNamesrvAddr(MyUtils.getNamesrvAddr())
  • 另一个是在环境变量里设置
  • fetchNameServerAddr()是第三种调用http接口去寻址.需配置hosts信息,客户端默认每隔两分钟去访问一次这个http地址,并更新本地namesrvAddr地址.

MQClientAPIImpl.start()

String localAddress = RemotingUtil.getLocalAddress();
projectGroupPrefix = this.getProjectGroupByIp(localAddress, 3000);

RemotingUtil.getLocalAddress()
方法通过 NetworkInterface.getNetworkInterfaces()遍历解析,拿到当前客户端的ip地址.
this.getProjectGroupByIp(localAddress, 3000);
通过从nameserver拉取信息

startScheduledTask()启动各种定时任务

1.MQClientInstance.this.mQClientAPIImpl.fetchNameServerAddr() 如果当前客户端没有指定setNamesrvAddr,启动查找NamesrvAddr地址服务,每两分钟一次.
2. MQClientInstance.this.updateTopicRouteInfoFromNameServer()启动从nameService更新topic路由信息服务
3. MQClientInstance.this.cleanOfflineBroker();启动清理已经不存在的broker服务
MQClientInstance.this.sendHeartbeatToAllBrokerWithLock();启动发送心跳服务
4. 启动consumer offset持久化
5. 启动调整消费线程池.

this.pullMessageService.start();this.rebalanceService.start();都为consumer端服务,在consumer启动时候在进行分析.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RocketMQ是一个开源的分布式消息中间件,它具有高吞吐量、高可用性、可伸缩性和可靠性的特点。RocketMQ提供了多种语言的客户端,其中包括了针对Spring Boot的RocketMQ启动器(starter)。 RocketMQ的Spring Boot启动器是一个用于集成RocketMQ和Spring Boot的依赖项。通过添加该启动器,我们可以方便地在Spring Boot项目中使用RocketMQ。 要使用rocketmq-spring-boot-starter,您需要完成以下步骤: 1. 在您的项目的pom.xml文件中添加以下依赖项: ```xml <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> <version>版本号</version> </dependency> ``` 请注意,您需要将“版本号”替换为您想要使用的RocketMQ Spring Boot Starter的版本号。 2. 在您的应用程序的配置文件(例如application.properties或application.yml)中添加RocketMQ的相关配置。您可以根据您的需求配置以下属性: - rocketmq.name-server:RocketMQ的Name Server地址。 - rocketmq.producer.group:生产者组的名称。 - rocketmq.consumer.group:消费者组的名称。 - rocketmq.consumer.topics:要订阅的主题列表。 3. 在您的Spring Boot应用程序中使用RocketMQ的相关注解来发送和接收消息。例如,您可以使用`@RocketMQMessageListener`注解来监听RocketMQ的消息,并使用`@RocketMQTransactionListener`注解来处理事务消息。 通过使用rocketmq-spring-boot-starter,您可以方便地在Spring Boot项目中集成RocketMQ,并使用RocketMQ的各种功能,如发送普通消息、发送和接收顺序消息、发送和接收定时消息等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值