com.flipkart.phantom.thrift.impl.proxy.SocketObjectFactory.java Source code

Java tutorial

Introduction

Here is the source code for com.flipkart.phantom.thrift.impl.proxy.SocketObjectFactory.java

Source

/*
 * Copyright 2012-2015, the original author or authors.
 *
 * Licensed 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 com.flipkart.phantom.thrift.impl.proxy;

import com.flipkart.phantom.thrift.impl.ThriftProxy;
import org.apache.commons.pool.PoolableObjectFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.InetSocketAddress;
import java.net.Socket;

/**
 * <code>SocketObjectFactory</code> is a @link{PoolableObjectFactory} for Socket instances meant to be used with {@link org.apache.commons.pool.impl.GenericObjectPool}
 * It is initialized with a Thrift proxy or it's parameters and is passed onto a GenericObjectPool object
 *
 * @author devashishshankar
 * @author Regunath B
 * @version 1.0, 7th June, 2013
 * @version 2.0, 5th July, 2013
 */
public class SocketObjectFactory implements PoolableObjectFactory<Socket> {

    /** Logger for this class*/
    private static final Logger LOGGER = LoggerFactory.getLogger(SocketObjectFactory.class);

    /** Thrift Proxy instance for initializing the Factory */
    private ThriftProxy thriftProxy;

    /**
     * Constructor for initializing this Factory with a ThriftProxy
     * @param thriftProxy
     */
    public SocketObjectFactory(ThriftProxy thriftProxy) {
        this.setThriftProxy(thriftProxy);
    }

    /**
     * Interface method implementation. Creates and returns a new {@link java.net.Socket}
     * @see org.apache.commons.pool.PoolableObjectFactory#makeObject()
     */
    public Socket makeObject() throws Exception {
        Socket socket = new Socket();
        socket.setSoTimeout(this.getThriftProxy().getThriftTimeoutMillis());
        socket.connect(new InetSocketAddress(this.getThriftProxy().getThriftServer(),
                this.getThriftProxy().getThriftPort()));
        LOGGER.info("Creating a new socket for server : {} at port : {}", this.getThriftProxy().getThriftServer(),
                this.getThriftProxy().getThriftPort());
        return socket;
    }

    /**
     * Interface method implementation. Closes the specified Socket instance
     * @see org.apache.commons.pool.PoolableObjectFactory#destroyObject(Object)
     */
    public void destroyObject(Socket socket) throws Exception {
        LOGGER.info("Closing a socket for server : {} at port : {}", this.getThriftProxy().getThriftServer(),
                this.getThriftProxy().getThriftPort());
        socket.close();
    }

    /**
     * Interface method implementation. Checks if the socket is open and then attempts to set Thrift specific socket properties.
     * An error in any of these operations will invalidate the specified Socket.
     * @see org.apache.commons.pool.PoolableObjectFactory#validateObject(Object)
     */
    public boolean validateObject(Socket socket) {
        if (socket.isClosed()) {
            return false;
        }
        try {
            socket.setSoLinger(false, 0);
            socket.setTcpNoDelay(true);
            return true;
        } catch (Exception e) {
            LOGGER.info("Socket is not valid for server : {} at port : {}", this.getThriftProxy().getThriftServer(),
                    this.getThriftProxy().getThriftPort());
            return false;
        }
    }

    /**
     * Interface method implementation. Does nothing
     * @see org.apache.commons.pool.PoolableObjectFactory#activateObject(Object)
     */
    public void activateObject(Socket socket) throws Exception {
        // no op
    }

    /**
     * Interface method implementation. Does nothing
     * @see org.apache.commons.pool.PoolableObjectFactory#passivateObject(Object)
     */
    public void passivateObject(Socket socket) throws Exception {
        // no op
    }

    /** Getter/Setter Methods */
    public ThriftProxy getThriftProxy() {
        return thriftProxy;
    }

    public void setThriftProxy(ThriftProxy thriftProxy) {
        this.thriftProxy = thriftProxy;
    }
    /** End Getter/Setter Methods */
}