Ejemplo n.º 1
0
  private RemotingCommand getAllDelayOffset(ChannelHandlerContext ctx, RemotingCommand request) {
    final RemotingCommand response = RemotingCommand.createResponseCommand(null);

    String content =
        ((DefaultMessageStore) this.brokerController.getMessageStore())
            .getScheduleMessageService()
            .encode();
    if (content != null && content.length() > 0) {
      try {
        response.setBody(content.getBytes(MixAll.DEFAULT_CHARSET));
      } catch (UnsupportedEncodingException e) {
        log.error("get all delay offset from master error.", e);

        response.setCode(ResponseCode.SYSTEM_ERROR_VALUE);
        response.setRemark("UnsupportedEncodingException " + e);
        return response;
      }
    } else {
      log.error("No delay offset in this broker, client: " + ctx.channel().remoteAddress());
      response.setCode(ResponseCode.SYSTEM_ERROR_VALUE);
      response.setRemark("No delay offset in this broker");
      return response;
    }

    response.setCode(ResponseCode.SUCCESS_VALUE);
    response.setRemark(null);

    return response;
  }
Ejemplo n.º 2
0
  private RemotingCommand getBrokerConfig(ChannelHandlerContext ctx, RemotingCommand request) {

    final RemotingCommand response =
        RemotingCommand.createResponseCommand(GetBrokerConfigResponseHeader.class);
    final GetBrokerConfigResponseHeader responseHeader =
        (GetBrokerConfigResponseHeader) response.getCustomHeader();

    String content = this.brokerController.encodeAllConfig();
    if (content != null && content.length() > 0) {
      try {
        response.setBody(content.getBytes(MixAll.DEFAULT_CHARSET));
      } catch (UnsupportedEncodingException e) {
        log.error("", e);

        response.setCode(ResponseCode.SYSTEM_ERROR_VALUE);
        response.setRemark("UnsupportedEncodingException " + e);
        return response;
      }
    }

    responseHeader.setVersion(this.brokerController.getConfigDataVersion());

    response.setCode(ResponseCode.SUCCESS_VALUE);
    response.setRemark(null);
    return response;
  }
Ejemplo n.º 3
0
  private RemotingCommand getAllSubscriptionGroup(
      ChannelHandlerContext ctx, RemotingCommand request) throws RemotingCommandException {
    final RemotingCommand response = RemotingCommand.createResponseCommand(null);
    String content = this.brokerController.getSubscriptionGroupManager().encode();
    if (content != null && content.length() > 0) {
      try {
        response.setBody(content.getBytes(MixAll.DEFAULT_CHARSET));
      } catch (UnsupportedEncodingException e) {
        log.error("", e);

        response.setCode(ResponseCode.SYSTEM_ERROR_VALUE);
        response.setRemark("UnsupportedEncodingException " + e);
        return response;
      }
    } else {
      log.error("No subscription group in this broker, client: " + ctx.channel().remoteAddress());
      response.setCode(ResponseCode.SYSTEM_ERROR_VALUE);
      response.setRemark("No subscription group in this broker");
      return response;
    }

    response.setCode(ResponseCode.SUCCESS_VALUE);
    response.setRemark(null);

    return response;
  }
Ejemplo n.º 4
0
  private RemotingCommand getAllTopicConfig(ChannelHandlerContext ctx, RemotingCommand request) {
    final RemotingCommand response =
        RemotingCommand.createResponseCommand(GetAllTopicConfigResponseHeader.class);
    final GetAllTopicConfigResponseHeader responseHeader =
        (GetAllTopicConfigResponseHeader) response.getCustomHeader();

    String content = this.brokerController.getTopicConfigManager().encode();
    if (content != null && content.length() > 0) {
      try {
        response.setBody(content.getBytes(MixAll.DEFAULT_CHARSET));
      } catch (UnsupportedEncodingException e) {
        log.error("", e);

        response.setCode(ResponseCode.SYSTEM_ERROR_VALUE);
        response.setRemark("UnsupportedEncodingException " + e);
        return response;
      }
    } else {
      log.error("No topic in this broker, client: " + ctx.channel().remoteAddress());
      response.setCode(ResponseCode.SYSTEM_ERROR_VALUE);
      response.setRemark("No topic in this broker");
      return response;
    }

    response.setCode(ResponseCode.SUCCESS_VALUE);
    response.setRemark(null);

    return response;
  }
