/*
* Copyright 2012-2015, 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
*
* 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.flipkart.phantom.thrift.impl;
import com.flipkart.phantom.task.spi.TaskContext;
import com.netflix.hystrix.HystrixCommandProperties;
import org.apache.thrift.transport.TTransport;
import org.springframework.util.StringUtils;
import java.util.HashMap;
import java.util.Map;
/**
* An extension of {@link ThriftProxy}. Adds additional methods required by Hystrix. Uses the Thrift call name as the
* HystrixCommand name for display on the dashboard.
*
* @author Regunath B
* @version 1.0, 28 March, 2013
*/
public abstract class HystrixThriftProxy extends ThriftProxy {
/** The default executor timeout in millis*/
private static final int DEFAULT_EXECUTOR_TIMEOUT = 1000;
/** The overall proxy level execution timeout */
private int proxyExecutorTimeout = HystrixThriftProxy.DEFAULT_EXECUTOR_TIMEOUT;
/** The proxy level thread pool size*/
private Integer proxyThreadPoolSize;
/**
* Map of command names and their respective executor timeouts in milliseconds
*/
protected Map<String,Integer> executorTimeouts = new HashMap<String, Integer>();
/**
* Executes this fallback request when {@link "#proxyThriftRequest(org.apache.thrift.transport.TTransport)"} fails
* @param clientTransport the Thrift {@link org.apache.thrift.transport.TTransport} of the invoking client
* @throws RuntimeException in case of errors
*/
public abstract void fallbackThriftRequest(TTransport clientTransport, Map<String,Object> controlParams);
/**
* Optional. Gets the GroupName this ThriftProxy should be assigned to.
* @return the Group name. Returns null for default
*/
public String getGroupName() {
return super.getName();
}
/**
* Optional. Gets the ThreadPoolName this ThriftProxy should be assigned to.
* @return the Thread pool name. Returns null for default
*/
public String getThreadPoolName() {
return super.getName();
}
/**
* Optional. Gets the Hystrix Properties set by this ThriftProxy
* @return HystrixCommandProperties.Setter, null for default
*/
public HystrixCommandProperties.Setter getHystrixProperties() {
return null;
}
/**
* Abstract method implementation
* @see com.flipkart.phantom.task.spi.AbstractHandler#getDetails()
*/
public String getDetails() {
String details = "Service Class: " + this.getThriftServiceClass() + "\n";
details += "Endpoint: " + this.getThriftServer() + ":" + this.getThriftPort() + "\n";
details += "Timeout: " + this.getThriftTimeoutMillis() + "ms\n";
details += "Executor Timeout: " + this.getProxyExecutorTimeout() + "ms\n";
details += "Methods: " + StringUtils.collectionToDelimitedString(processMap.keySet(), ", ") + "\n";
return details;
}
/**
* Returns a command specific executor timeout. Default implementation returns {@value HystrixThriftProxy#DEFAULT_EXECUTOR_TIMEOUT}
* @param commandName the command name being executed
* @return the executor timeout value in milli seconds
*/
public int getExecutorTimeout(String commandName) {
Integer timeout = this.getExecutorTimeouts().get(commandName); //check if command level timeout has been specified
if (timeout != null) {
return timeout;
}
if (this.getProxyExecutorTimeout() != HystrixThriftProxy.DEFAULT_EXECUTOR_TIMEOUT) { // check if proxy level timeout is set
return this.getProxyExecutorTimeout();
}
return HystrixThriftProxy.DEFAULT_EXECUTOR_TIMEOUT;
}
/** Getter/Setter methods */
public Map<String, Integer> getExecutorTimeouts() {
return this.executorTimeouts;
}
public void setExecutorTimeouts(Map<String, Integer> executorTimeouts) {
this.executorTimeouts = executorTimeouts;
}
public int getProxyExecutorTimeout() {
return this.proxyExecutorTimeout;
}
public void setProxyExecutorTimeout(int proxyExecutorTimeout) {
this.proxyExecutorTimeout = proxyExecutorTimeout;
}
public Integer getProxyThreadPoolSize() {
return this.proxyThreadPoolSize;
}
public void setProxyThreadPoolSize(Integer proxyThreadPoolSize) {
this.proxyThreadPoolSize = proxyThreadPoolSize;
}
}