SpringBoot动态配置参数(端口、路径、数据库配置 等等)

/ Java / 0 条评论 / 6741浏览

场景

Java项目管理多个Java子项目的启动、关闭。每个项目端口、数据库不固定 需要在启动时指定。

Java入口程序

@SpringBootApplication
public class AdminApplication{

	public static void main(String[] args) {
		SpringApplication.run(AdminApplication.class, getArgs(args));
	}
	
	/**
	 * 设置启动参数
	 * @param args 原始启动参数
	 * @return 转换后的启动参数
	 */
	private static String[] getArgs(String[] args){
		List<String> listArgs = new ArrayList<String>();
		//读取配置文件
		JSONObject jsonBase = getApplicationYaml(null);
		String env = jsonBase.getJSONObject("spring").getJSONObject("profiles").getString("active");
		JSONObject jsonEnv = getApplicationYaml(env);
		
		//尝试关闭当前端口正在启动服务
		String port = jsonBase.getJSONObject("server").getString("port");
		if(args!=null&&args.length>0){
			port = args[0];
		}
		String shutdownPath = ShiroUtils.sha256("jqcustomer", port);
		System.out.println("shutdownpath="+shutdownPath);
		try{
			HttpUtils.doPost("http://127.0.0.1:"+port+"/"+shutdownPath+"/shutdown ", HttpUtils.CONTENT_TYPE_JSON);			
		}catch(Exception e){}
		
		//设置端口
		listArgs.add("--server.port="+port);
		
		//设置shutdown路径
		listArgs.add("--management.endpoints.web.base-path=/"+shutdownPath);
		
		//设置数据库配置
		String dbUrl = jsonEnv.getJSONObject("spring").getJSONObject("datasource").getJSONObject("druid").getString("url");
		String customid = "0";
		if(args!=null&&args.length>1){
			customid = args[1];
		}
		listArgs.add("--spring.datasource.druid.url="+dbUrl.replace("${customid}", customid));
		
		return listArgs.toArray(args);
	}
	//读取文件内容
	private static JSONObject getApplicationYaml(String env){
		String suffix = "";
		if(StringUtils.isNotBlank(env)){
			suffix = "-"+ env;
		}
		return new Yaml().loadAs(AdminApplication.class.getClassLoader().getResourceAsStream("application"+suffix+".yml"), JSONObject.class);
	}
}

配置文件


# Tomcat
server:
  tomcat:
    uri-encoding: UTF-8
    max-threads: 1000
    min-spare-threads: 30
  port: 8081
  servlet:
    context-path: /
  session:
    timeout: 7200
    
spring:
  profiles:
    active: dev
  jackson:
    date-format: yyyy-MM-dd HH🇲🇲ss
    time-zone: GMT+8
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB
      enabled: true
  redis:
    database: 0
    host: localhost
    port: 6379
    password:      # 密码(默认为空)
    timeout: 6000ms  # 连接超时时长(毫秒)
    jedis:
      pool:
        max-active: 1000  # 连接池最大连接数(使用负值表示没有限制)
        max-wait: -1ms      # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-idle: 10      # 连接池中的最大空闲连接
        min-idle: 5       # 连接池中的最小空闲连接
  freemarker:
    suffix: .html
    request-context-attribute: request

jqt:
  cluster: false  #集群配置  true集群环境   false单机环境,还需打开pom.xml里的spring-session-data-redis注释
  globalSessionTimeout: 3600   #单机环境,session过期时间为60分钟
  redis:
    open: false  #是否开启redis缓存  true开启   false关闭
  upload:
    imagepath: e:/jqcustomer/upload/image/


#mybatis
mybatis-plus:
  mapper-locations: classpath*:/mapper/**/*.xml
  #实体扫描,多个package用逗号或者分号分隔
  typeAliasesPackage: io.jqt.modules.*.entity
  global-config:
    #数据库相关配置
    db-config:
      #主键类型  AUTO:"数据库ID自增", INPUT:"用户输入ID", ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
      id-type: AUTO
      #字段策略 IGNORED:"忽略判断",NOT_NULL:"非 NULL 判断"),NOT_EMPTY:"非空判断"
      field-strategy: NOT_NULL
      #驼峰下划线转换
      column-underline: true
      logic-delete-value: -1
      logic-not-delete-value: 0
    banner: false
  #原生配置
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: false
    call-setters-on-nulls: true
    jdbc-type-for-null: 'null'
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

management:
  endpoint:
    shutdown:
      enabled: true
  endpoints:
    web:
      exposure:
        include: '*'

中央管理子项目

/**
	 * 启动客户端,用于查看效果
	 * @param port 启动端口
	 * @param customid  客户ID
	 */
	public static void startCustomerRun(Integer port, Long customid, String cmdtitle){
		new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					Process process = Runtime.getRuntime().exec("cmd.exe /c start \""+cmdtitle+"\" java -jar jqc-admin.jar "+port+" "+customid+"");
					InputStream in = process.getInputStream();
					BufferedReader br = new BufferedReader(new InputStreamReader(in));
					String line = br.readLine();
					while(line!=null) {
						System.out.println(line);
						line = br.readLine();
					}
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}).start();
	}

以上代码开发环境正常,打包jar后无法启动cmd窗口。更改jqc-admin.jar为本地路径即可,例如 e:/jqc-admin.jar

备注说明

启用springboot项目优雅关闭,需要引入一下依赖包

<!--开启优雅关闭 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>

application.yml文件中要添加如下配置

management:
  endpoint:
    shutdown:
      enabled: true
  endpoints:
    web:
      exposure:
        include: '*'