2012-03-21 8 views
6

Se supone que el siguiente código funciona de forma asíncrona, pero en su lugar espera que la parte Async termine y luego se apaga. ¿Cómo puedo hacer que el método blah() se ejecute de manera asincrónica?¿Cómo puedo ejecutar un método de forma asincrónica con la primavera?

spring.xml

<?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 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/task 
     http://www.springframework.org/schema/task/spring-task-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd 
    "> 

    <!-- Activates @Scheduled and @Async annotations for scheduling --> 
    <task:annotation-driven /> 

    <bean id="test" 
     class="com.spring.test.Test"> 
</beans> 

Test.java

@Path("/test") 
public class Test 
{ 
    @GET 
    @Path("/test") 
    @Produces("text/plain") 
    public String tester() 
    { 
    return "Running..."; 
    } 

    @GET 
    @Path("/triggerNew") 
    @Produces("text/plain") 
    public String triggerNew() 
    { 
    System.out.println("BEFORE " + new Date() + " BEFORE"); 

    new Process().blah(); 

    System.out.println("AFTER " + new Date() + " AFTER"); 
    return "TRIGGERED"; 
    } 
} 

Process.java

@Component 
    public class Process 
    { 
     @Async 
     public void blah() 
     { 
     try 
     { 
      Thread.currentThread().sleep(5000); 
     } 
     catch (InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
     System.out.println("NEW THREAD " + new Date() + " NEW THREAD"); 
     } 
    } 
+0

¿Está utilizando Jersey? A estas anotaciones en su código realmente no les gustan las anotaciones de Spring. – vacuum

Respuesta

7

@Async solo funciona cuando anota beans administrados por Spring, no clases arbitrarias. Debe definir Process como un bean de primavera y luego insertarlo en su clase de controlador, p.

<bean id="test" class="com.spring.test.Test"> 
    <property name="process"> 
     <bean class="com.spring.test.Process"/> 
    </property> 
</bean> 

public class Test { 
    private Process process; 

    public void setProcess(Process process) { 
     this.process = process; 
    } 

    ... 

    public String triggerNew() { 
     process.blah(); 
    } 
} 
+0

He actualizado el código para incluir @Component, pero no sé exactamente cómo inyectar Process.java en mi controlador. – Grammin

+0

@Grammin: ver respuesta editada. – skaffman

+0

Obtengo una ** clase de destino de proxy no porque CGLIB2 no está disponible. Agregue CGLIB a la ruta de la clase o especifique las interfaces proxy. ** en mi spring.xml, ¿alguna idea? – Grammin

3

Como alternativa, puede ejecutar su tarea de forma manual con TaskExecutor. Sólo definir ejecutor en el contexto:

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"/> 

de lo que puede ejecutar yor tarea:

taskExecutor.execute(new Process()); 

Pero en este caso la clase de proceso debe implementar la interfaz Ejecutable

Cuestiones relacionadas