2

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

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

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

弹簧注射定义如下:

<?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 类中注入,如下:

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");

}

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

在此先感谢您的帮助

若昂布鲁诺

4

1 回答 1

0

Spring 不能停止你的线程,你的线程由于某种原因失败了。

于 2013-12-04T14:25:54.117 回答