All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.mongodb.internal.connection.DnsMultiServerCluster Maven / Gradle / Ivy

Go to download

The Java operations layer for the MongoDB Java Driver. Third parties can wrap this layer to provide custom higher-level APIs

There is a newer version: 5.3.0-beta0
Show newest version
/*
 * Copyright 2008-present MongoDB, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.mongodb.internal.connection;

import com.mongodb.MongoException;
import com.mongodb.ServerAddress;
import com.mongodb.connection.ClusterId;
import com.mongodb.connection.ClusterSettings;
import com.mongodb.connection.ClusterType;
import com.mongodb.lang.Nullable;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

import static com.mongodb.assertions.Assertions.assertNotNull;

/**
 * 

This class is not part of the public API and may be removed or changed at any time

*/ public final class DnsMultiServerCluster extends AbstractMultiServerCluster { private final DnsSrvRecordMonitor dnsSrvRecordMonitor; private volatile MongoException srvResolutionException; public DnsMultiServerCluster(final ClusterId clusterId, final ClusterSettings settings, final ClusterableServerFactory serverFactory, final DnsSrvRecordMonitorFactory dnsSrvRecordMonitorFactory) { super(clusterId, settings, serverFactory); dnsSrvRecordMonitor = dnsSrvRecordMonitorFactory.create(assertNotNull(settings.getSrvHost()), settings.getSrvServiceName(), new DnsSrvRecordInitializer() { private volatile boolean initialized; @Override public void initialize(final Collection hosts) { srvResolutionException = null; if (!initialized) { initialized = true; DnsMultiServerCluster.this.initialize(applySrvMaxHosts(hosts)); } else { DnsMultiServerCluster.this.onChange(applySrvMaxHosts(hosts)); } } private Collection applySrvMaxHosts(final Collection hosts) { Collection newHosts = hosts; Integer srvMaxHosts = getSettings().getSrvMaxHosts(); if (srvMaxHosts != null && srvMaxHosts > 0) { if (srvMaxHosts < hosts.size()) { List newHostsList = new ArrayList<>(hosts); Collections.shuffle(newHostsList, ThreadLocalRandom.current()); newHosts = newHostsList.subList(0, srvMaxHosts); } } return newHosts; } @Override public void initialize(final MongoException initializationException) { if (!initialized) { srvResolutionException = initializationException; DnsMultiServerCluster.this.initialize(Collections.emptyList()); } } @Override public ClusterType getClusterType() { return DnsMultiServerCluster.this.getClusterType(); } }); dnsSrvRecordMonitor.start(); } @Nullable @Override protected MongoException getSrvResolutionException() { return srvResolutionException; } @Override public void close() { if (dnsSrvRecordMonitor != null) { dnsSrvRecordMonitor.close(); } super.close(); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy