PoolClientFactory.java 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package io.milvus.pool;
  2. import org.apache.commons.pool2.BaseKeyedPooledObjectFactory;
  3. import org.apache.commons.pool2.PooledObject;
  4. import org.apache.commons.pool2.impl.DefaultPooledObject;
  5. import java.lang.reflect.Constructor;
  6. import java.lang.reflect.Method;
  7. public class PoolClientFactory<C, T> extends BaseKeyedPooledObjectFactory<String, T> {
  8. private final C config;
  9. private Constructor<?> constructor;
  10. private Method closeMethod;
  11. private Method verifyMethod;
  12. public PoolClientFactory(C config, String clientClassName) throws ClassNotFoundException, NoSuchMethodException {
  13. this.config = config;
  14. try {
  15. Class<?> clientCls = Class.forName(clientClassName);
  16. Class<?> configCls = Class.forName(config.getClass().getName());
  17. constructor = clientCls.getConstructor(configCls);
  18. closeMethod = clientCls.getMethod("close", long.class);
  19. verifyMethod = clientCls.getMethod("clientIsReady");
  20. } catch (Exception e) {
  21. System.out.println("Failed to create client pool factory, exception: " + e.getMessage());
  22. throw e;
  23. }
  24. }
  25. @Override
  26. public T create(String key) throws Exception {
  27. try {
  28. T client = (T) constructor.newInstance(this.config);
  29. return client;
  30. } catch (Exception e) {
  31. return null;
  32. }
  33. }
  34. @Override
  35. public PooledObject<T> wrap(T client) {
  36. return new DefaultPooledObject<>(client);
  37. }
  38. @Override
  39. public void destroyObject(String key, PooledObject<T> p) throws Exception {
  40. T client = p.getObject();
  41. closeMethod.invoke(client, 3L);
  42. }
  43. @Override
  44. public boolean validateObject(String key, PooledObject<T> p) {
  45. try {
  46. T client = p.getObject();
  47. return (boolean) verifyMethod.invoke(client);
  48. } catch (Exception e) {
  49. System.out.println("Failed to validate client, exception: " + e.getMessage());
  50. return true;
  51. }
  52. }
  53. @Override
  54. public void activateObject(String key, PooledObject<T> p) throws Exception {
  55. super.activateObject(key, p);
  56. }
  57. @Override
  58. public void passivateObject(String key, PooledObject<T> p) throws Exception {
  59. super.passivateObject(key, p);
  60. }
  61. }