一般情况下,我们可以用如下方法获取一个java client。
1 2 3 4 5 6 7 8 9 |
public Client getTransportClient(){ // 设置client.transport.sniff为true来使客户端去嗅探整个集群的状态,把集群中其它机器的ip地址加到客户端中, // 这样做的好处是一般你不用手动设置集群里所有集群的ip到连接客户端,它会自动帮你添加,并且自动发现新加入集群的机器。 Settings settings = ImmutableSettings.settingsBuilder().put(m).put("cluster.name",clusterName).put("client.transport.sniff", true).build(); Client client = new TransportClient(settings).addTransportAddress(new InetSocketTransportAddress(host, port)); return client; } |
或者 如下方法:
1 2 3 4 5 6 7 8 9 |
public Client getEmbeddedClient(){ NodeBuilder nodeBuilder = new NodeBuilder(); Node node = nodeBuilder.loadConfigSettings(false).clusterName(clusterName).local(true).node(); // Node node = nodeBuilder.loadConfigSettings(false).clusterName(clusterName).node(); Client client = node.client(); return client; } |
这种在测试环境下没有问题,但是在线上环境下会出问题,会出现内存溢出和超时等问题。
建议采用如下方法获取java client实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
static Map<String, String> m = new HashMap<String, String>(); // 设置client.transport.sniff为true来使客户端去嗅探整个集群的状态,把集群中其它机器的ip地址加到客户端中, static Settings settings = ImmutableSettings.settingsBuilder().put(m).put("cluster.name",clusterName).put("client.transport.sniff", true).build(); // 创建私有对象 private static TransportClient client; static { try { Class<?> clazz = Class.forName(TransportClient.class.getName()); Constructor<?> constructor = clazz.getDeclaredConstructor(Settings.class); constructor.setAccessible(true); client = (TransportClient) constructor.newInstance(settings); client.addTransportAddress(new InetSocketTransportAddress(host, port)); } catch (Exception e) { e.printStackTrace(); } } // 取得实例 public static synchronized TransportClient getTransportClient() { return client; } |
java client 会创建一个连接池,所以用完后不要关闭,下次可以直接复用。采用单例模式,可以保证应用只产生一个实例。
采用java反射的方法生成一个client ,效率明显高于由于new 一个客户端。