Ejemplo n.º 5
0
  private void returnResponse(
      final String group,
      final String topic,
      ChannelHandlerContext ctx,
      final RemotingCommand response,
      final List<MessageExt> msgList) {
    if (null != msgList) {
      ByteBuffer[] msgBufferList = new ByteBuffer[msgList.size()];
      int bodyTotalSize = 0;
      for (int i = 0; i < msgList.size(); i++) {
        try {
          msgBufferList[i] = messageToByteBuffer(msgList.get(i));
          bodyTotalSize += msgBufferList[i].capacity();
        } catch (Exception e) {
          log.error("messageToByteBuffer UnsupportedEncodingException", e);
        }
      }

      ByteBuffer body = ByteBuffer.allocate(bodyTotalSize);
      for (ByteBuffer bb : msgBufferList) {
        bb.flip();
        body.put(bb);
      }

      response.setBody(body.array());

      // 统计
      this.filtersrvController
          .getFilterServerStatsManager()
          .incGroupGetNums(group, topic, msgList.size());

      this.filtersrvController
          .getFilterServerStatsManager()
          .incGroupGetSize(group, topic, bodyTotalSize);
    }

    try {
      ctx.writeAndFlush(response)
          .addListener(
              new ChannelFutureListener() {
                @Override
                public void operationComplete(ChannelFuture future) throws Exception {
                  if (!future.isSuccess()) {
                    log.error(
                        "FilterServer response to " + future.channel().remoteAddress() + " failed",
                        future.cause());
                    log.error(response.toString());
                  }
                }
              });
    } catch (Throwable e) {
      log.error("FilterServer process request over, but response failed", e);
      log.error(response.toString());
    }
  }
Ejemplo n.º 6
0
  private RemotingCommand getBrokerRuntimeInfo(ChannelHandlerContext ctx, RemotingCommand request) {
    final RemotingCommand response = RemotingCommand.createResponseCommand(null);

    HashMap<String, String> runtimeInfo = this.prepareRuntimeInfo();
    KVTable kvTable = new KVTable();
    kvTable.setTable(runtimeInfo);

    byte[] body = kvTable.encode();
    response.setBody(body);
    response.setCode(ResponseCode.SUCCESS_VALUE);
    response.setRemark(null);
    return response;
  }
Ejemplo n.º 7
0
  private RemotingCommand getTopicStatsInfo(ChannelHandlerContext ctx, RemotingCommand request)
      throws RemotingCommandException {
    final RemotingCommand response = RemotingCommand.createResponseCommand(null);
    final GetTopicStatsInfoRequestHeader requestHeader =
        (GetTopicStatsInfoRequestHeader)
            request.decodeCommandCustomHeader(GetTopicStatsInfoRequestHeader.class);

    final String topic = requestHeader.getTopic();
    TopicConfig topicConfig =
        this.brokerController.getTopicConfigManager().selectTopicConfig(topic);
    if (null == topicConfig) {
      response.setCode(MQResponseCode.TOPIC_NOT_EXIST_VALUE);
      response.setRemark("topic[" + topic + "] not exist");
      return response;
    }

    TopicStatsTable topicStatsTable = new TopicStatsTable();
    for (int i = 0; i < topicConfig.getWriteQueueNums(); i++) {
      MessageQueue mq = new MessageQueue();
      mq.setTopic(topic);
      mq.setBrokerName(this.brokerController.getBrokerConfig().getBrokerName());
      mq.setQueueId(i);

      TopicOffset topicOffset = new TopicOffset();
      long min = this.brokerController.getMessageStore().getMinOffsetInQuque(topic, i);
      if (min < 0) min = 0;

      long max = this.brokerController.getMessageStore().getMaxOffsetInQuque(topic, i);
      if (max < 0) max = 0;

      long timestamp = 0;
      if (max > 0) {
        timestamp =
            this.brokerController.getMessageStore().getMessageStoreTimeStamp(topic, i, (max - 1));
      }

      topicOffset.setMinOffset(min);
      topicOffset.setMaxOffset(max);
      topicOffset.setLastUpdateTimestamp(timestamp);

      topicStatsTable.getOffsetTable().put(mq, topicOffset);
    }

    byte[] body = topicStatsTable.encode();
    response.setBody(body);
    response.setCode(ResponseCode.SUCCESS_VALUE);
    response.setRemark(null);
    return response;
  }
