
live.xu.simplehttp.core.SimpleHttpContext Maven / Gradle / Ivy
package live.xu.simplehttp.core;
import live.xu.simplehttp.core.convert.ResultObjectConvert;
import live.xu.simplehttp.core.convert.ResultObjectConverts;
import live.xu.simplehttp.core.executor.MethodExecutors;
import live.xu.simplehttp.core.executor.http.HttpExecutor;
import live.xu.simplehttp.core.executor.http.RedirectHttpExecutor;
import live.xu.simplehttp.core.executor.http.WrapperHttpExecutor;
import live.xu.simplehttp.core.executor.http.httpclient.HttpClientExecutor;
import live.xu.simplehttp.core.interceptor.HttpExecutorInterceptor;
import live.xu.simplehttp.core.proxy.factory.JdkProxyFactory;
import live.xu.simplehttp.core.proxy.factory.ProxyFactory;
import live.xu.simplehttp.core.service.ServiceResolver;
import live.xu.simplehttp.core.service.impl.MemoryServiceResolver;
import lombok.extern.slf4j.Slf4j;
import java.io.Closeable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 应用上下文
* Create by xsg at 2023/07/24 10:50.
*/
@Slf4j
public class SimpleHttpContext implements Closeable {
//全局配置
private final ProxyFactory proxyFactory;
//服务名称解析器
private final ServiceResolver serviceResolver;
//执行器包装类
private final WrapperHttpExecutor wrapperHttpExecutor;
//结果对象转换器
private final ResultObjectConverts resultObjectConverts = new ResultObjectConverts();
//方法执行器
private final MethodExecutors methodExecutors;
public SimpleHttpContext() {
this(new HttpClientExecutor(), new ArrayList<>(), new MemoryServiceResolver(), null);
}
public SimpleHttpContext(ServiceResolver serviceResolver) {
this(new HttpClientExecutor(), new ArrayList<>(), serviceResolver, null);
}
public SimpleHttpContext(HttpExecutor httpExecutor) {
this(httpExecutor, new ArrayList<>(), new MemoryServiceResolver(), null);
}
public SimpleHttpContext(HttpExecutor httpExecutor, List listeners) {
this(httpExecutor, new ArrayList<>(), new MemoryServiceResolver(), listeners);
}
public SimpleHttpContext(List customResultObjectConverts) {
this(new HttpClientExecutor(), customResultObjectConverts, new MemoryServiceResolver(), null);
}
public SimpleHttpContext(HttpExecutor httpExecutor,
List resultObjectConvertList,
ServiceResolver serviceResolver,
List httpExecutorInterceptor) {
this.serviceResolver = serviceResolver;
this.resultObjectConverts.addAll(resultObjectConvertList); //添加自定义结果对象转换
//http执行器
this.wrapperHttpExecutor = new WrapperHttpExecutor(httpExecutor);
this.wrapperHttpExecutor.addListener(httpExecutorInterceptor);
//重定向执行器
RedirectHttpExecutor redirectHttpExecutor = new RedirectHttpExecutor(wrapperHttpExecutor);
//方法执行器
this.methodExecutors = new MethodExecutors(redirectHttpExecutor, resultObjectConverts); // http方法执行器
this.proxyFactory = new JdkProxyFactory(this.methodExecutors, this.serviceResolver);
}
/**
* 获取接口的代理实现
* @param clazz http远程调用声明式接口
* @param 接口类型
* @return 返回代理对象
*/
public T get(Class clazz) {
if (!clazz.isInterface()) {
throw new IllegalArgumentException("clazz必须是接口");
}
return this.proxyFactory.createProxy(clazz);
}
/**
* 获取服务域名解析器
* @return 服务域名解析器
*/
public ServiceResolver getServiceResolver() {
return serviceResolver;
}
/**
* 添加拦截器
* @param httpExecutorInterceptor 拦截器
*/
public void addHttpExecutorInterceptor(HttpExecutorInterceptor httpExecutorInterceptor) {
if (httpExecutorInterceptor != null) {
this.wrapperHttpExecutor.addListener(Collections.singletonList(httpExecutorInterceptor));
}
}
/**
* 添加结果转换器
* @param resultObjectConvert 结果转换器
*/
public void addResultObjectConvert(ResultObjectConvert resultObjectConvert) {
if (resultObjectConvert != null) {
this.resultObjectConverts.add(resultObjectConvert);
}
}
/**
* 关闭环境
*/
@Override
public void close() {
try {
this.wrapperHttpExecutor.close();
} catch (Exception e) {
log.error("删除http执行器异常", e);
}
try {
this.methodExecutors.close();
} catch (Exception e) {
log.error("删除方法执行器异常", e);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy