2010-03-19 12 views
12

He estado leyendo sobre java/spring/hibernate y trabajé con ejemplos "ficticios", así que le dije a mi amigo que me recomendara algo un poco más difícil, y ahora estoy atascado ... aquí está la clase más simple que pude piensa en¿Cuál es la forma más simple de ejecutar una clase Java cada 30 segundos?

package spring.com.practice; 

public class Pitcher { 

    private String shout; 

    public String getShout() { 
     return shout; 
    } 

    public void setShout(String shout) { 
     this.shout = shout; 
    } 

    public void voice() 
    { 
     System.out.println(getShout()); 
    } 

} 

¿Cuál es la forma más sencilla de imprimir algo llamando metod voice() de los granos de la primavera, y lo hacen repeadatly cada 30 segundos permite decir, aquí es lo que tengo hasta ahora:

<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> 
    <property name="jobDetail" ref="jobSchedulerDetail" /> 
    <property name="startDelay" value="0" /> 
    <property name="repeatInterval" value="30" /> 
</bean> 


<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
    <property name="schedulerName" value="pitcherScheduler" /> 
    <property name="triggers"> 
     <list> 
      <ref bean="simpleTrigger" /> 
     </list> 
    </property> 
</bean> 
<bean id="pitcher" class="spring.com.practice.Pitcher"> 
<property name="shout" value="I started executing..."></property> 
</bean> 

Y sí, estoy intentando ejecutar esto en Jboss 5, estoy construyendo un proyecto con maven.

Tengo algunas sugerencias y mi contexto de aplicación ahora se ve así:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:sched="http://www.springinaction.com/schema/sched" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
     http://www.springinaction.com/schema/sched 
     http://www.springinaction.com/schema/sched-1.0.xsd" 
     default-lazy-init="true"> 

    <bean id="stuffDoer" class="spring.com.practice"> 
    <property name="shout" value="I'm executing"/> 
    </bean> 

    <sched:timer-job 
     target-bean="stuffDoer" 
     target-method="voice" 
     interval="5000" 
     start-delay="1000" 
     repeat-count="10" /> 

</beans> 

Aquí es mi web.xml:

<web-app id="simple-webapp" version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
    <display-name>spring app</display-name> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
      /WEB-INF/conf/applicationContext.xml 
</param-value> 
    </context-param> 
    <context-param> 
     <param-name>log4jConfigLocation</param-name> 
     <param-value>/WEB-INF/log4j.properties</param-value> 
    </context-param> 
    <listener> 
     <listener-class> 
      org.springframework.web.util.Log4jConfigListener 
</listener-class> 
    </listener> 
    <listener> 
     <listener-class> 
      org.springframework.web.context.ContextLoaderListener 
</listener-class> 
    </listener> 
</web-app> 

ahora tengo esta excepcion:

12:35:51,657 ERROR [01-SNAPSHOT]] Error configuring application listener of class org.springframework.web.context.ContextLoaderListener 
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener 

No me di cuenta de ejecutar algo así como hola mundo cada 30 segundos sería tan complicado

Respuesta

28

no me molestaría con Cuarzo, que es excesivo para algo tan simple. Java5 viene con su propio programador, y es lo suficientemente bueno.

Pre-Primavera 3, esto es era el método más sencillo:

<bean class="org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean"> 
    <property name="scheduledExecutorTasks"> 
     <list> 
      <bean class="org.springframework.scheduling.concurrent.ScheduledExecutorTask"> 
       <property name="period" value="30000"/> 
       <property name="runnable"> 
        <bean class="org.springframework.scheduling.support.MethodInvokingRunnable"> 
         <property name="targetObject" ref="pitcher"/> 
         <property name="targetMethod" value="voice"/> 
        </bean> 
       </property> 
      </bean> 
     </list> 
    </property> 
</bean> 

Con Spring 3, puede ser ridículamente fácil:

@Scheduled(fixedRate=30000) 
public void voice() { 
    System.out.println(getShout()); 
} 

y

<beans xmlns="http://www.springframework.org/schema/beans" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:task="http://www.springframework.org/schema/task" 
      xsi:schemaLocation=" 
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
       http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd 
      "> 

    <bean id="pitcher" class="spring.com.practice.Pitcher"> 
    <property name="shout" value="I started executing..."></property> 
    </bean> 

    <task:annotation-driven/> 

</beans> 
+2

Esa anotación '@ Scheduled' se ve muy bien. – BalusC

+0

@skaffman gracias por su respuesta, lo intentaré ahora, la cosa es que quiero hacer algo más complicado, así que quiero comenzar de abajo hacia arriba. 'Quiero crear 2 objetos que se envíen mensajes entre sí, uno para saludar a otros para que respondan a través de mensajes JMS en JBOSS 5, y quiero que esto se haga cada 30 segundos. Así que lo primero que debe considerar es ejecutar la tarea cada 30 segundos y luego en adelante ... –

+0

@skaffman Gran respuesta, lo intenté en ambos sentidos y está funcionando ... w00w tnx –

1

Parece complicado, pero esa es realmente la mejor manera de hacerlo. Puede configurarlo de forma externa a la aplicación y dejar que la ejecución de la manija de resorte/cuarzo.

Esto es especialmente útil cuando el método que necesita para llamar es una llamada de servicio habilitada para transacciones.

+0

@Reverend Gonzo, obviamente, hay algo mal con esto ... No tengo excepciones, y sin embargo, el cuarzo no ex ecute, copié la guerra a jboss dir .. y todavía nada, creé webapp simple hello world to chk es mi jboss configurado correctamente, sí lo es. –

1

Tengo algo similar pero usando la clase QuartzConnector en mula, que se ejecuta cada 20 segundos. Ver ejemplo. La otra forma sería la de utilizar el tiempo de entrada de tipo cron ver Quartz Cron

<endpoint name="poller" address="quartz://poller1" type="sender" connector="QuartzConnector"> 
     <properties> 
     <property name="repeatInterval" value="20000"/> 
     <property name="payloadClassName" value="org.jdom.Document" /> 
     <property name="startDelay" value="10000"/>     
     </properties> 
    </endpoint> 
+0

@Wiretap gracias Estoy tratando de aprender sobre la primavera y en la medida de lo posible al respecto, por lo que me gustaría utilizar resortes de cuarzo –

+0

Parece que esto puede ser útil, ya que suena como situación similar http: // www. jroller.com/habuma/entry/a_funny_thing_happened_while – Wiretap

+0

Parece que hasta ahora no vinculé el contexto de mi aplicación con web.xml aquí está el error que recibo ahora '12: 35: 51,657 ERROR [01-SNAPSHOT]] Error al configurar listener de aplicación de clase org.springframework.web.context.ContextLoaderListener java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener' Actualizaré mi pregunta con appcontext –

Cuestiones relacionadas