6

我正在生成一个线程,它将不断从数据库中提取大量记录并将它们放入队列中。该线程将在服务器负载时启动。我希望这个线程一直处于活动状态。如果数据库中没有记录,我希望它等待一段时间后再次检查。我正在考虑使用 spring 任务调度程序来安排这个,但不确定这是否正确,因为我只希望我的任务启动一次。在 Spring 中实现这一点的好方法是什么?

另外,我需要进行边界检查,如果我的线程出现故障(由于任何错误或异常情况),它应该在一段时间后重新实例化。

我可以通过使用线程通信方法在 java 中完成所有这些工作,但只是尝试在 Spring 或 Java 中是否有适用于此类场景的东西。

任何建议或指针都会有所帮助。

4

5 回答 5

6

您可以使用@Scheduled注释来运行作业。首先创建一个带有注解的方法的类@Scheduled

班级

public class GitHubJob {

   @Scheduled(fixedDelay = 604800000)
   public void perform() {
      //do Something
    }
}

然后在你的配置文件中注册这个类。

弹簧上下文.xml

<?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:tx="http://www.springframework.org/schema/tx"
xmlns:task="http://www.springframework.org/schema/task"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

<tx:annotation-driven/>
<task:annotation-driven scheduler="myScheduler"/>

<task:scheduler id="myScheduler" pool-size="10"/>
<bean id="gitHubJob" class="org.tothought.spring.jobs.GitHubJob"/>

</beans>

有关调度的更多信息,请访问Spring Docs

于 2013-03-20T00:50:57.373 回答
4
@Scheduled(fixedDelay=3600000)
private void refreshValues() {
   [...]
}

每小时运行一次任务。它必须是无效的并且不接受任何论点。如果您使用 Spring 的 Java 配置,您还需要将注释添加@EnableScheduling到您的@Configuration类之一。

于 2013-06-20T06:53:51.117 回答
0

Spring 对调度任务提供了开箱即用的支持。 这是最新 3.2.x 版本的 spring 的文档,但请查看文档以了解您正在使用的版本。看起来它在后台使用 Quartz 来安排任务。

于 2013-03-19T23:15:29.403 回答
0

您可以尝试使用 Quartz 调度程序。http://quartz-scheduler.org/ 这将允许您指定任务执行之间的持续时间。您可以设置一个标志(布尔值),说明该类是否已运行,以避免重复您只想运行“第一次”时间的代码。

于 2013-03-19T23:04:31.577 回答
0

我认为您的要求只是石英或弹簧调度框架非常支持的常规 senario。但是您想创建一种特殊的方法来实现它。我的建议是保持简单和愚蠢。spring scheudling 将通过池而不是一直运行它来利用您的工作线程。

从统计数据来看,查看工人阶级的日志很容易。如果要在 Web 控制台中查看统计信息,则需要记录工作人员的登录数据库。我相信你可以用正常的方式轻松完成。

于 2013-03-20T01:09:38.730 回答