我正在开发一个网站,负责提供有关在线广播的信息。网络服务器本身从不同的来源获取信息(有一个由 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是否在一段时间后停止了这个线程。我保证,当我更新我的数据数组时,我不会附加信息,而是实际移动值,丢弃最旧的值并插入新值。因此,没有发生内存问题。
在此先感谢您的帮助
若昂布鲁诺