2012-03-21 29 views
6

Mã sau đây được giả sử để làm việc Không đồng bộ nhưng thay vào đó nó chờ phần Async kết thúc và sau đó đi. Làm cách nào để tôi có thể chạy phương thức blah() Không đồng bộ?Làm cách nào để chạy phương thức Không đồng bộ với mùa xuân?

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

bạn đang sử dụng Jersey? Chú thích này trong mã của bạn không thực sự thích chú thích mùa xuân. – vacuum

Trả lời

7

@Async chỉ hoạt động khi bạn chú thích các bean được quản lý bởi Spring, không phải các lớp tùy ý. Bạn cần xác định Process làm bean Spring và sau đó chèn nó vào lớp điều khiển của bạn, ví dụ:

<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

Tôi đã cập nhật mã để bao gồm @Component, nhưng tôi không biết làm thế nào để tiêm Process.java vào bộ điều khiển của tôi? – Grammin

+0

@Grammin: Xem câu trả lời đã chỉnh sửa. – skaffman

+0

Tôi nhận được ** Lớp đích không thể ủy quyền vì CGLIB2 không khả dụng. Thêm CGLIB vào đường dẫn lớp hoặc chỉ định các giao diện proxy. ** trong tệp spring.xml của tôi, bất kỳ ý tưởng nào? – Grammin

3

Hoặc bạn có thể thực hiện nhiệm vụ của bạn bằng tay với TaskExecutor. Chỉ cần xác định người thi hành trong bối cảnh:

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

hơn bạn có thể thực hiện nhiệm vụ Yor:

taskExecutor.execute(new Process()); 

Nhưng trong trường hợp này lớp Process bạn phải thực hiện giao diện Runnable

Các vấn đề liên quan