2010-03-19 5 views
12

Ich habe über Java/Frühling/Winterschlaf gelesen und arbeitete durch eine "Dummy" Beispiele, so sagte ich meinem Freund, um etwas ein bisschen schwieriger für mich zu empfehlen, und jetzt bin ich fest .. hier ist die einfachste Klasse, die ich könnte etwas auszudrucken durch den Aufruf metod voice() von Frühling Bohnen denkenWas ist der einfachste Weg, um alle 30 Sekunden eine Java-Klasse auszuführen?

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()); 
    } 

} 

Was die einfachste Art und Weise, und es tun repeadatly alle 30 Sekunden können sagen, hier ist das, was ich bisher habe:

<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> 

Und ja, ich versuche, dies auf Jboss 5 auszuführen, ich baue ein Projekt mit Maven.

Ich habe einige Vorschläge und mein Anwendungskontext sieht nun wie:

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

Hier meine web.xml ist:

<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> 

Jetzt bekomme ich diese Ausnahme:

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 

Ich wusste nicht, dass ich alle 30 Sekunden etwas wie Hello World ausführen würde, wäre das kompliziert

Antwort

28

sehen würde ich nicht mit Quarz stören, ist es übertrieben für etwas so einfach. Java5 kommt mit einem eigenen Scheduler und es ist gut genug.

Pre-Spring 3, ist dies war der einfachste Ansatz:

<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> 

mit Frühling-3 kann es lächerlich einfach sein:

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

und

<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

Die '@ Geplant' Annotation sieht wirklich nett aus. – BalusC

+0

@skaffman danke für deine Antwort, ich werde das jetzt versuchen, die Sache ist, ich möchte etwas komplizierter machen, also möchte ich von unten nach oben anfangen. 'Ich möchte zwei Objekte erstellen, die Nachrichten an andere senden, eine, um andere durch JMS-Messaging auf JBOSS 5 zu antworten, und ich möchte dies alle 30 Sekunden erledigen.Also ist die ausführende Aufgabe alle 30 Sekunden zu betrachten und dann weiter .. –

+0

@skaffman Große Antwort, ich versuchte es in beide Richtungen und seine Arbeit .. w00w tnx –

1

Es sieht kompliziert aus, aber das ist wirklich der beste Weg, das zu tun. Sie können es extern für die Anwendung konfigurieren und die Ausführung von quartz/quartz erlauben.

Dies ist besonders nützlich, wenn es sich bei der Methode, die Sie aufrufen müssen, um einen transaktionsfähigen Serviceaufruf handelt.

+0

@Reverend Gonzo da ist offensichtlich etwas nicht in Ordnung .. Ich bekomme keine Ausnahmen, und doch ist der Quarz nicht ex ecute, kopierte krieg zu jboss dir .. und immer noch nichts, ich erstellte einfache webapp hallo welt zu chk ist mein jboss richtig konfiguriert, ja es ist. –

1

Ich habe etwas ähnliches, aber mit der QuartzConnector-Klasse in Maultier, die alle 20 Sekunden läuft. Siehe Beispiel. Die andere Möglichkeit wäre es, die Zeit cron-Typ-Eintrag verwenden 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 danke ich versuche wirklich, Frühling und so viel wie möglich darüber zu lernen, so würde ich gerne Quellen Quarz verwenden –

+0

Sieht aus wie dies kann nützlich sein, wie klingt wie ähnliche Situation http: // www. jroller.com/habuma/entry/a_funny_thing_happened_while – Wiretap

+0

Es scheint, dass ich bisher meinen Anwendungskontext nicht mit web.xml verlinkt habe. Hier ist der Fehler, den ich jetzt bekomme. 12: 35: 51.657 FEHLER [01-SNAPSHOT] Fehler beim Konfigurieren Anwendung Listener der Klasse org.springframework.web.context.ContextLoaderListener java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener' Ich werde meine Frage mit appcontext aktualisieren –

Verwandte Themen