private static LoadBalancingDataPublisher getDataPublisher()
      throws AgentException, MalformedURLException, AuthenticationException, TransportException {

    String tenantDomain = CarbonContext.getThreadLocalCarbonContext().getTenantDomain();

    // Get LoadBalancingDataPublisher which has been registered for the tenant.
    LoadBalancingDataPublisher loadBalancingDataPublisher =
        UsageComponent.getDataPublisher(tenantDomain);

    // If a LoadBalancingDataPublisher had not been registered for the tenant.
    if (loadBalancingDataPublisher == null) {

      List<String> receiverGroups =
          org.wso2.carbon.databridge.agent.thrift.util.DataPublisherUtil.getReceiverGroups(
              DataPublisherUtil.getApiManagerAnalyticsConfiguration().getBamServerUrlGroups());

      String serverUser =
          DataPublisherUtil.getApiManagerAnalyticsConfiguration().getBamServerUser();
      String serverPassword =
          DataPublisherUtil.getApiManagerAnalyticsConfiguration().getBamServerPassword();
      List<ReceiverGroup> allReceiverGroups = new ArrayList<ReceiverGroup>();

      for (String receiverGroupString : receiverGroups) {
        String[] serverURLs = receiverGroupString.split(",");
        List<DataPublisherHolder> dataPublisherHolders = new ArrayList<DataPublisherHolder>();

        for (int i = 0; i < serverURLs.length; i++) {
          String serverURL = serverURLs[i];
          DataPublisherHolder dataPublisherHolder =
              new DataPublisherHolder(null, serverURL, serverUser, serverPassword);
          dataPublisherHolders.add(dataPublisherHolder);
        }

        ReceiverGroup receiverGroup = new ReceiverGroup((ArrayList) dataPublisherHolders);
        allReceiverGroups.add(receiverGroup);
      }

      // Create new LoadBalancingDataPublisher for the tenant.
      loadBalancingDataPublisher = new LoadBalancingDataPublisher((ArrayList) allReceiverGroups);
      try {
        // Add created LoadBalancingDataPublisher.
        UsageComponent.addDataPublisher(tenantDomain, loadBalancingDataPublisher);
      } catch (DataPublisherAlreadyExistsException e) {
        log.warn(
            "Attempting to register a data publisher for the tenant "
                + tenantDomain
                + " when one already exists. Returning existing data publisher");
        return UsageComponent.getDataPublisher(tenantDomain);
      }
    }

    return loadBalancingDataPublisher;
  }