/* * (C) Copyright 2013 Kurento (http://kurento.org/) * * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser General Public License * (LGPL) version 2.1 which accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl-2.1.html * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * */ package com.kurento.kmf.thrift.pool; import java.io.IOException; import org.apache.commons.pool2.BasePooledObjectFactory; import org.apache.commons.pool2.PooledObject; import org.apache.commons.pool2.impl.DefaultPooledObject; import org.apache.thrift.async.TAsyncClient; import org.apache.thrift.async.TAsyncClientManager; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocolFactory; import org.apache.thrift.transport.TNonblockingSocket; import org.apache.thrift.transport.TNonblockingTransport; import org.springframework.beans.factory.annotation.Autowired; import com.kurento.kmf.common.exception.KurentoException; import com.kurento.kmf.thrift.ThriftInterfaceConfiguration; import com.kurento.kms.thrift.api.KmsMediaServerService.AsyncClient; public class ThriftAsyncClientFactory extends BasePooledObjectFactory<AsyncClient> { @Autowired private ThriftInterfaceConfiguration apiConfig; private TAsyncClientManager clientManager; /** * Default constructor, to be used in spring environments */ public ThriftAsyncClientFactory() { try { clientManager = new TAsyncClientManager(); } catch (IOException e) { throw new ClientPoolException("Error creating client manager", e); } } /** * Constructor for non-spring environments. * * @param apiConfig * configuration object */ public ThriftAsyncClientFactory(ThriftInterfaceConfiguration apiConfig) { this(); this.apiConfig = apiConfig; } @Override public AsyncClient create() throws KurentoException { return createAsyncClient(); } @Override public PooledObject<AsyncClient> wrap(AsyncClient obj) { return new DefaultPooledObject<>(obj); } /** * Validates an {@link AsyncClient} before returning it to the queue. This * check is done based on {@link TAsyncClient#hasError()}. * * @param obj * The object to validate. * @return <code>true</code> If the client has no error */ @Override public boolean validateObject(PooledObject<AsyncClient> obj) { return ((AsyncClientWithValidation) obj.getObject()).isValid(); } @Override public void destroyObject(PooledObject<AsyncClient> obj) { // TODO close the transport if needed } private AsyncClient createAsyncClient() { TNonblockingTransport transport; try { transport = new TNonblockingSocket(apiConfig.getServerAddress(), apiConfig.getServerPort()); } catch (IOException e) { throw new ClientPoolException( "Error creating non blocking transport for asynchronous client with \"\n" + this.apiConfig.getServerAddress() + ":" + this.apiConfig.getServerPort(), e); } TProtocolFactory protocolFactory = new TBinaryProtocol.Factory(); return new AsyncClientWithValidation(protocolFactory, clientManager, transport); } }