Exemplo n.º 1
0
  private RemotingCommand updateAndCreateTopic(ChannelHandlerContext ctx, RemotingCommand request)
      throws RemotingCommandException {
    final RemotingCommand response = RemotingCommand.createResponseCommand(null);
    final CreateTopicRequestHeader requestHeader =
        (CreateTopicRequestHeader)
            request.decodeCommandCustomHeader(CreateTopicRequestHeader.class);
    log.info(
        "updateAndCreateTopic called by {}", RemotingHelper.parseChannelRemoteAddr(ctx.channel()));

    // Topic名字是否与保留字段冲突
    if (requestHeader
        .getTopic()
        .equals(this.brokerController.getBrokerConfig().getBrokerClusterName())) {
      String errorMsg =
          "the topic[" + requestHeader.getTopic() + "] is conflict with system reserved words.";
      log.warn(errorMsg);
      response.setCode(ResponseCode.SYSTEM_ERROR_VALUE);
      response.setRemark(errorMsg);
      return response;
    }

    TopicConfig topicConfig = new TopicConfig(requestHeader.getTopic());
    topicConfig.setReadQueueNums(requestHeader.getReadQueueNums());
    topicConfig.setWriteQueueNums(requestHeader.getWriteQueueNums());
    topicConfig.setTopicFilterType(requestHeader.getTopicFilterTypeEnum());
    topicConfig.setPerm(requestHeader.getPerm());

    this.brokerController.getTopicConfigManager().updateTopicConfig(topicConfig);

    response.setCode(ResponseCode.SUCCESS_VALUE);
    response.setRemark(null);
    return response;
  }
Exemplo n.º 2
0
  /** 发消息时,如果Topic不存在,尝试创建 */
  public TopicConfig createTopicInSendMessageMethod(
      final String topic,
      final String defaultTopic,
      final String remoteAddress,
      final int clientDefaultTopicQueueNums) {
    TopicConfig topicConfig = null;
    boolean createNew = false;

    try {
      if (this.lockTopicConfigTable.tryLock(LockTimeoutMillis, TimeUnit.MILLISECONDS)) {
        try {
          topicConfig = this.topicConfigTable.get(topic);
          if (topicConfig != null) return topicConfig;

          TopicConfig defaultTopicConfig = this.topicConfigTable.get(defaultTopic);
          if (defaultTopicConfig != null) {
            if (PermName.isInherited(defaultTopicConfig.getPerm())) {
              topicConfig = new TopicConfig(topic);

              int queueNums =
                  clientDefaultTopicQueueNums > defaultTopicConfig.getWriteQueueNums()
                      ? defaultTopicConfig.getWriteQueueNums()
                      : clientDefaultTopicQueueNums;

              if (queueNums < 0) {
                queueNums = 0;
              }

              topicConfig.setReadQueueNums(queueNums);
              topicConfig.setWriteQueueNums(queueNums);
              int perm = defaultTopicConfig.getPerm();
              perm &= ~PermName.PERM_INHERIT;
              topicConfig.setPerm(perm);
              topicConfig.setTopicFilterType(defaultTopicConfig.getTopicFilterType());
            } else {
              log.warn(
                  "create new topic failed, because the default topic["
                      + defaultTopic
                      + "] no perm, "
                      + defaultTopicConfig.getPerm()
                      + " producer: "
                      + remoteAddress);
            }
          } else {
            log.warn(
                "create new topic failed, because the default topic["
                    + defaultTopic
                    + "] not exist."
                    + " producer: "
                    + remoteAddress);
          }

          if (topicConfig != null) {
            log.info(
                "create new topic by default topic["
                    + defaultTopic
                    + "], "
                    + topicConfig
                    + " producer: "
                    + remoteAddress);

            this.topicConfigTable.put(topic, topicConfig);

            createNew = true;

            this.persist();
          }
        } finally {
          this.lockTopicConfigTable.unlock();
        }
      }
    } catch (InterruptedException e) {
      log.error("createTopicInSendMessageMethod exception", e);
    }

    if (createNew) {
      this.brokerController.registerBrokerAll();
    }

    return topicConfig;
  }