当前位置: 首页 > news >正文

中国纪检监察报网单页网站 seo

中国纪检监察报网,单页网站 seo,护卫神 安装wordpress,自建网站教程文章目录 关键技术点核心原理Code 关键技术点 利用 Spring Boot 内嵌 Servlet 容器 和 动态端口切换 的方式实现平滑更新的方案#xff0c;关键技术点如下#xff1a; Servlet 容器重新绑定端口#xff1a;Spring Boot 使用 ServletWebServerFactory 动态设置新端口。零停… 文章目录 关键技术点核心原理Code 关键技术点 利用 Spring Boot 内嵌 Servlet 容器 和 动态端口切换 的方式实现平滑更新的方案关键技术点如下 Servlet 容器重新绑定端口Spring Boot 使用 ServletWebServerFactory 动态设置新端口。零停机切换通过先启动备用服务、释放主端口再切换新服务到主端口实现服务的无缝切换。端口检测和进程终止使用 ServerSocket 和系统命令来检测和操作端口。 这种设计允许服务在不完全停止的情况下切换到更新的版本从而极大地缩短了不可用时间实现了接近于零停机的效果。 核心原理 内嵌 Tomcat 容器动态启动 使用 TomcatServletWebServerFactory 实现容器的动态创建和启动。动态绑定 DispatcherServlet 通过 ServletContextInitializer 集合完成 Servlet 注册。 端口检查和动态切换 通过 ServerSocket 判断端口是否占用。如果占用则先用备用端口启动新服务再通过关闭老服务释放主端口最后切换新服务到主端口。 运行时自动处理 利用 Runtime.exec 执行系统命令释放端口并终止旧进程。在极短时间内完成新旧服务切换避免长时间的停机。 Code package com.artisan;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.WebServer; import org.springframework.boot.web.servlet.ServletContextInitializer; import org.springframework.boot.web.servlet.ServletContextInitializerBeans; import org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext; import org.springframework.boot.web.servlet.server.ServletWebServerFactory; import org.springframework.context.ConfigurableApplicationContext;import java.io.IOException; import java.net.ServerSocket; import java.util.Collections;SpringBootApplication() public class BootMainApplication {public static void main(String[] args) {// 默认端口设置int defaultPort 8080;// 备选端口设置int alternativePort 9090;// 检查默认端口是否已被占用boolean isPortOccupied isPortInUse(defaultPort);// 动态端口分配int portToUse isPortOccupied ? alternativePort : defaultPort;// 创建Spring Boot应用实例SpringApplication app new SpringApplication(WebMainApplication2.class);// 设置端口配置app.setDefaultProperties(Collections.singletonMap(server.port, portToUse));// 运行应用并获取上下文ConfigurableApplicationContext context app.run(args);// 如果默认端口被占用则尝试切换回默认端口if (isPortOccupied) {switchToDefaultPort(context, defaultPort, portToUse);}}/*** 切换到默认端口** 当默认端口被其他进程占用时此方法尝试释放该端口并启动一个新的Web服务器实例绑定到默认端口* 同时它会停止当前的Web服务器实例** param context 当前应用上下文用于访问Web服务器工厂和停止当前Web服务器* param defaultPort 默认端口号希望切换到的目标端口* param currentPort 当前Web服务器正在使用的端口号*/private static void switchToDefaultPort(ConfigurableApplicationContext context, int defaultPort, int currentPort) {try {// 释放默认端口terminateProcessUsingPort(defaultPort);// 等待端口释放while (isPortInUse(defaultPort)) {Thread.sleep(100);}// 启动新容器绑定默认端口ServletWebServerFactory webServerFactory getWebServerFactory(context);((TomcatServletWebServerFactory) webServerFactory).setPort(defaultPort);WebServer newServer webServerFactory.getWebServer(getServletContextInitializers(context));newServer.start();// 停止当前容器((ServletWebServerApplicationContext) context).getWebServer().stop();} catch (Exception e) {e.printStackTrace();}}/*** 检查指定的端口是否正在使用** param port 要检查的端口号* return 如果端口正在使用则返回true否则返回false*/private static boolean isPortInUse(int port) {try (ServerSocket serverSocket new ServerSocket(port)) {// 如果能够成功创建ServerSocket实例说明端口可用返回falsereturn false;} catch (IOException e) {// 如果创建ServerSocket实例时抛出IOException说明端口已被占用返回truereturn true;}}/*** 终止使用指定端口的进程** param port 需要释放的端口号* throws IOException 如果执行命令发生错误* throws InterruptedException 如果线程被中断*/private static void terminateProcessUsingPort(int port) throws IOException, InterruptedException {// 构建终止使用指定端口的进程的命令String command String.format(lsof -i :%d | grep LISTEN | awk {print $2} | xargs kill -9, port);// 执行命令并等待命令执行完成Runtime.getRuntime().exec(new String[]{sh, -c, command}).waitFor();}/*** 获取ServletContextInitializer实例* 该方法用于将Spring应用上下文中的所有ServletContextInitializerBeans实例* 转换为ServletContextInitializer接口的实现以便在应用启动时初始化ServletContext** param context Spring的应用上下文用于获取BeanFactory* return 返回一个实现了ServletContextInitializer接口的实例*/private static ServletContextInitializer getServletContextInitializers(ConfigurableApplicationContext context) {// 使用ApplicationContext中的BeanFactory创建ServletContextInitializerBeans实例// 这里将ServletContextInitializerBeans作为ServletContextInitializer的实现类返回// ServletContextInitializerBeans将会负责收集应用上下文中所有ServletContextInitializer的实现// 并在应用启动时依次调用它们的onStartup方法来初始化ServletContextreturn (ServletContextInitializer) new ServletContextInitializerBeans(context.getBeanFactory());}/*** 获取Servlet Web服务器工厂** param context 可配置的应用上下文用于获取Bean工厂* return ServletWebServerFactory实例用于配置和创建Web服务器*/private static ServletWebServerFactory getWebServerFactory(ConfigurableApplicationContext context) {// 从应用上下文中获取Bean工厂并从中获取ServletWebServerFactory实例return context.getBeanFactory().getBean(ServletWebServerFactory.class);} } 测试 import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;RestController() RequestMapping(port/) public class TestPortController {GetMapping(test)public String test() {return artisan-old;} }启动后访问 http://localhost:8080/port/test 修改TestPortController 的返回值 打个jar包 启动新的jar包 重新访问 http://localhost:8080/port/test 观察返回结果是否是修改后的返回值 参考https://mp.weixin.qq.com/s/_rt1NP_LPfzatb0EYXry9Q
http://www.w-s-a.com/news/967386/

