Как проще всего выполнять Java-класс каждые 30 секунд? - PullRequest
12 голосов
/ 19 марта 2010

Я читал о java / spring / hibernate и работал на «фиктивных» примерах, поэтому я сказал своему другу, чтобы он посоветовал что-то более сложное для меня, и теперь я застрял ... вот самый простой класс, который я мог думать о

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

}

Какой самый простой способ распечатать что-либо, вызвав метод voice() из бобов весной, и повторять его каждые 30 секунд, скажем, вот что я получил:

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

И да, я пытаюсь запустить это на Jboss 5, я создаю проект с Maven.

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

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

Вот мой 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>

Теперь я получаю это исключение:

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

Я не знал, что выполнение чего-то вроде Hello World каждые 30 секунд было бы таким сложным

Ответы [ 5 ]

28 голосов
/ 19 марта 2010

Я бы не стал беспокоиться о Кварце, это излишне просто так Java5 поставляется с собственным планировщиком, и он достаточно хорош.

До весны 3, это был самый простой подход:

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

С Spring 3 это может быть просто смешно:

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

и

<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 голосов
/ 06 мая 2010

С Spring 3 вы можете быстро использовать @Scheduled и @Async!

Проверьте это: Реализация приложения @Scheduled in Spring

1 голос
/ 19 марта 2010

У меня есть нечто подобное, но я использую класс QuartzConnector в муле, который запускается каждые 20 секунд. Смотрите пример. Другой способ - использовать запись времени типа cron. См. 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>  
1 голос
/ 19 марта 2010

Это выглядит сложно, но это действительно лучший способ сделать это. Вы можете настроить его вне приложения и разрешить выполнение пружины / кварца.

Это особенно полезно, когда метод, который вам нужно вызвать, - это вызов службы с поддержкой транзакций.

0 голосов
/ 15 октября 2017

Вы можете использовать запланированное задание

<bean id="EmptyScopesRemover" class="com.atypon.pagebuilder.core.tasks.impl.EmptyScopesRemoverImpl"/>

<task:scheduled-tasks>
    <task:scheduled ref="EmptyScopesRemover" method="remove" cron="0 */1 * * * *"/>
</task:scheduled-tasks>

вот видео https://www.youtube.com/watch?v=mt5R_KBlhTU

и вы можете проверить этот ответ на значения кукурузы https://stackoverflow.com/a/32521238/4251431

...