私は、オンライン ラジオに関する情報を提供する Web サイトを開発しています。Web サーバー自体は、さまざまなソースから情報を取得します (API によって供給されるデータベースがあり、また、ストリーミング サーバーはいくつかの重要な情報をその場で抽出するために使用するいくつかの XML ファイルを提供します)。
さて、私の問題は、ウォッチドッグ スレッドに基づいてオーディエンス アラームを作成することを決めたときに始まりました。このスレッドは、ストリーミング サーバーから XML ファイルを読み取り、固定長の配列を更新します (360 桁の長い配列で、事前に割り当てられているため、それほど大きなものはありません)。アクションは、Java スクリプト ルーチンによってグラフに変換されるこの配列を返します。このウォッチドッグ スレッドは、Web サイトにアクセスするすべてのクライアントに対して同じである必要があります。これは、それが提供する情報がすべての人に等しくなければならないためです。そこで、Spring フレームワークを使用して、Watchdog スレッドを開始するサービスを呼び出すことにしました。
それは機能し、すべてのWebサイトが同じ情報を参照し、情報は常に更新されました...作成した真のスレッドが停止するまで、アレイの最後の状態は保持されましたが、スレッドはもう機能しません.
スプリング注入は次のように定義されます。
<?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 がこのスレッドを停止しているかどうか疑問に思っています。データ配列を更新するときに情報を追加するのではなく、実際に値をシフトし、最も古いものを破棄して新しい値を挿入することを保証しました。したがって、メモリの問題は発生していません。
よろしくお願いいたします。
ジョアン・ブルーノ