/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2010 Sun Microsystems, Inc. */ package com.sun.opends.sdk.ldap; import java.io.IOException; import org.glassfish.grizzly.TransportFactory; import org.glassfish.grizzly.nio.transport.TCPNIOTransport; import org.glassfish.grizzly.nio.transport.UDPNIOTransport; import org.glassfish.grizzly.threadpool.ThreadPoolConfig; import com.sun.opends.sdk.util.StaticUtils; /** * A static Grizzly transport that can be used by default globally in the SDK. */ public final class GlobalTransportFactory extends TransportFactory { private static boolean isInitialized = false; /** * Returns the global Grizzly transport factory. * * @return The global Grizzly transport factory. */ public static synchronized TransportFactory getInstance() { if (!isInitialized) { TransportFactory.setInstance(new GlobalTransportFactory()); isInitialized = true; } return TransportFactory.getInstance(); } private int selectors; private int linger = -1; private boolean tcpNoDelay = true; private boolean reuseAddress = true; private TCPNIOTransport globalTCPNIOTransport = null; private GlobalTransportFactory() { // Prevent instantiation. } /** * Close the {@link org.glassfish.grizzly.TransportFactory} and release all * resources. */ @Override public synchronized void close() { if (globalTCPNIOTransport != null) { try { globalTCPNIOTransport.stop(); } catch (final IOException e) { StaticUtils.DEBUG_LOG .warning("Error shutting down Grizzly TCP NIO transport: " + e); } } super.close(); } /** * Create instance of TCP {@link org.glassfish.grizzly.Transport}. * * @return instance of TCP {@link org.glassfish.grizzly.Transport}. */ @Override public synchronized TCPNIOTransport createTCPTransport() { if (globalTCPNIOTransport == null) { globalTCPNIOTransport = setupTransport(new TCPNIOTransport()); globalTCPNIOTransport.setSelectorRunnersCount(selectors); globalTCPNIOTransport.setLinger(linger); globalTCPNIOTransport.setTcpNoDelay(tcpNoDelay); globalTCPNIOTransport.setReuseAddress(reuseAddress); try { globalTCPNIOTransport.start(); } catch (final IOException e) { throw new RuntimeException( "Unable to create default connection factory provider", e); } } return globalTCPNIOTransport; } /** * Creating an UDP transport is unsupported with this factory. A * {@code UnsupportedOperationException} will be thrown when this method is * called. * * @return This method will always throw {@code UnsupportedOperationException} * . */ @Override public UDPNIOTransport createUDPTransport() { throw new UnsupportedOperationException(); } @Override public void initialize() { final int cpus = Runtime.getRuntime().availableProcessors(); int threads = Math.max(5, (cpus / 2) - 1); selectors = Math.max(2, cpus / 8); final String threadsStr = System .getProperty("org.opends.sdk.ldap.transport.threads"); if (threadsStr != null) { threads = Integer.parseInt(threadsStr); } final String selectorsStr = System .getProperty("org.opends.sdk.ldap.transport.selectors"); if (threadsStr != null) { selectors = Integer.parseInt(selectorsStr); } ThreadPoolConfig.DEFAULT.setCorePoolSize(threads); ThreadPoolConfig.DEFAULT.setMaxPoolSize(threads); ThreadPoolConfig.DEFAULT.setPoolName("OpenDS SDK Worker(Grizzly)"); final String lingerStr = System .getProperty("org.opends.sdk.ldap.transport.linger"); if (lingerStr != null) { linger = Integer.parseInt(lingerStr); } final String tcpNoDelayStr = System .getProperty("org.opends.sdk.ldap.transport.tcpNoDelay"); if (tcpNoDelayStr != null) { tcpNoDelay = Integer.parseInt(tcpNoDelayStr) != 0; } final String reuseAddressStr = System .getProperty("org.opends.sdk.ldap.transport.reuseAddress"); if (reuseAddressStr != null) { reuseAddress = Integer.parseInt(reuseAddressStr) != 0; } super.initialize(); } }