我正在使用Play框架编写RESTful API,并且在应用程序启动时进行了一些引导操作;
Client transClient = new TransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(ESHost, 9300));
这很基本,我建立了与
ElasticSearch
集群的连接。现在,我希望可以通过transClient
访问packages/controllers/etc
,而一种解决方法可能是Cache.set("ES", transClient)
,当然这似乎是不正确的。我在网上找不到有关此文档的任何文档。最好的方法是什么?
最佳答案
最简单的方法是单例。您甚至不必在全局onStart方法中引导它。
public class ConnectionHolder {
private static ConnectionHolder holder;
private Client transClient = new TransportClient(settings).addTransportAddress(new InetSocketTransportAddress(ESHost, 9300));
private ConnectionHolder() { }
static ConnectionHolder getInstance() {
return holder == null ? holder = new ConnectionHolder() : holder;
}
public Client getClient() {
return transClient;
}
}
tl;博士
在我当前的项目中,我们将Guice单例作用域用于此类问题。因此,我们可以轻松地向 Controller 或服务注入(inject)任何内容。该解决方案有很多优点,尤其是在测试期间。如果您的项目中没有任何依赖注入(inject)框架,那么一个简单的单例就可以完成这项工作。解决线程安全问题由您决定。