/**
* Copyright (c) 2009, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* 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 org.apache.synapse.transport.passthru.config;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.description.ParameterInclude;
import org.apache.axis2.transport.base.threads.WorkerPool;
import org.apache.axis2.transport.base.threads.WorkerPoolFactory;
import org.apache.http.impl.nio.reactor.IOReactorConfig;
import org.apache.http.nio.util.HeapByteBufferAllocator;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
import org.apache.synapse.transport.passthru.jmx.PassThroughTransportMetricsCollector;
import org.apache.synapse.transport.passthru.util.BufferFactory;
/**
* This class has common configurations for both sender and receiver.
*/
public abstract class BaseConfiguration {
/**
* Configurations given by axis2.xml
*/
protected ParameterInclude parameters = null;
/** The thread pool for executing the messages passing through */
private WorkerPool workerPool = null;
/** The Axis2 ConfigurationContext */
protected ConfigurationContext configurationContext = null;
/** Default http parameters */
protected HttpParams httpParams = null;
protected IOReactorConfig ioReactorConfig = null;
protected BufferFactory bufferFactory = null;
private PassThroughTransportMetricsCollector metrics = null;
private int iOBufferSize;
protected PassThroughConfiguration conf = PassThroughConfiguration.getInstance();
private static final String PASSTHROUGH_THREAD_GROUP = "Pass-through Message Processing Thread Group";
private static final String PASSTHROUGH_THREAD_ID ="PassThroughMessageProcessor";
public BaseConfiguration(ConfigurationContext configurationContext,
ParameterInclude parameters,
WorkerPool workerPool,
PassThroughTransportMetricsCollector metrics) {
this.parameters = parameters;
this.workerPool = workerPool;
this.configurationContext = configurationContext;
this.metrics = metrics;
}
public void build() throws AxisFault {
iOBufferSize = conf.getIOBufferSize();
if (workerPool == null) {
workerPool = WorkerPoolFactory.getWorkerPool(
conf.getWorkerPoolCoreSize(),
conf.getWorkerPoolMaxSize(),
conf.getWorkerThreadKeepaliveSec(),
conf.getWorkerPoolQueueLen(),
PASSTHROUGH_THREAD_GROUP,
PASSTHROUGH_THREAD_ID);
}
httpParams = buildHttpParams();
ioReactorConfig = buildIOReactorConfig();
bufferFactory = new BufferFactory(iOBufferSize, new HeapByteBufferAllocator(), 512);
}
public WorkerPool getWorkerPool(int workerPoolCoreSize, int workerPoolMaxSize,
int workerThreadKeepaliveSec, int workerPoolQueuLen,
String threadGroupName, String threadgroupID) {
if (threadGroupName == null) {
threadGroupName = PASSTHROUGH_THREAD_GROUP;
}
if (threadgroupID == null) {
threadgroupID = PASSTHROUGH_THREAD_ID;
}
if (workerPoolCoreSize == 0) {
workerPoolCoreSize = conf.getWorkerPoolCoreSize();
}
if (workerPoolMaxSize == 0) {
workerPoolMaxSize = conf.getWorkerPoolMaxSize();
}
if (workerThreadKeepaliveSec == 0) {
workerThreadKeepaliveSec = conf.getWorkerThreadKeepaliveSec();
}
if (workerPoolQueuLen == 0) {
workerPoolQueuLen = conf.getWorkerPoolQueueLen();
}
return WorkerPoolFactory.getWorkerPool(workerPoolCoreSize, workerPoolMaxSize,
workerThreadKeepaliveSec, workerPoolQueuLen,
threadGroupName, threadgroupID);
}
public int getIOBufferSize() {
return iOBufferSize;
}
public WorkerPool getWorkerPool() {
return workerPool;
}
public ConfigurationContext getConfigurationContext() {
return configurationContext;
}
protected HttpParams buildHttpParams() {
HttpParams params = new BasicHttpParams();
params.
setIntParameter(HttpConnectionParams.SO_TIMEOUT,
conf.getIntProperty(HttpConnectionParams.SO_TIMEOUT, 60000)).
setIntParameter(HttpConnectionParams.CONNECTION_TIMEOUT,
conf.getIntProperty(HttpConnectionParams.CONNECTION_TIMEOUT, 0)).
setIntParameter(HttpConnectionParams.SOCKET_BUFFER_SIZE,
conf.getIntProperty(HttpConnectionParams.SOCKET_BUFFER_SIZE, 8 * 1024)).
setParameter(HttpProtocolParams.ORIGIN_SERVER,
conf.getStringProperty(HttpProtocolParams.ORIGIN_SERVER, "WSO2-PassThrough-HTTP")).
setParameter(HttpProtocolParams.USER_AGENT,
conf.getStringProperty(HttpProtocolParams.USER_AGENT, "Synapse-PT-HttpComponents-NIO"));
// setParameter(HttpProtocolParams.HTTP_ELEMENT_CHARSET,
// conf.getStringProperty(HttpProtocolParams.HTTP_ELEMENT_CHARSET, HTTP.DEFAULT_PROTOCOL_CHARSET));//TODO:This does not works with HTTPCore 4.3
return params;
}
protected IOReactorConfig buildIOReactorConfig() {
IOReactorConfig config = new IOReactorConfig();
config.setIoThreadCount(conf.getIOThreadsPerReactor());
config.setSoTimeout(conf.getIntProperty(HttpConnectionParams.SO_TIMEOUT, 60000));
config.setConnectTimeout(conf.getIntProperty(HttpConnectionParams.CONNECTION_TIMEOUT, 0));
config.setTcpNoDelay(conf.getBooleanProperty(HttpConnectionParams.TCP_NODELAY, true));
config.setSoLinger(conf.getIntProperty(HttpConnectionParams.SO_LINGER, -1));
config.setSoReuseAddress(conf.getBooleanProperty(HttpConnectionParams.SO_REUSEADDR, false));
config.setInterestOpQueued(conf.getBooleanProperty("http.nio.interest-ops-queueing", false));
config.setSelectInterval(conf.getIntProperty("http.nio.select-interval", 1000));
return config;
}
public BufferFactory getBufferFactory() {
return bufferFactory;
}
public PassThroughTransportMetricsCollector getMetrics() {
return metrics;
}
}