You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by di...@apache.org on 2018/04/05 18:23:17 UTC

[airavata] branch develop updated: Moving ThriftClientPool to airavata-commons module as it is generic tool that can be used beyond API Server

This is an automated email from the ASF dual-hosted git repository.

dimuthuupe pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/airavata.git


The following commit(s) were added to refs/heads/develop by this push:
     new 03e0ec7  Moving ThriftClientPool to airavata-commons module as it is generic tool that can be used beyond API Server
03e0ec7 is described below

commit 03e0ec733052c33e84403f3555f2a6a32106ef51
Author: dimuthu <di...@gmail.com>
AuthorDate: Thu Apr 5 14:23:11 2018 -0400

    Moving ThriftClientPool to airavata-commons module as it is generic tool that can be used beyond API Server
---
 .../airavata/common/utils/ThriftClientPool.java    | 176 +++++++++++++++++++++
 1 file changed, 176 insertions(+)

diff --git a/modules/commons/src/main/java/org/apache/airavata/common/utils/ThriftClientPool.java b/modules/commons/src/main/java/org/apache/airavata/common/utils/ThriftClientPool.java
new file mode 100644
index 0000000..b04ef82
--- /dev/null
+++ b/modules/commons/src/main/java/org/apache/airavata/common/utils/ThriftClientPool.java
@@ -0,0 +1,176 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.airavata.common.utils;
+
+import org.apache.commons.pool.BasePoolableObjectFactory;
+import org.apache.commons.pool.impl.GenericObjectPool;
+import org.apache.thrift.TServiceClient;
+import org.apache.thrift.protocol.TBinaryProtocol;
+import org.apache.thrift.protocol.TProtocol;
+import org.apache.thrift.transport.TSocket;
+import org.apache.thrift.transport.TTransport;
+import org.apache.thrift.transport.TTransportException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ThriftClientPool<T extends TServiceClient> implements
+        AutoCloseable {
+
+    private static final Logger LOGGER = LoggerFactory
+            .getLogger(ThriftClientPool.class);
+
+    private final GenericObjectPool internalPool;
+
+    public ThriftClientPool(ClientFactory<T> clientFactory,
+                            GenericObjectPool.Config poolConfig, String host, int port) {
+        this(clientFactory, new BinaryOverSocketProtocolFactory(host, port),
+                poolConfig);
+    }
+
+    public ThriftClientPool(ClientFactory<T> clientFactory,
+                            ProtocolFactory protocolFactory, GenericObjectPool.Config poolConfig) {
+        this.internalPool = new GenericObjectPool(new ThriftClientFactory(
+                clientFactory, protocolFactory), poolConfig);
+    }
+
+    class ThriftClientFactory extends BasePoolableObjectFactory {
+
+        private ClientFactory<T> clientFactory;
+        private ProtocolFactory protocolFactory;
+
+        public ThriftClientFactory(ClientFactory<T> clientFactory,
+                                   ProtocolFactory protocolFactory) {
+            this.clientFactory = clientFactory;
+            this.protocolFactory = protocolFactory;
+        }
+
+        @Override
+        public T makeObject() throws Exception {
+            try {
+                TProtocol protocol = protocolFactory.make();
+                return clientFactory.make(protocol);
+            } catch (Exception e) {
+                LOGGER.warn(e.getMessage(), e);
+                throw new ThriftClientException(
+                        "Can not make a new object for pool", e);
+            }
+        }
+
+        public void destroyObject(T obj) throws Exception {
+            if (obj.getOutputProtocol().getTransport().isOpen()) {
+                obj.getOutputProtocol().getTransport().close();
+            }
+            if (obj.getInputProtocol().getTransport().isOpen()) {
+                obj.getInputProtocol().getTransport().close();
+            }
+        }
+    }
+
+    public static interface ClientFactory<T> {
+
+        T make(TProtocol tProtocol);
+    }
+
+    public static interface ProtocolFactory {
+
+        TProtocol make();
+    }
+
+    public static class BinaryOverSocketProtocolFactory implements
+            ProtocolFactory {
+
+        private String host;
+        private int port;
+
+        public BinaryOverSocketProtocolFactory(String host, int port) {
+            this.host = host;
+            this.port = port;
+        }
+
+        public TProtocol make() {
+            TTransport transport = new TSocket(host, port);
+            try {
+                transport.open();
+            } catch (TTransportException e) {
+                LOGGER.warn(e.getMessage(), e);
+                throw new ThriftClientException("Can not make protocol", e);
+            }
+            return new TBinaryProtocol(transport);
+        }
+    }
+
+    public static class ThriftClientException extends RuntimeException {
+
+        // Fucking Eclipse
+        private static final long serialVersionUID = -2275296727467192665L;
+
+        public ThriftClientException(String message, Exception e) {
+            super(message, e);
+        }
+
+    }
+
+    public T getResource() {
+        try {
+            return (T) internalPool.borrowObject();
+        } catch (Exception e) {
+            throw new ThriftClientException(
+                    "Could not get a resource from the pool", e);
+        }
+    }
+
+    public void returnResourceObject(T resource) {
+        try {
+            internalPool.returnObject(resource);
+        } catch (Exception e) {
+            throw new ThriftClientException(
+                    "Could not return the resource to the pool", e);
+        }
+    }
+
+    public void returnBrokenResource(T resource) {
+        returnBrokenResourceObject(resource);
+    }
+
+    public void returnResource(T resource) {
+        returnResourceObject(resource);
+    }
+
+    protected void returnBrokenResourceObject(T resource) {
+        try {
+            internalPool.invalidateObject(resource);
+        } catch (Exception e) {
+            throw new ThriftClientException(
+                    "Could not return the resource to the pool", e);
+        }
+    }
+
+    public void destroy() {
+        close();
+    }
+
+    public void close() {
+        try {
+            internalPool.close();
+        } catch (Exception e) {
+            throw new ThriftClientException("Could not destroy the pool", e);
+        }
+    }
+}
\ No newline at end of file

-- 
To stop receiving notification emails like this one, please contact
dimuthuupe@apache.org.