Каков самый простой способ выполнить класс Java каждые 30 секунд?
Я читал о java/ spring/hibernate и работал с примерами "dummy", поэтому я сказал своему другу рекомендовать что-то для меня немного сложнее, и теперь я застрял.. вот самый простой класс, о котором я мог подумать
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()
из spring beans, и повторите его каждые 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 каждые 30 секунд будет сложным
Ответы
Ответ 1
Я бы не стал беспокоиться о Кварце, это слишком сложно. Java5 поставляется со своим собственным планировщиком, и это достаточно хорошо.
Pre- Spring 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
С помощью Spring 3 вы можете быстро использовать @Scheduled
и @Async
!
Проверьте это: Внедрить @Scheduled в Spring приложении
Ответ 3
Это выглядит сложным, но это действительно лучший способ сделать это. Вы можете настроить его внешним для приложения и позволить выполнять spring/quartz.
Это особенно полезно, когда метод, который требуется вызвать, - это вызов службы с транзакцией.
Ответ 4
У меня есть что-то подобное, но с использованием класса QuartzConnector в mule, который запускается каждые 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>
Ответ 5
вы можете использовать запланированную задачу
<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
и вы можете проверить этот ответ на значения кукурузы
fooobar.com/info/415855/...