package com.zt.plat.module.qms.business.reportdoc.controller.admin;

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.client.impl.factory.MQClientInstance;
import org.apache.rocketmq.client.impl.MQClientAPIImpl;
import org.apache.rocketmq.remoting.protocol.route.BrokerData;
import org.apache.rocketmq.remoting.protocol.route.TopicRouteData;


public class RocketMqDebugDemo {

    public static void main(String[] args) throws Exception {
        // 1. 【标准定义】创建 Producer 实例
        // 这里的 "MyProducerGroup" 是你的生产者组名，随意定义，但要唯一
        DefaultMQProducer producer = new DefaultMQProducer("MyProducerGroup");

        // 2. 【关键配置】设置 NameServer 地址
        // 注意：这里填你映射到宿主机的地址，如 127.0.0.1:9876 或 服务器IP:9876
        producer.setNamesrvAddr("127.0.0.1:9876");

        // 3. 【可选优化】关闭 VIP 通道 (解决部分网络环境问题)
        producer.setVipChannelEnabled(false);

        // 4. 启动 Producer
        producer.start();
        System.out.println("Producer 启动成功...");

        // ==========================================
        // 5. 【插入调试代码】在发送消息前，获取路由信息
        // ==========================================
        String targetTopic = "SYSTEM_IWORK_BIZ_CALLBACK";

        try {
            // 获取内部实现对象
            MQClientInstance factory = producer.getDefaultMQProducerImpl().getmQClientFactory();
            MQClientAPIImpl apiImpl = factory.getMQClientAPIImpl();

            // 请求路由信息 (超时设为 3000ms)
            TopicRouteData routeData = apiImpl.getTopicRouteInfoFromNameServer(targetTopic, 3000);

            if (routeData != null && routeData.getBrokerDatas() != null) {
                System.out.println("\n====== 路由调试信息 ======");
                for (BrokerData bd : routeData.getBrokerDatas()) {
                    System.out.println("Broker 名称: " + bd.getBrokerName());
                    System.out.println("Cluster 名称: " + bd.getCluster());
                    // 【核心】打印 Broker 地址列表，Key 是 BrokerID (0 代表 Master)
                    System.out.println("Broker 地址列表: " + bd.getBrokerAddrs());

                    // 检查地址是否包含内网 IP (如 172.17.x.x)
                    bd.getBrokerAddrs().values().forEach(addr -> {
                        if (addr.startsWith("172.") || addr.startsWith("10.") && !addr.startsWith("10.0.0.")) {
                            System.out.println("⚠️  警告：发现疑似容器内网 IP: " + addr);
                            System.out.println("⚠️  这会导致外部 Producer 连接超时！请检查 brokerIP1 配置。");
                        } else {
                            System.out.println("✅ 地址看起来是可达的: " + addr);
                        }
                    });
                }
                System.out.println("========================\n");
            } else {
                System.out.println("❌ 错误：未获取到 Topic [" + targetTopic + "] 的路由信息。");
                System.out.println("可能原因：Topic 不存在且自动创建被禁用，或 NameServer 连接正常但无数据。");
            }
        } catch (Exception e) {
            System.out.println("❌ 获取路由信息失败: " + e.getMessage());
            e.printStackTrace();
        }

        // ==========================================
        // 6. 【正式发送】如果上面调试没报错，尝试发送
        // ==========================================
        try {
            Message msg = new Message(targetTopic, "TagA", "Hello RocketMQ from Debug Code".getBytes());
            // 发送超时时间设为 3000ms
            SendResult sendResult = producer.send(msg, 3000);
            System.out.println("✅ 发送成功! MessageId: " + sendResult.getMsgId());
        } catch (Exception e) {
            System.out.println("❌ 发送失败! 错误信息: " + e.getMessage());
            e.printStackTrace();
        } finally {
            // 7. 关闭 Producer
            producer.shutdown();
        }
    }

}
