Webアプリケーションがデータベースをポーリングして変更を確認し、その変更をJSPで表示しています。データベースはレガシーシステムによって変更され、データ変更時にイベントを取得する可能性はありません。Webapplikation(JSF + Spring)で@Scheduledアノテーションを使用する
私のアプローチは、データベースをポーリングし、データをアプリケーションBeanと同期させることです。データが変更された場合は、プッシュメカニズムを使用してJSPページを更新します。データベースをポーリングするスレッドは、アプリケーションBeanによって生成されます。
私は既にSpringをWebアプリケーションで使用していますので、Spring @ Scheduledアノテーションを使用したいのです。なぜなら、スレッドを生成し、Springに定期的な実行を処理させたくないからです。しかし、このメソッドは定期的に実行されません。
私はTomcatとMS Sql Serverを使用しています。
私のアプリケーションBeanがこの
@Named("agentData")
@Scope("application")
public class AgentDataBean implements Serializable {
...
@Scheduled(fixedRate=5000)
public void loadData() {
// do database poll
}
...
}
のように見える私の春とWeb XMLはこの
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>JavaServerFaces</display-name>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-application-config.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<context-param>
<param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>#{login.theme}</param-value>
</context-param>
<!-- Welcome page -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<!-- JSF mapping -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map these files with JSF -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:task="http://www.springframework.org/schema/task"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="/WEB-INF/config/database.properties" />
</bean>
<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource"
id="dataSource" p:driverClassName="${jdbc.driverClassName}"
p:password="${jdbc.password}" p:url="${jdbc.url}" p:username="${jdbc.username}" />
<!-- Activates annotaion-based bean configuration -->
<context:annotation-config />
<!-- needed is for @Configurable -->
<context:component-scan base-package="de.cpls.alo.dashboard" />
<tx:annotation-driven />
<!-- Activates @Scheduled and @Async annotations fpr scheduling -->
<task:annotation-driven executor="executorWithPoolSizeRange" scheduler="taskScheduler"/>
<task:executor id="executorWithPoolSizeRange"
pool-size="5-25"
queue-capacity="100"/>
<!-- Defines a ThreadPoolTaskScheduler instance with configurable pool size.
The id becomes the default thread name prefix. -->
<task:scheduler id="taskScheduler" pool-size="1"/>
のように見えるこの質問は、ソリューションのアプローチですスケジュール実行のためにSchedulerComponent
@Named("scheduler")
@Component
public class SchedulerComponent {
private List<IScheduledComponent> components;
public SchedulerComponent() {
this.components = new ArrayList<IScheduledComponent>();
}
public void register(IScheduledComponent component){
this.components.add(component);
}
@Scheduled(fixedRate = 5000)
public void doAllWork() {
try {
for(IScheduledComponent component : this.components){
component.doWork();
}
System.out.println("SchedulerComponent.doAllWork()");
} catch (Exception e) {
e.printStackTrace();
}
}
}
アン・インタフェースを使用して、この質問 Is there a best practice for showing database changes on a JSP
「それは機能していません」とはどういう意味ですか? – Ralph
メソッドは定期的に実行されません。 – outofBounds
@Componentアノテーションをクラスに追加すると機能しますか? – Ralph