Ejemplo n.º 8
0
  private RemotingCommand getConsumerConnectionList(
      ChannelHandlerContext ctx, RemotingCommand request) throws RemotingCommandException {
    final RemotingCommand response = RemotingCommand.createResponseCommand(null);
    final GetConsumerConnectionListRequestHeader requestHeader =
        (GetConsumerConnectionListRequestHeader)
            request.decodeCommandCustomHeader(GetConsumerConnectionListRequestHeader.class);

    ConsumerGroupInfo consumerGroupInfo =
        this.brokerController
            .getConsumerManager()
            .getConsumerGroupInfo(requestHeader.getConsumerGroup());
    if (consumerGroupInfo != null) {
      ConsumerConnection bodydata = new ConsumerConnection();
      bodydata.setConsumeFromWhere(consumerGroupInfo.getConsumeFromWhere());
      bodydata.setConsumeType(consumerGroupInfo.getConsumeType());
      bodydata.setMessageModel(consumerGroupInfo.getMessageModel());
      bodydata.getSubscriptionTable().putAll(consumerGroupInfo.getSubscriptionTable());

      Iterator<Map.Entry<Channel, ClientChannelInfo>> it =
          consumerGroupInfo.getChannelInfoTable().entrySet().iterator();
      while (it.hasNext()) {
        ClientChannelInfo info = it.next().getValue();
        Connection connection = new Connection();
        connection.setClientId(info.getClientId());
        connection.setLanguage(info.getLanguage());
        connection.setVersion(info.getVersion());
        connection.setClientAddr(RemotingHelper.parseChannelRemoteAddr(info.getChannel()));

        bodydata.getConnectionSet().add(connection);
      }

      byte[] body = bodydata.encode();
      response.setBody(body);
      response.setCode(ResponseCode.SUCCESS_VALUE);
      response.setRemark(null);

      return response;
    }

    response.setCode(MQResponseCode.SUBSCRIPTION_GROUP_NOT_EXIST_VALUE);
    response.setRemark("the consumer group[" + requestHeader.getConsumerGroup() + "] not online");
    return response;
  }
Ejemplo n.º 9
0
  private RegisterBrokerResult registerBroker( //
      final String namesrvAddr, //
      final String clusterName, // 1
      final String brokerAddr, // 2
      final String brokerName, // 3
      final long brokerId, // 4
      final String haServerAddr, // 5
      final TopicConfigSerializeWrapper topicConfigWrapper // 6
      )
      throws RemotingCommandException, MQBrokerException, RemotingConnectException,
          RemotingSendRequestException, RemotingTimeoutException, InterruptedException {
    RegisterBrokerRequestHeader requestHeader = new RegisterBrokerRequestHeader();
    requestHeader.setBrokerAddr(brokerAddr);
    requestHeader.setBrokerId(brokerId);
    requestHeader.setBrokerName(brokerName);
    requestHeader.setClusterName(clusterName);
    requestHeader.setHaServerAddr(haServerAddr);
    RemotingCommand request =
        RemotingCommand.createRequestCommand(MQRequestCode.REGISTER_BROKER_VALUE, requestHeader);
    request.setBody(topicConfigWrapper.encode());

    RemotingCommand response = this.remotingClient.invokeSync(namesrvAddr, request, 3000);
    assert response != null;
    switch (response.getCode()) {
      case ResponseCode.SUCCESS_VALUE:
        {
          RegisterBrokerResponseHeader responseHeader =
              (RegisterBrokerResponseHeader)
                  response.decodeCommandCustomHeader(RegisterBrokerResponseHeader.class);
          RegisterBrokerResult result = new RegisterBrokerResult();
          result.setMasterAddr(responseHeader.getMasterAddr());
          result.setHaServerAddr(responseHeader.getHaServerAddr());
          return result;
        }
      default:
        break;
    }

    throw new MQBrokerException(response.getCode(), response.getRemark());
  }
