Spring Scheduler

Buenas, quiero ejecutar un metodo cada 10min, el metodo es muy sencillo solo manda a imprimir por cosola, pero me envia el siguiente error: java.lang.IllegalArgumentException: Only no-arg methods may be annotated with @Scheduled.

Mi contexto:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:task="http://www.springframework.org/schema/task"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       <a href="
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
" title="http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
">http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
</a>       <a href="
http://www.springframework.org/schema/task
" title="http://www.springframework.org/schema/task
">http://www.springframework.org/schema/task
</a>       <a href="
http://www.springframework.org/schema/task/spring-task-3.0.xsd
" title="http://www.springframework.org/schema/task/spring-task-3.0.xsd
">http://www.springframework.org/schema/task/spring-task-3.0.xsd
</a>       <a href="
http://www.springframework.org/schema/context
" title="http://www.springframework.org/schema/context
">http://www.springframework.org/schema/context
</a>       <a href="
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

" title="http://www.springframework.org/schema/context/spring-context-3.0.xsd">

">http://www.springframework.org/schema/context/spring-context-3.0.xsd">

</a>    <!--
     Se buscan todos los componentes declarados con anotaciones dentro
     del paquete "com.dosideas". Todas las clases anotadas con @Component,
     @Service, @Repository, @Configurable serán agregadas al factory de Spring
     automáticamente, sin necesidad de declararlas en este XML.
    -->
    <context:component-scan base-package="com.javadicto.async"/>

    <!--
     Se buscan las ejecuciones programadas anotadas en las clases con la
     anotacion @Scheduled y @Async.
     Además se asocia un pool de threads para ejecutar estos métodos.
     Clase de ejemplo: com.javadicto.async.AsyncService
    -->
    <task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
    <task:executor id="myExecutor" pool-size="5"/>
    <task:scheduler id="myScheduler" pool-size="10"/>

</beans>

La clase con el metodo anotado:

package com.javadicto.async;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class AsyncService  {

   
    //@Async
    @Scheduled(cron="0/10 * * * * ?")
    public void decirHola(String nombre) throws InterruptedException {        
        System.out.println("Hola: "+nombre);
    }    
   
}

Mi Test:

package com.javadicto.async;

import java.util.concurrent.ExecutionException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@ContextConfiguration(locations={"classpath:com/dosideas/async/config.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class AsyncServiceTest {

    @Autowired
    private AsyncService instance;

    @Test
    public void metodoAsync() throws InterruptedException, ExecutionException {
        instance.decirHola("javadicto");        
    }
}

Supongo que mi problema se encuentra en la anotación: @Scheduled(cron="0/10 * * * * ?") pero no se por que, alguien que me pueda orientar?

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de neko069

Sin argumentos

Los métodos que debes usar con ésa anotación (@Scheduled) deben ir sin argumentos; según recuerdo, para configurar una tarea con argumentos, es otra forma... pero no me creas, checa las docs de Spring.

Imagen de ezamudio

interrogación

Para qué es la interrogación? nunca la había visto en notación de crontab. si mal no recuerdo es minuto, hora, día del mes, mes, y día de la semana... entonces el sexto, la interrogación, es el comando a ejecutar? tipo un parámetro de JDBC?

En fin, el error es muy claro: No puedes ponerle @Scheduled a métodos que tienen parámetros y estás anotando un método con un parámetro. La razón es obvia; cuando se ejecuta el método cada X tiempo, qué parámetro se le pasaría? por eso no pueden tener parámetros los métodos que se ejecutan cada X tiempo.

Imagen de paranoid_android

Podrias intentar

Only no-arg methods may be annotated with @Scheduled.

package com.javadicto.async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class AsyncService  {
   private String nombre=null;
   
   public void setNombre(String nombre){
        this.nombre=nombre;
   }  
 
    //@Async
    @Scheduled(cron="0/10 * * * * ?")
    public void decirHola() throws InterruptedException {        
        System.out.println("Hola: "+nombre);
    }    
   
}

el ?

Si pones el ? al final de una hora, se ejecuta todos los dias... si despues del ? le pones una fecha (mes dia) significa que se ejecuta en ese mes y ese dia de todos los años. Si le pones un año despues del ?, significa que se ejecuta todos los dias de ese año ('nomas).

Cron Expressions

Huuuuy, buenisimo, encontre una tabla con ejemplos de Cron Expressions

creo que les faltó cuando quieres que se ejecute solo ciertos dias, pero es obvio que se ponen los dias en separados por coma.

;)

Yo lo heche a andar!

Muchas gracias a todos por sus respuestas, como lo indico ezamudio un metodo que contiene parametros no puede anotarse con @Scheduled y la solución que propone paranoid_android lo resuelve. Las tablas de los ejemplo de crones que menciona java.daba.doo me sirvieron de mucho.

Gracias