java - 执行三四天后,通过 spring 注入(inject) "While True"循环的线程停止

标签 java multithreading spring scope webserver

我正在开发一个网站,负责提供有关在线广播的信息。网络服务器本身从不同的来源获取信息(有一个由 API 提供的数据库,而且我的流媒体服务器提供了一些 XML 文件,我用它们来动态提取一些重要信息)。

好吧,当我决定基于看门狗线程创建观众警报时,我的问题就开始了,它从流媒体服务器读取 XML 文件,更新具有固定长度的数组(360 个位置的长数组,预先分配,所以什么都没有那个大)并由一个 Action 访问,它返回这个数组以通过 java 脚本例程转换为图形。因此,这个看门狗线程需要对访问该网站的每个客户端都是相同的,因为它提供的信息需要对每个人都是平等的。于是,我决定使用spring框架来调用启动Watchdog线程的服务。

它起作用了,每个网站都看到相同的信息,并且信息始终在更新......直到我创建的 while true 线程停止,数组的最后状态被保留,但线程不再工作。

Spring 注入(inject)定义如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:sec="http://www.springframework.org/schema/security" xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ehcache="http://www.springmodules.org/schema/ehcache"
    default-autowire="byName"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springmodules.org/schema/ehcache http://www.springmodules.org/schema/cache/springmodules-ehcache.xsd">

    <bean id="wowzaService" class="br.com.imusica.reports.services.radio.WowzaService"/>

</beans>

服务(通过操作访问)编程如下:

@Component
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class WowzaService extends AbstractService {

    @Autowired
    private WatchDogThread watchdog;

    public void startWatchdog() {
        watchdog.start();
    }

    public WatchDogArray getWatchdogArray() {
        return watchdog.getWatchDogArray();
    }
}

这个服务是在ApplicationContextInitializer类中注入(inject)的,如下:

public synchronized void contextInitialized(ServletContextEvent contextEvent) {
    WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(contextEvent.getServletContext());

    WowzaService ws = (WowzaService) wac.getBean("wowzaService");
    ws.startWatchdog();

    CacheManager manager = (CacheManager) wac.getBean("cacheManager");
    MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
    ManagementService.registerMBeans(manager, mBeanServer, false, false, false, true);

    cleanUpService = (CleanUpService) wac.getBean("cleanUpService");
    ApplicationContextInitializer.applicationDiskRootPath = contextEvent.getServletContext().getRealPath("/");

    ComplexReportsControllerService complexReportsService =
        (ComplexReportsControllerService) wac.getBean("complexReportsControllerService");
    complexReportsService.cleanUpUnfinishedReports();
    cleanUpService.setRootPath(ApplicationContextInitializer.applicationDiskRootPath);
    cleanUpService.cleanUpAllSessions();
    // StdScheduler schedulerFactoryBean;

    ApplicationContextInitializer.reportsBasePath = (String) wac.getBean("reportsDataPath");

}

看门狗Thread被定义为一个Component,上面有一个@Scope(BeanDefinition.SCOPE_SINGLETON),extends thread等等。我想知道 Spring 是否会在一段时间后停止该线程。我保证,当我更新我的数据数组时,我不会附加信息,但实际上会移动值,丢弃最旧的值并插入新值。因此,不会发生内存问题。

预先感谢您的帮助

若昂·布鲁诺

最佳答案

Spring 无法停止您的线程,您的线程由于某种原因失败。

关于java - 执行三四天后,通过 spring 注入(inject) "While True"循环的线程停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16021821/

相关文章:

Java-通过 ImageIO 设置图像作为背景会在编译时出现错误

java - 在 JFileChooser 上显示文件名 ToolTipText

c++ - Linux 套接字和线程

c++ - 用于最小值、最大值、中值、平均值的 OpenMp C++ 算法

java - 在 STS Gradle 中禁用打印 stracktrace/BuildException 输出

java - 使用连接池进行 Spring Boot 和数据库测试

java - 向Servlet提交登录信息

java - FSM 到实际的 Java 代码。不确定代码是否正确

python:如何在线程与队列之间共享一个sqlite连接?

java - 如何控制 Spring bean 创建的顺序?