/* * Copyright 1999-2019 Seata.io Group. * * 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 io.seata.server.spring.listener; import io.seata.common.holder.ObjectHolder; import io.seata.common.util.StringUtils; import io.seata.spring.boot.autoconfigure.SeataCoreEnvironmentPostProcessor; import io.seata.spring.boot.autoconfigure.SeataServerEnvironmentPostProcessor; import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; import org.springframework.boot.context.logging.LoggingApplicationListener; import org.springframework.context.ApplicationEvent; import org.springframework.context.event.GenericApplicationListener; import org.springframework.core.ResolvableType; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.PropertiesPropertySource; import java.util.Properties; import static io.seata.common.Constants.OBJECT_KEY_SPRING_CONFIGURABLE_ENVIRONMENT; import static io.seata.common.DefaultValues.SERVICE_OFFSET_SPRING_BOOT; import static io.seata.core.constants.ConfigurationKeys.*; /** * @author slievrly * @author funkye */ public class ServerApplicationListener implements GenericApplicationListener { @Override public boolean supportsEventType(ResolvableType eventType) { return eventType.getRawClass() != null && ApplicationEnvironmentPreparedEvent.class.isAssignableFrom(eventType.getRawClass()); } @Override public void onApplicationEvent(ApplicationEvent event) { if (!(event instanceof ApplicationEnvironmentPreparedEvent)) { return; } ApplicationEnvironmentPreparedEvent environmentPreparedEvent = (ApplicationEnvironmentPreparedEvent)event; ConfigurableEnvironment environment = environmentPreparedEvent.getEnvironment(); ObjectHolder.INSTANCE.setObject(OBJECT_KEY_SPRING_CONFIGURABLE_ENVIRONMENT, environment); SeataCoreEnvironmentPostProcessor.init(); SeataServerEnvironmentPostProcessor.init(); String[] args = environmentPreparedEvent.getArgs(); // port: -p > -D > env > yml > default //-p 8091 if (args != null && args.length >= 2) { for (int i = 0; i < args.length; ++i) { if ("-p".equalsIgnoreCase(args[i]) && i < args.length - 1) { setTargetPort(environment, args[i + 1], true); return; } } } // -Dserver.servicePort=8091 String dPort = environment.getProperty(SERVER_SERVICE_PORT_CAMEL, String.class); if (StringUtils.isNotBlank(dPort)) { setTargetPort(environment, dPort, true); return; } //docker -e SEATA_PORT=8091 String envPort = environment.getProperty(ENV_SEATA_PORT_KEY, String.class); if (StringUtils.isNotBlank(envPort)) { setTargetPort(environment, envPort, true); return; } //yml properties server.service-port=8091 String configPort = environment.getProperty(SERVER_SERVICE_PORT_CONFIG, String.class); if (StringUtils.isNotBlank(configPort)) { setTargetPort(environment, configPort, false); return; } // server.port=7091 String serverPort = environment.getProperty("server.port", String.class); if (StringUtils.isBlank(serverPort)) { serverPort = "8080"; } String servicePort = String.valueOf(Integer.parseInt(serverPort) + SERVICE_OFFSET_SPRING_BOOT); setTargetPort(environment, servicePort, true); } private void setTargetPort(ConfigurableEnvironment environment, String port, boolean needAddPropertySource) { // get rpc port first, use to logback-spring.xml, @see the class named `SystemPropertyLoggerContextListener` System.setProperty(SERVER_SERVICE_PORT_CAMEL, port); if (needAddPropertySource) { // add property source to the first position Properties pro = new Properties(); pro.setProperty(SERVER_SERVICE_PORT_CONFIG, port); environment.getPropertySources().addFirst(new PropertiesPropertySource("serverProperties", pro)); } } /** * higher than LoggingApplicationListener * * @return the order */ @Override public int getOrder() { return LoggingApplicationListener.DEFAULT_ORDER - 1; } }