JAX-RS 2.0 Client超时代理配置:
/**
* socket timeout (s)
*/
private static final int SOCKET_TIMEOUT = 10;
/**
* Connection Checkout Timeout (s)
*/
private static final int CONNECTION_CHECKOUT_TIMEOUT = 10;
/**
* proxy host name
*/
private static final String PROXY_HOST = "127.0.0.1";
/**
* proxy host port
*/
private static final int PROXY_PORT = 8888;
/**
* enable proxy debug
*/
private static final boolean isEnableProxy = false;
public static Client getClientInstance() {
ResteasyClientBuilder builder = new ResteasyClientBuilder().socketTimeout(SOCKET_TIMEOUT, TimeUnit.SECONDS).
connectionCheckoutTimeout(CONNECTION_CHECKOUT_TIMEOUT, TimeUnit.SECONDS).register(HttpClientLogFilter.class);
if (isEnableProxy) {
builder.defaultProxy(PROXY_HOST, PROXY_PORT);
}
return builder.build();
}
public static Response get(String targetUri, Map<String, Object> paramMap, MediaType MediaType, Boolean sign,
EncryptEnum enu) {
Client client = getClientInstance();
WebTarget webTarget = client.target(targetUri);
if (sign)
addSignParam(paramMap, enu);
for (String key : paramMap.keySet()) {
webTarget = webTarget.queryParam(key, paramMap.get(key));
}
Response res = webTarget.request(MediaType).get();
return res;
}
日志拦截打印,设置请求 RequestId
import lombok.Data;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.input.CloseShieldInputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.client.ClientResponseContext;
import javax.ws.rs.client.ClientResponseFilter;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.UUID;
/**
* @Description:
* @Date: Created in 17:17 2018/11/14
*/
public class HttpClientLogFilter implements ClientRequestFilter, ClientResponseFilter {
private static final String REQUEST_START_TIME = "requestStartTime";
private static final String X_REQUEST_ID = "RequestID";
private static final Logger LOGGER = LoggerFactory.getLogger(HttpClientLogFilter.class);
@Data
private static class ClientLogBean {
/**
* 请求地址
*/
private String requestUrl;
/**
* 请求方式
*/
private String requestMethod;
/**
* 提交方式
*/
private String requestMediaType;
/**
* 请求时间
*/
private Long requestTime;
/**
* 响应时间
*/
private Long responseTime;
/**
* 响应状态码
*/
private Integer responseStatus;
/**
* 请求参数
*/
private Object requestText;
/**
* 耗时(秒)
*/
private Long time;
/**
* Request Id
*/
private Object requestId;
/**
* 响应文本
*/
private Object responseText;
public ClientLogBean(String requestUrl, String requestMethod, Long requestTime) {
this.requestUrl = requestUrl;
this.requestMethod = requestMethod;
this.requestTime = requestTime;
}
}
/**
* 请求之后
*
* @param clientRequestContext
* @param clientResponseContext
* @return
* @date 2018/11/14 17:52
*/
@Override
public void filter(ClientRequestContext clientRequestContext, ClientResponseContext clientResponseContext) throws IOException {
try {
if (clientRequestContext == null) {
return;
}
URI uri = clientRequestContext.getUri();
String method = clientRequestContext.getMethod();
Long requestTime = (Long) clientRequestContext.getProperty(REQUEST_START_TIME);
long responseTime = System.currentTimeMillis();
MediaType mediaType = clientRequestContext.getMediaType();
ClientLogBean clientLogBean = new ClientLogBean(uri.toString(), method, requestTime);
clientLogBean.setRequestMediaType(mediaType == null ? null : mediaType.toString());
clientLogBean.setResponseTime(responseTime);
clientLogBean.setTime((responseTime - requestTime));
clientLogBean.setRequestId(clientRequestContext.getProperty(X_REQUEST_ID));
Object entity = clientRequestContext.getEntity();
if (entity != null && entity instanceof Form) {
Form requestBody = (Form) entity;
clientLogBean.setRequestText(requestBody);
}
if (entity != null) {
clientLogBean.setRequestText(entity);
}
InputStream entityStream = clientResponseContext.getEntityStream();
if (entityStream != null) {
CloseShieldInputStream inputStream = new CloseShieldInputStream(entityStream);
byte[] responseByte = IOUtils.toByteArray(inputStream);
clientLogBean.setResponseText(new String(responseByte));
clientResponseContext.setEntityStream(new ByteArrayInputStream(responseByte));
}
int status = clientResponseContext.getStatus();
clientLogBean.setResponseStatus(status);
String logInfo = GsonUtil.toJson(clientLogBean);
LOGGER.info("Url:{} RequestTime:{}", clientLogBean.getRequestUrl(), clientLogBean.getTime());
LOGGER.info("Request System Log Info:{}", logInfo);
} catch (Exception e) {
LOGGER.info("Request System Log Info error", e);
}
}
/**
* 请求之前拦截
*
* @param clientRequestContext
* @return
* @date 2018/11/14 17:52
*/
@Override
public void filter(ClientRequestContext clientRequestContext) throws IOException {
long time = System.currentTimeMillis();
clientRequestContext.setProperty(REQUEST_START_TIME, time);
//Add Request Id
MultivaluedMap<String, Object> headers = clientRequestContext.getHeaders();
String requestId = MDC.get("requestId");
requestId = StringUtil.isBlank(requestId) ? UUID.randomUUID().toString().replaceAll("-", "") : requestId;
clientRequestContext.setProperty(X_REQUEST_ID, requestId);
headers.add(X_REQUEST_ID, requestId);
}
}