相关文章:

  • 泉州企业自助建站兰州最好的互联网公司
  • 监察部门网站建设方案网站seo技术教程
  • 个人网站制作源代码下载品牌建设部
  • 网站备案需要准备什么文创产品设计思路
  • 网站开发书籍推荐青岛城阳新闻最新消息
  • 秦皇岛网站建设服务聊城做网站的公司资讯
  • 30岁转行做网站设计丰涵网站建设
  • 山东省和住房建设厅网站首页开发商不按时交房可以退房吗
  • asp网站怎么做404页面跳转本地南通网站建设
  • 点击网站出现微信二维码的链接怎么做申请网站空间怎么做
  • 网站开发的论文题目广告设计排行榜
  • 网络营销网站 功能南京h5制作公司
  • 做网站的费用的会计分录合肥做网站推广哪家好
  • 电子商城网站开发怎么wordpress用的什么主题
  • 榆林电商网站建设网上做试卷的网站
  • 文山网站建设代理中公教育培训机构官网
  • 郑州it培训机构有哪些上海外贸网站seo
  • dw做网站的实用特效广东住房与城乡建设厅网站
  • 模板网站 动易哪方面的网站
  • 怎么给网站做外链邵连虎郑州做网页的公司
  • 重庆网站开发哪家好宁波网站建设caiyiduo
  • 手机网站建设价格手机网站模版更换技巧
  • 哈尔滨松北区建设局网站美妆网站建设
  • 不需要网站备案的空间网站推广的基本方法是哪四个
  • 如何检查网站死链劳动仲裁院内部网站建设
  • 江西省住房和城乡建设网站合同管理系统
  • 网站建设质量保证福州网络推广
  • 高唐网站建设公司广州南站在哪个区
  • 广西柳州网站制作公司郴州网红打卡景点
  • 做网站要固定ip拍摄公司宣传片制作