LoadBalancerLifecycle.java

/*
 * Copyright 2012-present the original author or authors.
 *
 * 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
 *
 *      https://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 org.springframework.cloud.client.loadbalancer;

/**
 * Allows to define actions that should be carried out before and after load-balancing.
 *
 * @author Olga Maciaszek-Sharma
 */
public interface LoadBalancerLifecycle<RC, RES, T> {

	/**
	 * Allows to assess whether the lifecycle bean's callbacks should be executed. Some
	 * examples of possible implementations could comprise of verifying whether the
	 * classes passed in parameters are exactly or extend the classes that this lifecycle
	 * bean should process.
	 * @param requestContextClass The class of the {@link Request} <code>context</code>
	 * @param responseClass The class of the {@link CompletionContext}
	 * <code>clientResponse</code>
	 * @param serverTypeClass The type of Server that the LoadBalancer retrieves
	 * @return <code>true</code> if the lifecycle should be used to process given classes
	 */
	default boolean supports(Class requestContextClass, Class responseClass, Class serverTypeClass) {
		return true;
	}

	/**
	 * A callback method executed before load-balancing.
	 * @param request the {@link Request} that will be used by the LoadBalancer to select
	 * a service instance
	 */
	void onStart(Request<RC> request);

	/**
	 * A callback method executed after a service instance has been selected, before
	 * executing the actual load-balanced request.
	 * @param request the {@link Request} that has been used by the LoadBalancer to select
	 * a service instance
	 * @param lbResponse the {@link Response} returned by the LoadBalancer
	 */
	void onStartRequest(Request<RC> request, Response<T> lbResponse);

	/**
	 * A callback method executed after load-balancing.
	 * @param completionContext the {@link CompletionContext} containing data relevant to
	 * the load-balancing and the response returned from the selected service instance
	 */
	void onComplete(CompletionContext<RES, T, RC> completionContext);

}