/** * 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.cxf.transport.http.netty.client; import java.io.IOException; import org.apache.cxf.Bus; import org.apache.cxf.buslifecycle.BusLifeCycleListener; import org.apache.cxf.buslifecycle.BusLifeCycleManager; import org.apache.cxf.common.util.SystemPropertyAction; import org.apache.cxf.service.model.EndpointInfo; import org.apache.cxf.transport.http.HTTPConduit; import org.apache.cxf.transport.http.HTTPConduitFactory; import org.apache.cxf.transport.http.HTTPTransportFactory; import org.apache.cxf.ws.addressing.EndpointReferenceType; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; public class NettyHttpConduitFactory implements HTTPConduitFactory { //CXF specific public static final String USE_POLICY = "org.apache.cxf.transport.http.netty.usePolicy"; public enum UseAsyncPolicy { ALWAYS, ASYNC_ONLY, NEVER; public static UseAsyncPolicy getPolicy(Object st) { if (st instanceof UseAsyncPolicy) { return (UseAsyncPolicy)st; } else if (st instanceof String) { String s = ((String)st).toUpperCase(); if ("ALWAYS".equals(s)) { return ALWAYS; } else if ("NEVER".equals(s)) { return NEVER; } else if ("ASYNC_ONLY".equals(s)) { return ASYNC_ONLY; } else { st = Boolean.parseBoolean(s); } } if (st instanceof Boolean) { return ((Boolean)st).booleanValue() ? ALWAYS : NEVER; } return ASYNC_ONLY; } }; UseAsyncPolicy policy; public NettyHttpConduitFactory() { io.netty.util.Version.identify(); Object st = SystemPropertyAction.getPropertyOrNull(USE_POLICY); policy = UseAsyncPolicy.getPolicy(st); } public UseAsyncPolicy getUseAsyncPolicy() { return policy; } @Override public HTTPConduit createConduit(HTTPTransportFactory f, Bus bus, EndpointInfo localInfo, EndpointReferenceType target) throws IOException { // need to check if the EventLoopGroup is created or not // if not create a new EventLoopGroup for it EventLoopGroup eventLoopGroup = bus.getExtension(EventLoopGroup.class); if (eventLoopGroup == null) { final EventLoopGroup group = new NioEventLoopGroup(); // register a BusLifeCycleListener for it bus.setExtension(group, EventLoopGroup.class); registerBusLifeListener(bus, group); } return new NettyHttpConduit(bus, localInfo, target, this); } public HTTPConduit createConduit(Bus bus, EndpointInfo localInfo, EndpointReferenceType target) throws IOException { return createConduit(null, bus, localInfo, target); } protected void registerBusLifeListener(Bus bus, final EventLoopGroup group) { BusLifeCycleManager lifeCycleManager = bus.getExtension(BusLifeCycleManager.class); if (null != lifeCycleManager) { lifeCycleManager.registerLifeCycleListener(new BusLifeCycleListener() { @Override public void initComplete() { // do nothing here } @Override public void preShutdown() { // do nothing here } @Override public void postShutdown() { // shutdown the EventLoopGroup group.shutdownGracefully().syncUninterruptibly(); } }); } } }