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

com.sghd.common.utils.http.AsyncRestOperationsImpl Maven / Gradle / Ivy

The newest version!
package com.sghd.common.utils.http;

import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.converter.ByteArrayHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.ResourceHttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter;
import org.springframework.http.converter.xml.SourceHttpMessageConverter;
import org.springframework.web.client.RequestCallback;
import org.springframework.web.client.ResponseExtractor;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

public class AsyncRestOperationsImpl extends RestTemplate implements AsyncRestOperations {
	private ThreadPoolExecutor threadPool;

	// 构造方法
	@SuppressWarnings("rawtypes")
	AsyncRestOperationsImpl(int coreSize, int maxSize, long liveTime, TimeUnit unit,
			ClientHttpRequestFactory requestFactory) {
		// 初始化转换器
		List> converters = new ArrayList<>();
		converters.add(new ByteArrayHttpMessageConverter());
		converters.add(new StringHttpMessageConverter());
		converters.add(new ResourceHttpMessageConverter());
		converters.add(new SourceHttpMessageConverter());
		converters.add(new AllEncompassingFormHttpMessageConverter());
		setMessageConverters(converters );

		// 初始化请求线程工厂
		LinkedBlockingQueue workQueue = new LinkedBlockingQueue();
		ThreadFactory threadFactory = new ThreadFactory() {
			AtomicInteger sn = new AtomicInteger();

			public Thread newThread(Runnable r) {
				int next = sn.getAndIncrement();
				return new Thread(r, "AsyncRestClient:" + next);
			}
		};
		setRequestFactory(requestFactory);
		
		// 初始化请求线程池
		this.threadPool = new ThreadPoolExecutor(coreSize, maxSize, liveTime, unit, workQueue, threadFactory);
	}

