【问题标题】:Spring Task schedu春季任务计划
【发布时间】:2012-10-15 08:51:20
【问题描述】:

我是第一次使用 Spring 任务执行器系统,但无法让它工作......

我已经阅读了various posts on SO 关于此的内容,但没有任何迹象表明该任务正在执行。首先,我在我的服务 bean 上尝试了 @Scheduled 注释,但是在阅读了这遇到了 AOP 代理问题后,我正在使用直接的 XML 配置:

<task:executor id="executorWithPoolSizeRange"
        pool-size="5-25"
        queue-capacity="100" />       
 <task:scheduler id="taskScheduler" pool-size="2" /> 
 <task:scheduled-tasks>
 <task:scheduled ref="fileWriter" method="test" fixed-rate="5000" />
</task:scheduled-tasks>

fileWriter bean 是常规 Spring bean,测试方法如下:

public void test (){
   System.err.println("run in job");
}

通过使用 DEBUG 日志记录设置运行,我知道以下内容:

  1. bean 已加载并初始化。
  2. 如果我输错了“方法”属性的名称,则会引发异常,因此至少会解析任务定义。
  3. 调试语句中没有任何内容表明任务已激活
  4. 永远不会触发测试方法中的断点。

我希望在我的应用程序或弹簧单元测试运行时每 5 秒看到一次,从控制台上打印出来自 test() 方法的消息。我正在使用 Spring 3.0.6 并在 Mac 10.6 Java 6 上的 Eclipse 3.7 中测试通过 Jetty 运行的应用程序。我们使用的所有其他 Spring 功能(数据库、安全性、MVC 工作正常)。非常感谢任何建议!

【问题讨论】:

  • 我没有将它与 XML 一起使用,但是当我将它与注释一起使用时,正在计划的类必须具有 @Component 注释。你对 fileWriter 的定义是什么?
  • 感谢您的回复 - &lt;bean id="fileWriter" class="com.blah.archive.FileArchiveWriter"&gt; &lt;property name="archiveRoot" value="./archive"&gt;&lt;/property&gt; &lt;/bean&gt;,我添加了一个组件注释并将包添加到扫描的列表中:&lt;context:component-scan base-package="com.blah.service,com.blah.model.archive"/&gt;。但是仍然没有激活该方法(当我在@Service bean中调度一个方法时)
  • 刚刚意识到我在之前的评论中打错了包名:应该是com.blah.archive.FileArchiveWriter&lt;context:component-scan base-package="com.blah.service,com.blah.archive"/&gt;
  • 我个人觉得注释更容易处理。忽略您的 AOP 问题,它是否适用于注释?如果是这样,那么一旦它与注释一起使用,您就可以转换为 xml
  • 不,正是注释缺乏成功促使我尝试 XML 配置。我同意这些注释使用起来更有吸引力,如果我能让这些东西正常工作,我会更喜欢!

标签: java spring scheduled-tasks


【解决方案1】:

如果您还没有尝试将 Quartz 添加到您的类路径中(您不应该需要它,但是...)。

最有可能发生的是调度程序正在运行并且无法执行您的代理。代理可能会抛出异常,而调度程序的异常策略可能会丢弃它。

另一个选项...(我可能会被否决)是不使用 Springs 调度程序。除非您需要 Quartz Cron 的东西,否则我发现 Springs 任务调度程序过于复杂但与以下相比却很弱:

Guava's ListeningScheduledExecutorService

侦听执行器服务将允许您链接事件。您可以轻松地将上述内容包装在一些服务 bean 中。是的,我知道您可能想要 Spring 提供的解耦...但是您可以通过结合 ExecutorService 和Guava's EventBus 获得更好的解耦和基于事件。

【讨论】:

  • 感谢您的建议,我会研究一下。自从我上次发表评论以来,我按照 Spring 文档的第 25 章尝试了 Quartz,效果非常好 - 但我肯定会看看这个,我不知道。
【解决方案2】:

试试这个:

 <task:scheduled-tasks scheduler="taskScheduler">
   <task:scheduled ref="fileWriter" method="test" fixed-rate="5000" />
 </task:scheduled-tasks>

【讨论】:

  • 谢谢,但没有成功。我了解如果未明确提及调度程序,则会使用默认调度程序。你知道在启动期间是否有任何我应该寻找的日志语句可以提供任何线索可能(不是)正在发生的事情?
  • 嗯...也许问题出在你的班级?尝试使用一种方法使用一些简单的类。还可以尝试增加您的调度程序池。
  • 我认为这与配置有关...我现在通过在测试的 ContextConfiguration 注释中重新排序类路径元素列表,使用 Spring JUnits 中的 XML 配置运行它(有趣的是似乎每个时间点都会多次使用该方法),但即使在 web.xml 中配置文件的顺序相同,应用程序本身仍然没有任何内容。但至少现在看来它可以工作了....
  • (interestingly it seems to hit the method several times each timepoint ) 好像你在初始化同一个bean的多个实例。
  • 是的,这被证明是运行 Spring Junit 测试的工件 - 每个测试类都启动了一个新的调度程序。无论如何,很抱歉成为失败主义者并感谢您的建议,但我现在不得不放弃这个,我不知道为什么它会在测试中运行,而不是在应用程序中运行。我已经通过 Spring 设置了一个老式的 Timer 任务,它似乎工作正常,它没有调度程序那么强大,但目前必须这样做。当我们升级时,它可能会在 3.1 中工作!
猜你喜欢
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 2019-05-18
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多