15

从 Spring 3.0 开始,ScheduledTimerTask 已被弃用,我无法理解如何升级到 org.springframework.scheduling.concurrent。

    <bean id="timerFactoryBean" class="org.springframework.scheduling.timer.TimerFactoryBean">
        <property name="scheduledTimerTasks">
            <list>
                 <ref bean="onlineTimeSchedule" />
            </list>
            </property>
    </bean>

    <bean id="onlineTimeSchedule" class="org.springframework.scheduling.timer.ScheduledTimerTask">
        <property name="timerTask" class="com.example.OnlineTimerTask" />
        </property>
        <property name="period" value="60000" />
        <property name="delay" value="1000" />
    </bean>

OnlineTimerTask 扩展 java.util.TimerTask 的地方。这是一个简单的任务,每分钟向发布者发布一条消息。我检查了文档,但什么也没有。我不明白从并发包中使用哪种方式以及哪种方式最适合。

我也想把这个xml转换成Java中的@Bean。

编辑:所以我尝试用@Bean 和@Configuration 来实现xml,这就是我得到的。

@Configuration
public class ContextConfiguration {
    @Bean
    public ScheduledExecutorFactoryBean scheduledExecutorFactoryBean() {
        ScheduledExecutorFactoryBean scheduledFactoryBean = new ScheduledExecutorFactoryBean();
        scheduledFactoryBean.setScheduledExecutorTasks(new ScheduledExecutorTask[] {onlineTimeSchedule()});

        return scheduledFactoryBean;
    }

    @Bean
    public ScheduledExecutorTask onlineTimeSchedule() {
        ScheduledExecutorTask scheduledTask = new ScheduledExecutorTask();
        scheduledTask.setDelay(1000);
        scheduledTask.setPeriod(60000);
        scheduledTask.setRunnable(new OnlineTimerTask());

        return scheduledTask;
    }
}

上面的代码会是 xml 的正确替换吗?在我的情况下,setScheduledExecutorTasks 会正常工作吗?我的意思是对同一个 bean 实例的引用,如果 onlineTimeSchedule() 被多次调用,会在这里工作吗?

scheduledFactoryBean.setScheduledExecutorTasks(new ScheduledExecutorTask[] {onlineTimeSchedule()});
4

3 回答 3

31

org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean代替使用和代替org.springframework.scheduling.timer.TimerFactoryBean使用。您将需要根据需要调整属性名称和值,但这应该是不言而喻的。org.springframework.scheduling.concurrent.ScheduledExecutorTaskorg.springframework.scheduling.timer.ScheduledTimerTask

或者,您可以将您的重构com.example.OnlineTimerTask为不扩展java.util.TimeTask,因为 ScheduledTimerTask 只需要一个可运行的。

于 2011-03-20T15:18:58.920 回答
7

Spring 4 配置 - 在从 3.2.x 迁移到 4.6.x 之后,以下配置工作

<bean id="schedulerTask"
        class="org.springframework.scheduling.support.MethodInvokingRunnable">
        <property name="targetObject" ref="springJmsListnerContainer" />
        <property name="targetMethod" value="execute" />
    </bean>
    <bean id="timerTask" class="org.springframework.scheduling.concurrent.ScheduledExecutorTask">
        <property name="runnable" ref="schedulerTask" />
        <property name="delay" value="100" />
        <property name="period" value="60000" />
    </bean>
    <bean class="org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean">
        <property name="scheduledExecutorTasks">
            <list>
                <ref bean="timerTask" />
            </list>
        </property>
    </bean>
于 2016-05-27T16:02:37.923 回答
2

答案是——添加一个“可运行”字段

 <bean id="scheduledExecutorTask" 
    class="org.springframework.scheduling.concurrent.ScheduledExecutorTask">
    <!-- wait 10 milli seconds before starting repeated execution -->
    <property name="delay">
        <value>10</value>
    </property>
    <!-- run every 1 second -->
    <property name="period">
        <value>1000</value>
    </property>
    <property name="runnable">
        <ref bean="checkInvokingTask"/>
    </property>
</bean>
于 2015-09-16T17:50:11.557 回答