/*
 * 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.axis2.jaxws.utility;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

/**
 * This is an implementation of the ExecutorFactory interface. It is used
 * to provide an Executor to a ServiceDelegate instance. The Executor instance
 * will be backed by the JAXWSThreadFactory.
 *
 */
public class JAXWSExecutorFactory implements ExecutorFactory {

    public Executor getExecutorInstance() {
        return Executors.newFixedThreadPool(3, new JAXWSThreadFactory());
    }

    public Executor getExecutorInstance(int executorType) {
        return getExecutorInstance();
    }
        
	

}
