我正在使用RestTemplate
作为我的一个库中的HttpClient
。我不确定我是否在多线程环境中正确地使用它,因为我的库在多线程环境中会在非常大的负载下使用,所以它必须非常快。
下面是我的DataClient类:
public class DataClient implements Client {
private RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory());
private ExecutorService executor = Executors.newFixedThreadPool(10);
// for synchronous call
@Override
public DataResponse executeSync(DataKey key) {
DataResponse dataResponse = null;
Future<DataResponse> future = null;
try {
future = executeAsync(key);
dataResponse = future.get(key.getTimeout(), TimeUnit.MILLISECONDS);
} catch (TimeoutException ex) {
dataResponse = new DataResponse(null, DataErrorEnum.TIMEOUT, DataStatusEnum.ERROR);
future.cancel(true);
} catch (Exception ex) {
dataResponse = new DataResponse(null, DataErrorEnum.CLIENT_ERROR, DataStatusEnum.ERROR);
}
return dataResponse;
}
//for asynchronous call
@Override
public Future<DataResponse> executeAsync(DataKey key) {
Future<DataResponse> future = null;
Task task = new Task(key, restTemplate);
future = executor.submit(task);
return future;
}
// does this looks right?
private ClientHttpRequestFactory clientHttpRequestFactory() {
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
// setting 2000 ms as the default timeout for each Http Request
RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(2000).setConnectTimeout(2000)
.setSocketTimeout(2000).setStaleConnectionCheckEnabled(false).build();
SocketConfig socketConfig = SocketConfig.custom().setSoKeepAlive(true).setTcpNoDelay(true).build();
PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager();
poolingHttpClientConnectionManager.setMaxTotal(800);
poolingHttpClientConnectionManager.setDefaultMaxPerRoute(700);
CloseableHttpClient httpClientBuilder = HttpClientBuilder.create()
.setConnectionManager(poolingHttpClientConnectionManager).setDefaultRequestConfig(requestConfig)
.setDefaultSocketConfig(socketConfig).build();
requestFactory.setHttpClient(httpClientBuilder);
return requestFactory;
}
}
public class Task implements Callable<DataResponse> {
private final DataKey key;
private final RestTemplate restTemplate;
public Task(DataKey key, RestTemplate restTemplate) {
this.key = key;
this.restTemplate = restTemplate;
}
@Override
public DataResponse call() {
DataResponse dataResponse = null;
String response = null;
try {
String url = createURL();
response = restTemplate.getForObject(url, String.class);
dataResponse = new DataResponse(response, DataErrorEnum.OK, DataStatusEnum.SUCCESS);
} catch (RestClientException ex) {
dataResponse = new DataResponse(null, DataErrorEnum.SERVER_DOWN, DataStatusEnum.ERROR);
} catch (Exception ex) {
dataResponse = new DataResponse(null, DataErrorEnum.CLIENT_ERROR, DataStatusEnum.ERROR);
}
return dataResponse;
}
}
public class DataClientFactory {
private DataClientFactory() {}
private static class ClientHolder {
private static final DataClient INSTANCE = new DataClient();
}
public static Client getInstance() {
return ClientHolder.INSTANCE;
}
}
这就是我要打电话获取数据的方式:
DataResponse response = DataClientFactory.getInstance().executeSync(dataKey);
现在我的问题是--我不确定我是否正确地将RestTemplate
与HttpComponentSclientHttpRequestFactory
一起使用。这里是否需要PoolingHTTPClientConnectionManager
以及RestTemplate
?
我的主要目标是在多线程环境中高效地使用RestTemplate
。因为我的库将在非常大的负荷下使用,所以它必须非常快。在重载下,我看到了大量的TIME_WAIT连接,所以这就是为什么我添加了ClienthTtpRequestFactory()
方法与RestTemplate
一起使用。
RestTemplate
在Spring中是线程安全的。因此,您可能想要做的是在应用程序中只创建RestTemplate
的一个实例,并跨多个线程共享它。当然,这是假设您将对所有人使用相同的HTTP属性(如timeout、set alive等)。如果您需要更改连接属性,您可以在RestTemplate
对象的应用程序启动时创建一个池,并使用它将RestTemplate实例注入到caller类。
问题内容: 我正在尝试将Hibernate用于多线程应用程序,其中每个线程都检索一个对象并将其插入表中。我的代码如下所示。我每个线程都有本地hibernate会话对象,在每个InsertData中,我都执行beginTransaction和commit。 我面临的问题是很多次我收到“ org.hibernate.TransactionException:不支持嵌套事务” 由于我是hibernate
问题内容: 是否有一种实际的方法可以在PHP中实现多线程模型,无论是真正的还是仅对其进行仿真。一段时间以前,建议您可以强制操作系统加载PHP可执行文件的另一个实例并处理其他同时进行的进程。 这样做的问题是,当PHP代码完成执行PHP实例后,它仍保留在内存中,因为无法从PHP中杀死它。因此,如果您正在模拟多个线程,则可以想象会发生什么。因此,我仍在寻找一种可以在PHP中有效完成或模拟多线程的方法。有
问题内容: 我正在开发一个项目,在该项目中,我需要对正在运行的服务器进行HTTP URL调用,该服务器将响应作为JSON字符串返回。 下面是我的主要代码,它使用和- 下面是我的类,它实现接口并使用… 现在我有下面的代码在另一大类它调用的方法类顺序- 所以我的问题是在这里应该是静态的,就像我正确看到的一样,我正在为每个请求重新创建整个连接池,而我猜这不是正确的方法。 注意: 如果我将RestTemp
我正在做一个项目,在这个项目中,我需要对运行
问题内容: 有人可以帮助我了解什么是Java 以及何时使用它吗? 对于该程序的工作方式,我没有一个很清楚的想法。据我了解,所有三个线程同时启动,每个线程将在3000ms之后调用CountDownLatch。因此,递减计数将逐一递减。锁存器变为零后,程序将打印“ Completed”。也许我的理解方式不正确。 // ------------------------------------------
问题内容: 我有如下方法: methodB可以正常工作吗?根据我的理解,methodB将附加methodA的事务,如果methodA在methodB之前退出该怎么办?我想事务只能提交methodA。但是methodB将不会提交,因为该事务之前已提交。 我可以对方法B使用@Transactional(propagation = Propagation.REQUIRES_NEW)。这可以使method