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

com.hotels.road.client.partitioning.MessagePartitioner Maven / Gradle / Ivy

There is a newer version: 6.0.21
Show newest version
/**
 * Copyright (C) 2016-2019 Expedia 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.hotels.road.client.partitioning;

import java.util.List;
import java.util.function.Function;
import java.util.function.Supplier;

import lombok.NonNull;

/**
 * A Function that given a message will delegate its execution to one of a supplied list of Functions using a supplied
 * hash function. Messages for which the hash function returns the same value will always be handled by the same
 * delegate.
 *
 * @param  The Function's from type
 * @param  The Function's to type
 */
public class MessagePartitioner implements CloseableFunction {
  private final Supplier> hasherSupplier;
  private final List> delegates;

  public MessagePartitioner(
      @NonNull Supplier> hasherSupplier,
      @NonNull List> delegates) {
    this.hasherSupplier = hasherSupplier;
    this.delegates = delegates;
    if (delegates.size() <= 0) {
      throw new IllegalArgumentException(getClass().getSimpleName() + " must have at least one delegate.");
    }
  }

  @Override
  public RESPONSE apply(MESSAGE message) {
    int partitionNumber = Math.abs(hasherSupplier.get().apply(message)) % delegates.size();
    return delegates.get(partitionNumber).apply(message);
  }

  @Override
  public void close() throws Exception {
    for (Function delegate : delegates) {
      if (delegate instanceof AutoCloseable) {
        ((AutoCloseable) delegate).close();
      }
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy