升级到springframework.scheduling.concurrent?

时间:2011-03-20 15:01:22

标签: java spring spring-3

从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的位置。这是一项简单的任务,每分钟都会向发布者发布一条消息。我检查了文档,但没有。我无法理解从并发包使用哪种方式,哪种方式最适合。

此外,我想在Java中将此xml转换为@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会正常工作吗?我的意思是,如果多次调用onlineTimeSchedule(),引用同一个bean实例会在这里工作吗?

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

3 个答案:

答案 0 :(得分:30)

使用org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean代替org.springframework.scheduling.timer.TimerFactoryBean并使用org.springframework.scheduling.concurrent.ScheduledExecutorTask代替org.springframework.scheduling.timer.ScheduledTimerTask。您需要根据需要调整属性名称和值,但这应该是非常明显的。

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

答案 1 :(得分:6)

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>

答案 2 :(得分:2)

答案是 - 添加一个&#34; runnable&#34;领域

0 and 1