Ejemplo n.º 10
0
  private RemotingCommand lockBatchMQ(ChannelHandlerContext ctx, RemotingCommand request)
      throws RemotingCommandException {
    final RemotingCommand response = RemotingCommand.createResponseCommand(null);
    LockBatchRequestBody requestBody =
        LockBatchRequestBody.decode(request.getBody(), LockBatchRequestBody.class);

    Set<MessageQueue> lockOKMQSet =
        this.brokerController
            .getRebalanceLockManager()
            .tryLockBatch( //
                requestBody.getConsumerGroup(), //
                requestBody.getMqSet(), //
                requestBody.getClientId());

    LockBatchResponseBody responseBody = new LockBatchResponseBody();
    responseBody.setLockOKMQSet(lockOKMQSet);

    response.setBody(responseBody.encode());
    response.setCode(ResponseCode.SUCCESS_VALUE);
    response.setRemark(null);
    return response;
  }
Ejemplo n.º 11
0
  public RemotingCommand getConsumerListByGroup(ChannelHandlerContext ctx, RemotingCommand request)
      throws RemotingCommandException {
    final RemotingCommand response =
        RemotingCommand.createResponseCommand(GetConsumerListByGroupResponseHeader.class);
    final GetConsumerListByGroupRequestHeader requestHeader =
        (GetConsumerListByGroupRequestHeader)
            request.decodeCommandCustomHeader(GetConsumerListByGroupRequestHeader.class);

    ConsumerGroupInfo consumerGroupInfo =
        this.brokerController
            .getConsumerManager()
            .getConsumerGroupInfo(requestHeader.getConsumerGroup());
    if (consumerGroupInfo != null) {
      List<String> clientIds = consumerGroupInfo.getAllClientId();
      if (!clientIds.isEmpty()) {
        GetConsumerListByGroupResponseBody body = new GetConsumerListByGroupResponseBody();
        body.setConsumerIdList(clientIds);
        response.setBody(body.encode());
        response.setCode(ResponseCode.SUCCESS);
        response.setRemark(null);
        return response;
      } else {
        log.warn(
            "getAllClientId failed, {} {}",
            requestHeader.getConsumerGroup(),
            RemotingHelper.parseChannelRemoteAddr(ctx.channel()));
      }
    } else {
      log.warn(
          "getConsumerGroupInfo failed, {} {}",
          requestHeader.getConsumerGroup(),
          RemotingHelper.parseChannelRemoteAddr(ctx.channel()));
    }

    response.setCode(ResponseCode.SYSTEM_ERROR);
    response.setRemark("no consumer for this group, " + requestHeader.getConsumerGroup());
    return response;
  }
