NebulaGraph Java Client  release-3.8
ConnObjectPool.java
1 package com.vesoft.nebula.client.graph.net;
2 
3 import com.vesoft.nebula.client.graph.NebulaPoolConfig;
4 import com.vesoft.nebula.client.graph.data.HostAddress;
5 import com.vesoft.nebula.client.graph.exception.ClientServerIncompatibleException;
6 import com.vesoft.nebula.client.graph.exception.IOErrorException;
7 import java.io.Serializable;
8 import org.apache.commons.pool2.BasePooledObjectFactory;
9 import org.apache.commons.pool2.PooledObject;
10 import org.apache.commons.pool2.impl.DefaultPooledObject;
11 
12 public class ConnObjectPool extends BasePooledObjectFactory<SyncConnection>
13  implements Serializable {
14 
15  private static final long serialVersionUID = 6101157301791971560L;
16 
17  private final NebulaPoolConfig config;
18  private final LoadBalancer loadBalancer;
19  private static final int retryTime = 3;
20 
21  public ConnObjectPool(LoadBalancer loadBalancer, NebulaPoolConfig config) {
22  this.loadBalancer = loadBalancer;
23  this.config = config;
24  }
25 
26  @Override
28  HostAddress address = loadBalancer.getAddress();
29  if (address == null) {
30  throw new IOErrorException(IOErrorException.E_ALL_BROKEN,
31  "All servers are broken.");
32  }
33  int retry = retryTime;
34  SyncConnection conn = new SyncConnection();
35  while (retry-- > 0) {
36  try {
37  if (config.isEnableSsl()) {
38  conn.open(address, config.getTimeout(), config.getSslParam(),
39  config.isUseHttp2(), config.getCustomHeaders());
40  } else {
41  conn.open(address, config.getTimeout(),
42  config.isUseHttp2(), config.getCustomHeaders());
43  }
44  return conn;
45  } catch (IOErrorException e) {
46  if (retry == 0) {
47  throw e;
48  }
49  this.loadBalancer.updateServersStatus();
50  }
51  }
52  return null;
53  }
54 
55  @Override
56  public PooledObject<SyncConnection> wrap(SyncConnection connection) {
57  return new DefaultPooledObject<>(connection);
58  }
59 
60  @Override
61  public void destroyObject(PooledObject<SyncConnection> p) throws Exception {
62  p.getObject().close();
63  // TODO: update the server connection num into load balancer
64  super.destroyObject(p);
65  }
66 
67  @Override
68  public boolean validateObject(PooledObject<SyncConnection> p) {
69  if (p.getObject() == null) {
70  return false;
71  }
72  if (!p.getObject().ping()) {
73  p.getObject().close();
74  return false;
75  }
76  return true;
77  }
78 
79  @Override
80  public void activateObject(PooledObject<SyncConnection> p) throws Exception {
81  if (p.getObject() == null) {
82  throw new RuntimeException("The connection is null.");
83  }
84  if (!p.getObject().ping()) {
85  throw new RuntimeException("The connection is broken.");
86  }
87  super.activateObject(p);
88  }
89 
90  public boolean init() {
91  return loadBalancer.isServersOK();
92  }
93 
94  public void updateServerStatus() {
95  loadBalancer.updateServersStatus();
96  }
97 }