	@Override
	public  Future getForObject(final AsyncCallback callback, final String url, final Class responseType,
			final Object... uriVariables) throws RestClientException {
		Future future = threadPool.submit(new Callable() {
			public T call() {
				try {
					T result = getForObject(url, responseType, uriVariables);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
		return future;
	}

	@Override
	public  Future getForObject(final AsyncCallback callback, final String url, final Class responseType,
			final Map uriVariables) throws RestClientException {
		return threadPool.submit(new Callable() {
			public T call() {
				try {
					T result = getForObject(url, responseType, uriVariables);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});

	}

	@Override
	public  Future getForObject(final AsyncCallback callback, final URI url, final Class responseType)
			throws RestClientException {
		return threadPool.submit(new Callable() {
			public T call() {
				try {
					T result = getForObject(url, responseType);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public  Future> getForEntity(final AsyncCallback> callback,
			final String url, final Class responseType, final Object... uriVariables) throws RestClientException {
		return threadPool.submit(new Callable>() {
			public ResponseEntity call() {
				try {
					ResponseEntity result = getForEntity(url, responseType, uriVariables);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public  Future> getForEntity(final AsyncCallback> callback,
			final String url, final Class responseType, final Map uriVariables)
			throws RestClientException {
		return threadPool.submit(new Callable>() {
			public ResponseEntity call() {
				try {
					ResponseEntity result = getForEntity(url, responseType, uriVariables);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public  Future> getForEntity(final AsyncCallback> callback, final URI url,
			final Class responseType) throws RestClientException {
		return threadPool.submit(new Callable>() {
			public ResponseEntity call() {
				try {
					ResponseEntity result = getForEntity(url, responseType);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public Future headForHeaders(final AsyncCallback callback, final String url,
			final Object... uriVariables) throws RestClientException {
		return threadPool.submit(new Callable() {
			public HttpHeaders call() {
				try {
					HttpHeaders result = headForHeaders(url, uriVariables);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public Future headForHeaders(final AsyncCallback callback, final String url,
			final Map uriVariables) throws RestClientException {
		return threadPool.submit(new Callable() {
			public HttpHeaders call() {
				try {
					HttpHeaders result = headForHeaders(url, uriVariables);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public Future headForHeaders(final AsyncCallback callback, final URI url)
			throws RestClientException {
		return threadPool.submit(new Callable() {
			public HttpHeaders call() {
				try {
					HttpHeaders result = headForHeaders(url);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public Future postForLocation(final AsyncCallback callback, final String url, final Object request,
			final Object... uriVariables) throws RestClientException {
		return threadPool.submit(new Callable() {
			public URI call() {
				try {
					URI result = postForLocation(url, request, uriVariables);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public Future postForLocation(final AsyncCallback callback, final String url, final Object request,
			final Map uriVariables) throws RestClientException {
		return threadPool.submit(new Callable() {
			public URI call() {
				try {
					URI result = postForLocation(url, request, uriVariables);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public Future postForLocation(final AsyncCallback callback, final URI url, final Object request)
			throws RestClientException {
		return threadPool.submit(new Callable() {
			public URI call() {
				try {
					URI result = postForLocation(url, request);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public  Future postForObject(final AsyncCallback callback, final String url, final Object request,
			final Class responseType, final Object... uriVariables) throws RestClientException {
		return threadPool.submit(new Callable() {
			public T call() {
				try {
					T result = postForObject(url, request, responseType, uriVariables);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public  Future postForObject(final AsyncCallback callback, final String url, final Object request,
			final Class responseType, final Map uriVariables) throws RestClientException {
		return threadPool.submit(new Callable() {
			public T call() {
				try {
					T result = postForObject(url, request, responseType, uriVariables);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public  Future postForObject(final AsyncCallback callback, final URI url, final Object request,
			final Class responseType) throws RestClientException {
		return threadPool.submit(new Callable() {
			public T call() {
				try {
					T result = postForObject(url, request, responseType);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public  Future> postForEntity(final AsyncCallback> callback,
			final String url, final Object request, final Class responseType, final Object... uriVariables)
			throws RestClientException {
		return threadPool.submit(new Callable>() {
			public ResponseEntity call() {
				try {
					ResponseEntity result = postForEntity(url, request, responseType, uriVariables);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public  Future> postForEntity(final AsyncCallback> callback,
			final String url, final Object request, final Class responseType, final Map uriVariables)
			throws RestClientException {
		return threadPool.submit(new Callable>() {
			public ResponseEntity call() {
				try {
					ResponseEntity result = postForEntity(url, request, responseType, uriVariables);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public  Future> postForEntity(final AsyncCallback> callback, final URI url,
			final Object request, final Class responseType) throws RestClientException {
		return threadPool.submit(new Callable>() {
			public ResponseEntity call() {
				try {
					ResponseEntity result = postForEntity(url, request, responseType);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public Future put(final AsyncCallback callback, final String url, final Object request,
			final Object... uriVariables) throws RestClientException {
		return threadPool.submit(new Callable() {
			public Void call() {
				try {
					put(url, request, uriVariables);
					if (callback != null)
						callback.onSuccess(null);
					return null;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public Future put(final AsyncCallback callback, final String url, final Object request,
			final Map uriVariables) throws RestClientException {
		return threadPool.submit(new Callable() {
			public Void call() {
				try {
					put(url, request, uriVariables);
					if (callback != null)
						callback.onSuccess(null);
					return null;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public Future put(final AsyncCallback callback, final URI url, final Object request)
			throws RestClientException {
		return threadPool.submit(new Callable() {
			public Void call() {
				try {
					put(url, request);
					if (callback != null)
						callback.onSuccess(null);
					return null;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public Future delete(final AsyncCallback callback, final String url, final Object... uriVariables)
			throws RestClientException {
		return threadPool.submit(new Callable() {
			public Void call() {
				try {
					delete(url, uriVariables);
					if (callback != null)
						callback.onSuccess(null);
					return null;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public Future delete(final AsyncCallback callback, final String url, final Map uriVariables)
			throws RestClientException {
		return threadPool.submit(new Callable() {
			public Void call() {
				try {
					delete(url, uriVariables);
					if (callback != null)
						callback.onSuccess(null);
					return null;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public Future delete(final AsyncCallback callback, final URI url) throws RestClientException {
		return threadPool.submit(new Callable() {
			public Void call() {
				try {
					delete(url);
					if (callback != null)
						callback.onSuccess(null);
					return null;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public Future> optionsForAllow(final AsyncCallback> callback, final String url,
			final Object... uriVariables) throws RestClientException {
		return threadPool.submit(new Callable>() {
			public Set call() {
				try {
					Set result = optionsForAllow(url, uriVariables);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public Future> optionsForAllow(final AsyncCallback> callback, final String url,
			final Map uriVariables) throws RestClientException {
		return threadPool.submit(new Callable>() {
			public Set call() {
				try {
					Set result = optionsForAllow(url, uriVariables);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public Future> optionsForAllow(final AsyncCallback> callback, final URI url)
			throws RestClientException {
		return threadPool.submit(new Callable>() {
			public Set call() {
				try {
					Set result = optionsForAllow(url);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public  Future> exchange(final AsyncCallback> callback, final String url,
			final HttpMethod method, final HttpEntity requestEntity, final Class responseType,
			final Object... uriVariables) throws RestClientException {
		return threadPool.submit(new Callable>() {
			public ResponseEntity call() {
				try {
					ResponseEntity result = exchange(url, method, requestEntity, responseType, uriVariables);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public  Future> exchange(final AsyncCallback> callback, final String url,
			final HttpMethod method, final HttpEntity requestEntity, final Class responseType,
			final Map uriVariables) throws RestClientException {
		return threadPool.submit(new Callable>() {
			public ResponseEntity call() {
				try {
					ResponseEntity result = exchange(url, method, requestEntity, responseType, uriVariables);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public  Future> exchange(final AsyncCallback> callback, final URI url,
			final HttpMethod method, final HttpEntity requestEntity, final Class responseType)
			throws RestClientException {
		return threadPool.submit(new Callable>() {
			public ResponseEntity call() {
				try {
					ResponseEntity result = exchange(url, method, requestEntity, responseType);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public  Future execute(final AsyncCallback callback, final String url, final HttpMethod method,
			final RequestCallback requestCallback, final ResponseExtractor responseExtractor,
			final Object... uriVariables) throws RestClientException {
		return threadPool.submit(new Callable() {
			public T call() {
				try {
					T result = execute(url, method, requestCallback, responseExtractor, uriVariables);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public  Future execute(final AsyncCallback callback, final String url, final HttpMethod method,
			final RequestCallback requestCallback, final ResponseExtractor responseExtractor,
			final Map uriVariables) throws RestClientException {
		return threadPool.submit(new Callable() {
			public T call() {
				try {
					T result = execute(url, method, requestCallback, responseExtractor, uriVariables);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}

	@Override
	public  Future execute(final AsyncCallback callback, final URI url, final HttpMethod method,
			final RequestCallback requestCallback, final ResponseExtractor responseExtractor)
			throws RestClientException {
		return threadPool.submit(new Callable() {
			public T call() {
				try {
					T result = execute(url, method, requestCallback, responseExtractor);
					if (callback != null)
						callback.onSuccess(result);
					return result;
				} catch (Exception ex) {
					if (callback != null)
						callback.onError(ex);
					throw ex;
				}
			}
		});
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy