在 Spring Boot 中终止先前运行的函数并启动新函数

在 spring boot 中终止先前运行的函数并启动新函数

本文旨在解决 Spring Boot 应用中,如何优雅地停止一个无限循环运行的函数,并允许启动新的函数实例。通过使用线程管理和唯一标识符,我们提供了一种可靠的方法来中断正在运行的任务,从而实现对后台任务的精确控制。本文将提供详细的代码示例和步骤,帮助开发者在 Spring Boot 应用中实现类似的功能。

在 Spring Boot 应用中,有时我们需要运行一些后台任务,这些任务可能需要持续运行,例如日志记录、数据同步等。然而,在某些情况下,我们需要停止这些任务,例如应用关闭、任务更新等。直接终止一个无限循环的函数可能会导致资源泄漏或其他问题。本文将介绍一种使用线程管理的方式,优雅地停止正在运行的函数,并允许启动新的函数实例。

使用线程管理和唯一标识符

核心思想是创建一个后台线程来运行你的无限循环函数,并使用一个唯一的标识符来跟踪该线程。当需要停止该函数时,我们可以通过该标识符找到对应的线程并中断它。

以下是一个示例代码,展示了如何在 Spring Boot 控制器中实现这个功能:

package com.springbootLogging.demo;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.bind.annotation.CrossOrigin;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.Map;import java.util.UUID;import java.util.concurrent.ConcurrentHashMap;@RestController@RequestMapping(path="/")public class AppController {    Logger logger = LoggerFactory.getLogger(AppController.class);    private static volatile Map threadLookup = new ConcurrentHashMap();    @CrossOrigin    @GetMapping(path="/startLog")    public String startPrintingLogs() {        UUID uuid = UUID.randomUUID();        String uuidString = uuid.toString();        Thread thread = new Thread(() -> {            while(!Thread.currentThread().isInterrupted()) {                logger.debug("It is a debug logger.");                logger.error("It is an error logger.");                logger.info("It is an info logger.");                logger.trace("It is a trace logger.");                logger.warn("It is a warn logger.");                try {                    Thread.sleep(100); // 控制日志输出频率                } catch (InterruptedException e) {                    Thread.currentThread().interrupt(); // 重新设置中断标志                    logger.warn("Thread interrupted: " + uuidString);                }            }            logger.info("Thread stopped: " + uuidString);        });        thread.start();        threadLookup.put(uuidString, thread);        return uuidString; // 返回 UUID,用于停止线程    }    @CrossOrigin    @GetMapping(path="/stopLog/{uuid}")    public String stopPrintingLogs(@PathVariable String uuid) {        Thread thread = threadLookup.get(uuid);        if (thread == null) {            return "Thread not found with UUID: " + uuid;        } else {            thread.interrupt();            threadLookup.remove(uuid);            return "Thread interrupted with UUID: " + uuid;        }    }}

代码解释:

threadLookup: 一个静态的 ConcurrentHashMap,用于存储线程和对应的 UUID。使用 ConcurrentHashMap 保证线程安全。startPrintingLogs():生成一个 UUID 作为线程的唯一标识符。创建一个新的线程,该线程包含你的无限循环函数(这里是日志记录)。在循环内部,使用 Thread.currentThread().isInterrupted() 检查线程是否被中断。如果被中断,则退出循环。使用 Thread.sleep(100) 控制日志输出频率,避免CPU占用过高。将线程和 UUID 存储到 threadLookup 中。返回 UUID 给客户端,客户端需要保存这个 UUID,以便后续停止线程。stopPrintingLogs(String uuid):根据 UUID 从 threadLookup 中获取线程。如果线程存在,则调用 thread.interrupt() 中断线程。从 threadLookup 中移除线程。返回一个消息,指示线程已被中断。

使用方法:

启动线程: 发送一个 GET 请求到 /startLog。 服务器将返回一个 UUID。停止线程: 发送一个 GET 请求到 /stopLog/{uuid},将之前获取的 UUID 替换到 {uuid} 中。

注意事项

线程安全: threadLookup 使用 ConcurrentHashMap 来保证线程安全。中断处理: 在循环内部,必须检查线程是否被中断,并及时退出循环。资源清理: 在线程退出前,应该清理所有资源,例如关闭文件流、释放数据库连接等。异常处理: 在线程运行过程中,应该捕获所有异常,并进行适当的处理,例如记录日志、发送警报等。UUID 的存储: 客户端需要妥善保存启动线程时返回的 UUID,以便后续停止线程。避免长时间阻塞操作: 尽量避免在循环内部执行长时间阻塞的操作,例如网络请求、数据库查询等。如果必须执行这些操作,可以使用异步的方式,例如使用 CompletableFuture 或 ExecutorService。

总结

通过使用线程管理和唯一标识符,我们可以优雅地停止 Spring Boot 应用中正在运行的无限循环函数。这种方法可以避免资源泄漏和其他问题,并提高应用的稳定性和可靠性。记住,线程安全、中断处理、资源清理和异常处理是关键。

以上就是在 Spring Boot 中终止先前运行的函数并启动新函数的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1580939.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月22日 21:53:50
下一篇 2025年12月22日 21:53:58

相关推荐

  • 通过按钮点击改变字体颜色 (JavaScript)

    本文将介绍如何使用 JavaScript 实现点击按钮改变 HTML 元素字体颜色的功能。主要讲解了通过 document.getElementById 获取元素并修改其 style.color 属性的方法,以及解决因 CSS 优先级导致颜色修改失效的问题。此外,还提供了完整的代码示例和注意事项,帮…

    好文分享 2025年12月22日
    000
  • 使用 Flatpickr 自定义 Date Input 的起始星期

    本教程旨在指导开发者如何通过 Flatpickr 库自定义 HTML5 input type=”date” 控件的起始星期,以满足不同地区用户的需求。本文将详细介绍如何使用 Flatpickr 设置日历的起始星期为星期一,并提供示例代码和注意事项。 HTML5 的 元素提供了…

    2025年12月22日
    000
  • JavaScript中监听HTML Select元素选项变更并即时执行函数

    本教程详细讲解如何在HTML表单的元素中,通过JavaScript的change事件监听器,实现用户选择选项后立即执行指定函数,无需额外的提交按钮。文章将提供HTML结构、JavaScript代码示例及关键注意事项,帮助开发者构建响应式用户界面。 在现代web应用开发中,用户界面的交互性至关重要。有…

    2025年12月22日
    000
  • SCSS嵌套与BEM修饰符:理解CSS选择器匹配的奥秘

    本文深入探讨了SCSS嵌套在BEM(Block-Element-Modifier)命名规范中的常见误区。通过分析一个具体的案例,阐明了SCSS如何编译为CSS选择器,并强调了CSS选择器是精确匹配而非模糊匹配的原理。文章提供了清晰的解决方案,指导开发者如何正确地在HTML中应用基础类和修饰符类,以确…

    2025年12月22日
    000
  • HTML代码用什么软件_HTML代码编写常用软件工具推荐与对比

    答案:Visual Studio Code是当前最主流且功能全面的HTML代码编写工具。它免费开源、跨平台,拥有丰富的扩展生态系统,支持语法高亮、智能补全、代码片段、Git集成和实时预览等功能,适合从初学者到专业开发者的各类用户,兼顾性能与功能,成为大多数人的首选。 编写HTML代码,市面上可选的软…

    2025年12月22日
    000
  • htm 如何调用js_在HTM文件中调用JS的方法

    内联JavaScript适用于简单交互,如;2. 内部JavaScript通过标签嵌入,适合单页逻辑;3. 外部JS文件通过src引入,便于维护和复用,推荐用于项目开发;4. 使用async或defer可优化加载性能,async异步执行,defer在文档解析后执行。 在HTM或HTML文件中调用Ja…

    2025年12月22日
    000
  • 在Angular项目中集成Bootstrap Icons的正确指南

    本文详细介绍了在Angular项目中本地集成Bootstrap Icons的正确方法,解决了仅通过npm install无法生效的问题。核心步骤包括安装bootstrap-icons依赖,并在angular.json文件中正确配置样式路径,从而确保图标字体能被Angular构建系统识别并加载,避免了…

    2025年12月22日
    000
  • 扩展jQuery UI Selectmenu:实现Enter键打开下拉菜单功能

    本教程旨在解决jQuery UI Selectmenu组件默认仅支持SPACE键打开,而不支持ENTER键的问题。我们将通过自定义JavaScript事件监听器,拦截键盘输入,并利用selectmenu的API方法,实现使用ENTER键来切换下拉菜单的打开和关闭状态,从而提升组件的可访问性和用户体验…

    2025年12月22日
    000
  • 优化HTML结构与CSS选择器:实现相邻元素样式控制

    本教程旨在解决为一组特定元素中的最后一个元素添加样式的常见前端需求,特别是当其后紧跟不同类型元素时。我们将摒弃复杂的JavaScript循环逻辑,转而采用一种更优雅、高效且易于维护的CSS解决方案,通过优化HTML结构并巧妙利用 :last-of-type 选择器来实现精确的样式控制。 需求分析:为…

    2025年12月22日
    000
  • Angular项目本地集成Bootstrap Icons教程

    本教程详细介绍了如何在Angular项目中本地集成Bootstrap Icons。通过简单的npm安装和在angular.json文件中配置样式路径,您可以避免使用CDN,直接在项目中利用Bootstrap Icons字体,实现高效且离线的图标管理。 1. 安装Bootstrap Icons 要在a…

    2025年12月22日
    000
  • 使用 JavaScript 更新 URL 参数,无需哈希值

    本文旨在指导开发者如何使用 JavaScript 在不刷新页面的情况下,通过复选框的选择动态更新 URL 参数。我们将介绍如何利用 window.history.pushState() 方法,将选中的复选框值作为查询参数添加到 URL 中,从而实现更清晰、更友好的 URL结构,避免使用哈希值。 使用…

    2025年12月22日 好文分享
    000
  • React及原生JavaScript中动态创建按钮的onClick事件处理详解

    本文深入探讨在React和原生JavaScript环境中动态创建按钮时,onClick事件不生效及ReferenceError报错的常见问题。我们将分别介绍在React虚拟DOM和原生DOM操作下,如何正确地为动态生成的按钮绑定事件处理器,并提供相应的代码示例和最佳实践,确保事件能够被正确触发。 在…

    2025年12月22日
    000
  • HTML代码怎么实现模态框_HTML代码模态框功能实现与样式定制方法

    模态框的核心结构是外层div(modal)负责遮罩和定位,内层div(modal-content)承载内容,通过HTML构建、CSS控制显示与居中、JavaScript实现交互逻辑,并建议添加ARIA属性和焦点管理以提升可访问性。 模态框,或者我们常说的Modal,在网页设计里是个非常实用的交互组件…

    2025年12月22日
    000
  • 解决嵌入式HTML样式冲突:利用CSS选择器特异性实现隔离

    本教程旨在解决将自定义HTML和CSS嵌入第三方网站时,因宿主网站样式冲突导致布局混乱的问题。核心策略是利用CSS选择器的特异性,通过为嵌入内容添加一个具有唯一ID的包装器,并使用更具体的选择器来确保自定义样式优先。这种方法无需JavaScript或iframe,即可有效隔离样式,确保嵌入内容的视觉…

    2025年12月22日
    000
  • SCSS嵌套失效:两层嵌套的选择器问题及解决方案

    本文旨在解决SCSS两层嵌套失效的问题。通过分析选择器的生成规则,解释了为什么预期的样式没有生效,并提供了通过添加额外的class来解决该问题的方案。本文将帮助开发者理解SCSS嵌套的原理,避免类似错误,并编写更高效、更易维护的样式代码。 SCSS的嵌套功能可以有效提升代码的可读性和维护性,但如果不…

    2025年12月22日
    000
  • SCSS嵌套与BEM命名:解析样式未生效的常见陷阱及解决方案

    本文深入探讨SCSS嵌套规则在BEM命名实践中可能导致样式不生效的问题。通过分析&__text与&–happy等选择器的实际转换机制,揭示了HTML元素必须显式包含基类才能正确应用样式的核心原理,并提供了正确的SCSS与HTML结构示例,帮助开发者避免此类常见错误,确保样…

    2025年12月22日
    000
  • 如何配置Prettier以防止单属性HTML标签不必要的换行

    针对Prettier自动将单属性HTML标签格式化为多行的问题,例如将 格式化为: 这种行为可能与开发者的预期不符,尤其是在标签内容简洁、完全可以在单行显示时。虽然提高 printWidth 值可以在一定程度上解决此问题,但如果设置过高,又可能导致包含多个属性的复杂HTML标签无法按预期进行多行拆分…

    2025年12月22日
    000
  • 利用CSS :nth-child 选择器灵活控制指定子元素样式

    本文深入探讨了如何利用CSS选择器,特别是:nth-child伪类,高效地为父元素下的多个特定子元素应用样式。我们将介绍通过分组选择器直接指定多个子元素,以及如何利用odd、even或an+b等公式实现更灵活的样式控制,从而避免冗余代码,提升CSS样式的简洁性和可维护性。 在网页开发中,我们经常需要…

    2025年12月22日
    000
  • 修复下拉菜单外区域点击导致页面滚动失效的问题

    本文旨在解决在使用固定定位的遮罩层(page blocker)实现点击下拉菜单外部区域关闭菜单时,页面在遮罩层外部区域滚动失效的问题。通过移除遮罩层的position: fixed属性,并探讨替代方案,保证下拉菜单功能的同时,恢复页面的正常滚动。 在使用 JavaScript 和 CSS 创建下拉菜…

    2025年12月22日
    000
  • HTML加水印怎么兼容不同浏览器_HTML加水印兼容不同浏览器的设置方法

    答案:推荐使用SVG作为背景水印,因其矢量特性可保证跨浏览器兼容性和响应式适应。通过CSS伪元素结合Data URI内联SVG,设置平铺、透明度和固定定位,实现清晰、可编程且性能友好的水印效果;在移动端利用相对单位(如vw)和媒体查询动态调整水印大小与密度,确保不同分辨率下均良好显示;相比静态图片背…

    2025年12月22日
    000

发表回复

登录后才能评论
关注微信