Ejemplo n.º 12
0
  private RemotingCommand getProducerConnectionList(
      ChannelHandlerContext ctx, RemotingCommand request) throws RemotingCommandException {
    final RemotingCommand response = RemotingCommand.createResponseCommand(null);
    final GetProducerConnectionListRequestHeader requestHeader =
        (GetProducerConnectionListRequestHeader)
            request.decodeCommandCustomHeader(GetProducerConnectionListRequestHeader.class);

    ConsumerConnection bodydata = new ConsumerConnection();
    HashMap<Channel, ClientChannelInfo> channelInfoHashMap =
        this.brokerController
            .getProducerManager()
            .getGroupChannelTable()
            .get(requestHeader.getProducerGroup());
    if (channelInfoHashMap != null) {
      Iterator<Map.Entry<Channel, ClientChannelInfo>> it = channelInfoHashMap.entrySet().iterator();
      while (it.hasNext()) {
        ClientChannelInfo info = it.next().getValue();
        Connection connection = new Connection();
        connection.setClientId(info.getClientId());
        connection.setLanguage(info.getLanguage());
        connection.setVersion(info.getVersion());
        connection.setClientAddr(RemotingHelper.parseChannelRemoteAddr(info.getChannel()));

        bodydata.getConnectionSet().add(connection);
      }

      byte[] body = bodydata.encode();
      response.setBody(body);
      response.setCode(ResponseCode.SUCCESS_VALUE);
      response.setRemark(null);
      return response;
    }

    response.setCode(ResponseCode.SYSTEM_ERROR_VALUE);
    response.setRemark("the producer group[" + requestHeader.getProducerGroup() + "] not exist");
    return response;
  }
Ejemplo n.º 13
0
  private RemotingCommand getConsumeStats(ChannelHandlerContext ctx, RemotingCommand request)
      throws RemotingCommandException {
    final RemotingCommand response = RemotingCommand.createResponseCommand(null);
    final GetConsumeStatsRequestHeader requestHeader =
        (GetConsumeStatsRequestHeader)
            request.decodeCommandCustomHeader(GetConsumeStatsRequestHeader.class);

    ConsumeStats consumeStats = new ConsumeStats();

    Set<String> topics =
        this.brokerController
            .getConsumerOffsetManager()
            .whichTopicByConsumer(requestHeader.getConsumerGroup());

    for (String topic : topics) {
      TopicConfig topicConfig =
          this.brokerController.getTopicConfigManager().selectTopicConfig(topic);
      if (null == topicConfig) {
        response.setCode(MQResponseCode.TOPIC_NOT_EXIST_VALUE);
        response.setRemark("topic[" + topic + "] not exist");
        return response;
      }

      for (int i = 0; i < topicConfig.getWriteQueueNums(); i++) {
        MessageQueue mq = new MessageQueue();
        mq.setTopic(topic);
        mq.setBrokerName(this.brokerController.getBrokerConfig().getBrokerName());
        mq.setQueueId(i);

        OffsetWrapper offsetWrapper = new OffsetWrapper();

        long brokerOffset = this.brokerController.getMessageStore().getMaxOffsetInQuque(topic, i);
        if (brokerOffset < 0) brokerOffset = 0;

        long consumerOffset =
            this.brokerController
                .getConsumerOffsetManager()
                .queryOffset( //
                    requestHeader.getConsumerGroup(), //
                    topic, //
                    i);
        if (consumerOffset < 0) consumerOffset = 0;

        offsetWrapper.setBrokerOffset(brokerOffset);
        offsetWrapper.setConsumerOffset(consumerOffset);

        // 查询消费者最后一条消息对应的时间戳
        long timeOffset = consumerOffset - 1;
        if (timeOffset >= 0) {
          long lastTimestamp =
              this.brokerController
                  .getMessageStore()
                  .getMessageStoreTimeStamp(topic, i, timeOffset);
          if (lastTimestamp > 0) {
            offsetWrapper.setLastTimestamp(lastTimestamp);
          }
        }

        consumeStats.getOffsetTable().put(mq, offsetWrapper);
      }

      long consumeTps =
          this.brokerController
              .getConsumerOffsetManager()
              .computePullTPS(topic, requestHeader.getConsumerGroup());

      consumeTps += consumeStats.getConsumeTps();
      consumeStats.setConsumeTps(consumeTps);
    }

    byte[] body = consumeStats.encode();
    response.setBody(body);
    response.setCode(ResponseCode.SUCCESS_VALUE);
    response.setRemark(null);
    return response;
  }