我正在使用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)框架,那么一个简单的单例就可以完成这项工作。解决线程安全问题由您决定。

07-25 22:51