我正在为与后端数据库的芝麻连接实现类似断路器的功能。当数据库不存在时,我想在2秒后知道这一点,而不要依赖客户端的默认超时。我可以使用自己的FutureTasks克服此问题,在其中执行存储库初始化和连接获取。但是,在日志中,我可以看到芝麻客户端使用o.a.h.i.c.PoolingClientConnectionManager-我打赌通过了[[ExecutorService和一些默认超时。这会使我的FutureTask解决方案非常混乱。有没有更简单的方法来为芝麻客户端设置超时。
RepositoryConnection conn = ....;
...
TupleQuery query = conn.prepareTupleQuery(QueryLangage.SPARQL, "SELECT ...");
query.setMaxExecutionTime(2);
但是,如果要为通过HTTP的所有api调用设置一般超时,当前唯一的方法是获取对HttpClient对象的引用,然后重新配置它:
HTTPRepository repo = ....; AbstractHttpClient httpClient = (AbstractHttpClient)((SesameClientImpl)repo.getSesameClient()).getHtttpClient(); HttpParams params = httpClient.getParams(); params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 2000); httpClient.setParams(params);
如您所见,这非常脆弱(很多显式强制转换),并且使用Apache HttpClient 4.4中不推荐使用的方法。因此,我不完全推荐将其作为稳定的解决方案,但应在短期内提供一种解决方法。从长远来看,Sesame开发团队正在致力于更方便地访问httpclient的配置。