Обновление до springframework.scheduling.concurrent?

Как и в случае с 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 в @ Bean в Java.

EDIT: Поэтому я попытался реализовать xml с @ Bean и @Configuration вместо этого, и вот что я получил.

@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, если вызывается onTimeSchedule() более одного раза, будет работать здесь?

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

Ответы

Ответ 1

Используйте 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 требует только runnable.

Ответ 2

Spring 4 конфигурация - ниже конфигурации, работающей после spring миграции с 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>

Ответ 3

Ответ: добавьте одно поле "runnable"

 <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>