BootApplicationStart.java 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. /*
  2. * Copyright 2017-2020 吴学文 and java110 team.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.java110.boot;
  17. import com.java110.core.annotation.Java110CmdDiscovery;
  18. import com.java110.core.client.OutRestTemplate;
  19. import com.java110.core.client.RestTemplate;
  20. import com.java110.core.context.Environment;
  21. import com.java110.core.event.cmd.ServiceCmdEventPublishing;
  22. import com.java110.core.log.LoggerFactory;
  23. import com.java110.core.trace.Java110FeignClientInterceptor;
  24. import com.java110.core.trace.Java110RestTemplateInterceptor;
  25. import com.java110.doc.annotation.Java110ApiDocDiscovery;
  26. import com.java110.doc.annotation.Java110CmdDocDiscovery;
  27. import com.java110.doc.registrar.ApiDocCmdPublishing;
  28. import com.java110.doc.registrar.ApiDocPublishing;
  29. import com.java110.intf.dev.ICacheV1InnerServiceSMO;
  30. import com.java110.service.init.ServiceStartInit;
  31. import com.java110.utils.factory.ApplicationContextFactory;
  32. import com.java110.utils.util.StringUtil;
  33. import okhttp3.ConnectionPool;
  34. import org.slf4j.Logger;
  35. import org.springframework.beans.factory.annotation.Autowired;
  36. import org.springframework.boot.SpringApplication;
  37. import org.springframework.boot.autoconfigure.SpringBootApplication;
  38. import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
  39. import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration;
  40. import org.springframework.boot.web.client.RestTemplateBuilder;
  41. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
  42. import org.springframework.context.ApplicationContext;
  43. import org.springframework.context.annotation.Bean;
  44. import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
  45. import org.springframework.http.converter.StringHttpMessageConverter;
  46. import org.springframework.scheduling.annotation.EnableAsync;
  47. import javax.annotation.Resource;
  48. import java.nio.charset.Charset;
  49. import java.util.concurrent.TimeUnit;
  50. /**
  51. * 这个服务是将 系统部署为spring boot版
  52. * 如果是spring cloud 微服务部署 不用启动这个类
  53. * <p>
  54. * excludeName = {
  55. * "com.java110.intf.acct",
  56. * "com.java110.intf.code",
  57. * "com.java110.intf.common",
  58. * "com.java110.intf.community",
  59. * "com.java110.intf.demo",
  60. * "com.java110.intf.dev",
  61. * "com.java110.intf.fee",
  62. * "com.java110.intf.goods",
  63. * "com.java110.intf.job",
  64. * "com.java110.intf.oa",
  65. * "com.java110.intf.order",
  66. * "com.java110.intf.report",
  67. * "com.java110.intf.store",
  68. * "com.java110.intf.user"
  69. * }
  70. *
  71. * @version v0.1
  72. * @auther com.java110.wuxw
  73. * @mail 928255095@qq.com
  74. * @date 2016年8月6日
  75. * @tag
  76. */
  77. @SpringBootApplication(scanBasePackages = {
  78. "com.java110.service",
  79. "com.java110.db",
  80. "com.java110.core",
  81. "com.java110.config.properties.code",
  82. "com.java110.acct",
  83. "com.java110.common",
  84. "com.java110.community",
  85. "com.java110.dev",
  86. "com.java110.fee",
  87. "com.java110.job",
  88. "com.java110.oa",
  89. "com.java110.order",
  90. "com.java110.report",
  91. "com.java110.store",
  92. "com.java110.user",
  93. "com.java110.doc",
  94. "com.java110.scm",
  95. "com.java110.boot"
  96. },
  97. exclude = {LiquibaseAutoConfiguration.class,
  98. org.activiti.spring.boot.SecurityAutoConfiguration.class,
  99. org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class}
  100. )
  101. @Java110CmdDiscovery(cmdPublishClass = ServiceCmdEventPublishing.class,
  102. basePackages = {
  103. "com.java110.acct.cmd",
  104. "com.java110.common.cmd",
  105. "com.java110.community.cmd",
  106. "com.java110.dev.cmd",
  107. "com.java110.fee.cmd",
  108. "com.java110.job.cmd",
  109. "com.java110.oa.cmd",
  110. "com.java110.order.cmd",
  111. "com.java110.report.cmd",
  112. "com.java110.store.cmd",
  113. "com.java110.scm.cmd",
  114. "com.java110.user.cmd"
  115. })
  116. @EnableAsync
  117. //文档
  118. @Java110ApiDocDiscovery(basePackages = {"com.java110.boot.rest"}, apiDocClass = ApiDocPublishing.class)
  119. @Java110CmdDocDiscovery(basePackages = {
  120. "com.java110.acct.cmd",
  121. "com.java110.acct.payment.business",
  122. "com.java110.common.cmd",
  123. "com.java110.community.cmd",
  124. "com.java110.dev.cmd",
  125. "com.java110.fee.cmd",
  126. "com.java110.job.cmd",
  127. "com.java110.oa.cmd",
  128. "com.java110.order.cmd",
  129. "com.java110.report.cmd",
  130. "com.java110.store.cmd",
  131. "com.java110.scm.cmd",
  132. "com.java110.user.cmd"
  133. },
  134. cmdDocClass = ApiDocCmdPublishing.class)
  135. public class BootApplicationStart {
  136. private static Logger logger = LoggerFactory.getLogger(BootApplicationStart.class);
  137. @Resource
  138. private Java110RestTemplateInterceptor java110RestTemplateInterceptor;
  139. /**
  140. * 实例化RestTemplate
  141. *
  142. * @return restTemplate
  143. */
  144. @Bean
  145. public OutRestTemplate outRestTemplate() {
  146. StringHttpMessageConverter m = new StringHttpMessageConverter(Charset.forName("UTF-8"));
  147. OutRestTemplate restTemplate = new RestTemplateBuilder().additionalMessageConverters(m).build(OutRestTemplate.class);
  148. restTemplate.getInterceptors().add(java110RestTemplateInterceptor);
  149. //设置超时时间
  150. HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
  151. httpRequestFactory.setConnectionRequestTimeout(5000);
  152. httpRequestFactory.setConnectTimeout(5000);
  153. httpRequestFactory.setReadTimeout(5000);
  154. restTemplate.setRequestFactory(httpRequestFactory);
  155. return restTemplate;
  156. }
  157. /**
  158. * 实例化RestTemplate,通过@LoadBalanced注解开启均衡负载能力.
  159. *
  160. * @return restTemplate
  161. */
  162. @Bean
  163. @LoadBalanced
  164. public RestTemplate restTemplate() {
  165. StringHttpMessageConverter m = new StringHttpMessageConverter(Charset.forName("UTF-8"));
  166. RestTemplate restTemplate = new RestTemplateBuilder().additionalMessageConverters(m).build(RestTemplate.class);
  167. restTemplate.getInterceptors().add(java110RestTemplateInterceptor);
  168. return restTemplate;
  169. }
  170. @Bean
  171. @ConditionalOnBean(Java110FeignClientInterceptor.class)
  172. public okhttp3.OkHttpClient okHttpClient(@Autowired
  173. Java110FeignClientInterceptor okHttpLoggingInterceptor) {
  174. okhttp3.OkHttpClient.Builder ClientBuilder = new okhttp3.OkHttpClient.Builder()
  175. .readTimeout(30, TimeUnit.SECONDS) //读取超时
  176. .connectTimeout(10, TimeUnit.SECONDS) //连接超时
  177. .writeTimeout(60, TimeUnit.SECONDS) //写入超时
  178. .connectionPool(new ConnectionPool(10 /*maxIdleConnections*/, 3, TimeUnit.MINUTES))
  179. .addInterceptor(okHttpLoggingInterceptor);
  180. return ClientBuilder.build();
  181. }
  182. public static void main(String[] args) throws Exception {
  183. try {
  184. ServiceStartInit.preInitSystemConfig();
  185. ApplicationContext context = SpringApplication.run(BootApplicationStart.class, args);
  186. //服务启动加载
  187. ServiceStartInit.initSystemConfig(context);
  188. Environment.setSystemStartWay(Environment.SPRING_BOOT);
  189. //刷新缓存
  190. flushMainCache(args);
  191. } catch (Throwable e) {
  192. logger.error("系统启动失败", e);
  193. }
  194. }
  195. /**
  196. * 刷新主要的缓存
  197. *
  198. * @param args
  199. */
  200. private static void flushMainCache(String[] args) {
  201. logger.debug("判断是否需要刷新日志,参数 args 为 {}", args);
  202. //因为好多朋友启动时 不加 参数-Dcache 所以启动时检测 redis 中是否存在 java110_hc_version
  203. //String mapping = MappingCache.getValue("java110_hc_version");
  204. String mapping = "";
  205. if (StringUtil.isEmpty(mapping)) {
  206. ICacheV1InnerServiceSMO devServiceCacheSMOImpl = (ICacheV1InnerServiceSMO) ApplicationContextFactory.getBean(ICacheV1InnerServiceSMO.class);
  207. devServiceCacheSMOImpl.startFlush();
  208. return;
  209. }
  210. if (args == null || args.length == 0) {
  211. return;
  212. }
  213. for (int i = 0; i < args.length; i++) {
  214. if (args[i].equalsIgnoreCase("-Dcache")) {
  215. logger.debug("开始刷新日志,入参为:{}", args[i]);
  216. ICacheV1InnerServiceSMO devServiceCacheSMOImpl = (ICacheV1InnerServiceSMO) ApplicationContextFactory.getBean(ICacheV1InnerServiceSMO.class);
  217. devServiceCacheSMOImpl.startFlush();
  218. }
  219. }
  220. }
  221. }