2012-03-21 4 views
6

Следующий код предназначен для работы асинхронно, но вместо этого он ожидает завершения работы Async, а затем. Как я могу запустить метод blah() асинхронно?Как запустить метод асинхронно с пружиной?

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

вы используете Джерси? Эти аннотации в вашем коде не очень напоминают аннотации Spring. – vacuum

ответ

7

@Async работает только тогда, когда вы комментируете управляемые Spring бобы, а не произвольные классы. Вы должны определить Process в качестве компонента Spring, а затем ввести его в класс контроллера, например.

<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

Я обновил код, чтобы включить @Component, но я точно не знаю, как вводить Process.java в мой контроллер? – Grammin

+0

@ Grammin: см. Отредактированный ответ. – skaffman

+0

Я получаю ** Не могу назначить целевой класс, потому что CGLIB2 недоступен. Добавьте CGLIB в путь класса или укажите прокси-интерфейсы. ** в моем spring.xml, какие-нибудь идеи? – Grammin

3

В качестве альтернативы вы можете выполнить свою задачу вручную с TaskExecutor. Просто определить исполнителя в контексте:

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

Чем вы можете выполнить Йор задачу:

taskExecutor.execute(new Process()); 

Но в этом случае ваш класс должен реализовать процесс Runnable интерфейс

Смежные вопросы