Pregunta

A partir de la primavera 3.0, el ProgramedtimerTask está en desuso y no puedo entender cómo actualizar a 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>

Donde el OnlinetimerTask se extiende java.util.timerTask. Es una tarea simple que publica un mensaje para el editor cada minuto. Revisé la documentación, pero nada ... No puedo entender qué camino usar desde el paquete concurrente y cuál se adapta a los mejores.

También quiero convertir este XML en @Bean en Java.

EDITAR: Así que intenté implementar el XML con @Bean y @Configuration, y esto es lo que obtuve.

@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;
    }
}

¿El código anterior será el reemplazo correcto para XML? ¿Funcionará correctamente el setscheduledExecutortasks? Quiero decir, ¿la referencia a la misma instancia de Bean, si Onlinetimeschedule () se llama más de una vez, funcionará aquí?

scheduledFactoryBean.setScheduledExecutorTasks(new ScheduledExecutorTask[] {onlineTimeSchedule()});
¿Fue útil?

Solución

Usar org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean en lugar de org.springframework.scheduling.timer.TimerFactoryBean y use org.springframework.scheduling.concurrent.ScheduledExecutorTask en lugar de org.springframework.scheduling.timer.ScheduledTimerTask. Deberá ajustar los nombres y valores de la propiedad según sea necesario, pero eso debería ser bastante evidente.

Opcionalmente, puede refactorizar su com.example.OnlineTimerTask no extender java.util.TimeTask ya que el ProgramedTimerTask solo requiere un ejecutable.

Otros consejos

Configuración de Spring 4: por debajo de la configuración que funciona después de la migración de primavera de 3.2.x a 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>

La respuesta es: agregar un campo "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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top