2010-03-19 16 views
12

Czytałem o java/wiosna/hibernacji i pracowałem nad przykładami "manekinowymi", więc powiedziałem mojemu przyjacielowi, aby polecił mi coś trudniejszego, a teraz utknąłem ... oto najprostsza klasa, jaką mogłem myślećJaki jest najprostszy sposób wykonania klasy Java co 30 sekund?

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

} 

Co jest najprostszym sposobem, aby wydrukować coś wywołując Metod voice() z fasoli wiosny, i robią to repeadatly co 30 sekund powiedzmy, tutaj jest to, co mam do tej pory:

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

I tak, próbuję uruchomić to na Jboss 5, buduję projekt z mavenem.

mam pewne sugestie i mój kontekst aplikacji teraz wygląda:

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

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

Teraz otrzymuję ten exeption:

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 

Nie zdawałem sobie sprawy, że wykonanie czegoś takiego jak hello world co 30 sekund byłoby tak skomplikowane.

Odpowiedz

28

nie będę przejmować się kwarc, to przesada czegoś to proste. Java5 ma swój własny harmonogram i jest wystarczająco dobry.

Pre-Wiosna 3, to był najłatwiejszy dojazd:

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

ze sprężyną 3, może być śmiesznie proste:

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

i

<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

Ta adnotacja "@ Scheduled" wygląda naprawdę ładnie. – BalusC

+0

@skaffman dziękuję za odpowiedź, spróbuję tego teraz, chodzi o to, że chcę zrobić coś bardziej skomplikowanego, więc chcę zacząć od dołu do góry. 'Chcę utworzyć 2 obiekty, które wysyłają do siebie komunikaty, jeden do drugiego, aby odpowiadał przez komunikaty JMS na JBOSS 5, i chcę to robić co 30 sekund." Pierwszą rzeczą, którą należy wziąć pod uwagę, byłoby wykonywanie zadania co 30 sekund a potem dalej .. –

+0

@skaffman Świetna odpowiedź, próbowałem go w dwie strony i jego działanie .. w00w tnx –

1

Wygląda na skomplikowaną, ale tak naprawdę jest najlepszym sposobem na zrobienie tego. Możesz skonfigurować go na zewnątrz aplikacji i pozwolić na wykonanie uchwytu sprężynowego/kwarcowego.

Jest to szczególnie przydatne, gdy metoda, którą należy wywołać, jest wywołanie usługi z włączoną transakcją.

+0

@Reverend Gonzo oczywiście coś jest nie tak z tym .. Nie mam żadnych wyjątków, a jednak kwarc nie jest ecute, copied war to jboss dir .. i nadal nic, stworzyłem prosty świat cześć dla webappu do chk to mój jboss poprawnie skonfigurowany, tak jest. –

1

Mam coś podobnego, ale za pomocą klasy QuartzConnector w mule, który działa co 20 sekund. Zobacz przykład. Innym sposobem byłoby wykorzystanie wpisu typ czas cron zobaczyć 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 dziękuję Naprawdę staram się nauczyć wiosny i jak najwięcej o tym, więc chciałbym użyć sprężyn kwarcu –

+0

Wygląda na to, że może to być przydatne, ponieważ brzmi podobnie do podobnej sytuacji http: // www. jroller.com/habuma/entry/a_funny_thing_happened_while – Wiretap

+0

Wygląda na to, że do tej pory nie łączyłem kontekstu aplikacji z web.xml tutaj jest błąd, który dostaję teraz '12: 35: 51,657 ERROR [01-SNAPSHOT]] Błąd podczas konfiguracji aplikacja nasłuchująca klasy org.springframework.web.context.ContextLoaderListener java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener' Zaktualizuję pytanie za pomocą appcontext –

Powiązane problemy