Использование аннотации @Scheduled в веб-приложении (JSF + Spring) - PullRequest
1 голос
/ 05 марта 2012

Мое веб-приложение опрашивает базу данных на предмет изменений и показывает эти изменения в JSP.База данных изменяется устаревшей системой, и нет возможности получить событие об изменении данных.

Мой подход заключается в опросе базы данных и синхронизации данных с компонентом Application.Если данные изменились, я использую механизм push для обновления страницы JSP.Поток, опрашивающий базу данных, создается компонентом Application.

Я уже использую Spring в своем веб-приложении, поэтому хочу использовать аннотацию spring @Scheduled, потому что я не хочу порождать Thread ипусть Spring справится с периодическим исполнением.Но метод не выполняется периодически.

Я использую Tomcat и MS Sql Server.

Мой компонент приложения выглядит следующим образом

@Named("agentData")
@Scope("application")
public class AgentDataBean implements Serializable {
...
@Scheduled(fixedRate=5000)
public void loadData() { 
// do database poll
}
...
}

My Spring and WebXML выглядит следующим образом

<?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"/>  

Этот вопрос является подходом к решению этого вопроса Существует ли лучшая практика для отображения изменений базы данных наJSP

1 Ответ

0 голосов
/ 08 марта 2012

Мое решение с использованием компонента 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();
    }
}
}

Интерфейс для выполнения по расписанию

public interface IScheduledComponent {
    public void doWork();
}

Позволяет компоненту данных реализовать интерфейс и зарегистрироваться в компоненте Scheduler

@Named("agentData")
@Scope("application")
public class AgentDataBean implements Serializable,IScheduledComponent {
...
public void doWork() {
  // do database poll
}
 ... 
}

Теперь у меня запланировано Spring, и у меня есть FacesContext в AgentDataBean, чтобы я мог выполнить Push-код Icefaces.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...