public MessageProducer getProducer(String topicName) throws TubeClientException {
        AtomicLong fbdTime = FROZEN_TOPIC_MAP.get(topicName);
        if (fbdTime != null && fbdTime.get() > System.currentTimeMillis()) {
            return null;
        }
        MessageProducer tmpProducer = producerMap.get(topicName);
        if (tmpProducer != null) {
            if (fbdTime != null) {
                FROZEN_TOPIC_MAP.remove(topicName);
            }
            return tmpProducer;
        }
        synchronized (lastPubTopicCnt) {
            fbdTime = FROZEN_TOPIC_MAP.get(topicName);
            if (fbdTime != null && fbdTime.get() > System.currentTimeMillis()) {
                return null;
            }
            if (lastProducer == null
                    || lastPubTopicCnt.get() >= clusterConfig.getMaxTopicsEachProducerHold()) {
                lastProducer = sessionFactory.createProducer();
                lastPubTopicCnt.set(0);
            }
            try {
                lastProducer.publish(topicName);
            } catch (Throwable e) {
                fbdTime = FROZEN_TOPIC_MAP.get(topicName);
                if (fbdTime == null) {
                    AtomicLong tmpFbdTime = new AtomicLong();
                    fbdTime = FROZEN_TOPIC_MAP.putIfAbsent(topicName, tmpFbdTime);
                    if (fbdTime == null) {
                        fbdTime = tmpFbdTime;
                    }
                }
                fbdTime.set(System.currentTimeMillis() + PUBLISH_FAILURE_WAIT);
                logger.warn("Throw exception while publish topic="
                        + topicName + ", exception is " + e.getMessage());
                return null;
            }
            producerMap.put(topicName, lastProducer);
            lastPubTopicCnt.incrementAndGet();
            return lastProducer;
        }
    }
Get producer by topic name:
  i. if the topic is judged to be an illegal topic, return null;
  ii. if it is not an illegal topic or the status has expired, check:
   a. if the topic has been published before, return the corresponding producer directly;
   b. if the topic is not in the published list, perform the topic's publish action.
 If the topic is thrown exception during the publishing process,
    set the topic to an illegal topic

@param topicName  the topic name

@return  the producer
         if topic is illegal, return null
@throws  TubeClientException
inlong-dataproxy/dataproxy-source/src/main/java/org/apache/inlong/dataproxy/sink/common/TubeProducerHolder.java