Spring任务:计划任务被窃听?

时间:2015-01-08 09:32:45

标签: java spring scheduled-tasks scheduler

我发现了以下问题,我想知道它是否是正常行为(如果是这样,为什么?)或者它是否是Spring的错误。我有一个Spring上下文文件,用于定义Scheduled-tasks。如果在我的整个应用程序上下文中多次导入此文件,则该任务也会多次执行。

E.g。 我有一个上下文文件:a-context.xml:

...
<task:scheduler id="scheduler" pool-size="5"/>

<task:scheduled-tasks scheduler="scheduler">
    <task:scheduled ref="archiveTask" method="run" cron="0 * * * * *"/>
</task:scheduled-tasks>

<bean id="archiveTask" class="ch.post.ehealth.referral.core.task.ArchiveTask" />
...

假设我也有这个b-context.xml:

...
<import resource="classpath:./a-context.xml" />
...

最后我的application-context.xml:

...
<import resource="classpath:./a-context.xml" />
<import resource="classpath:./b-context.xml" />
...

在这种情况下,我的任务执行两次,因为它是&#34;导入&#34;两次。如果我在application-context.xml中移动任务:scheduled-tasks部分,那么它只按预期执行一次。这是正常的,如果是的话为什么? 我不明白,因为豆子的行为不同。例如。这种情况不会对只会创建一次的bean产生问题。

由于

更新
我的web.xml:

...
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/application-context.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-   class>
</listener>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.gwtrpcspring.RemoteServiceDispatcher</servlet-class>
</servlet>
...

1 个答案:

答案 0 :(得分:0)

在下面的代码中,加载了“application-context.xml”。在appication-context.xml中,您已经导入了两次.context。这意味着它已被加载两次,因此我们的scehduler也会被触发两次。如果已经加载了bean xml,那么Spring仍然无法避免,然后避免第二次加载它。所以我们在导入时要特别小心,特别是当我们使用调度程序时。

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/application-context.xml</param-value>
</context-param>