Spring XML相当于@EnableAsync

时间:2015-07-14 08:32:42

标签: java spring asynchronous

有没有办法从XML打开Spring的Async配置?我看到的所有示例都使用程序化上下文声明并使用@EnableAsync

是否存在与此类似的XML。在某些地方,我看到<context:annotation-config />正在使用,但这并没有提到有关异步的任何内容。

我正在使用Spring 4.

3 个答案:

答案 0 :(得分:10)

您是否尝试过使用此

<task:annotation-driven /> 

答案 1 :(得分:3)

是的,你可以使用这样的东西

 <beans>
     <task:annotation-driven executor="myExecutor" exception-handler="exceptionHandler"/>
     <task:executor id="myExecutor" pool-size="7-42" queue-capacity="11"/>
     <bean id="asyncBean" class="com.foo.MyAsyncBean"/>
     <bean id="exceptionHandler" class="com.foo.MyAsyncUncaughtExceptionHandler"/>
 </beans>

根据Spring documentation,这相当于使用@EnableAsync

答案 2 :(得分:1)

在基于注释的方法中,必须在Configuration类上具有@EnableAsync。如下所示:

@Configuration
@EnableAsync
@ComponentScan(basePackages ="com.spring.sample.demoAsync")
public class SpringAsyncConfig {

}

然后创建一个组件类以具有一个称为异步的功能。如下所示:

@Component
public class AsyncClass {

    @Async
    public Future<String> asyncMethod() {
        System.out.println("Executing Thread Async:" +Thread.currentThread().getName());
        return new AsyncResult<String>(Thread.currentThread().getName());
    }
}

要获得与该方法等效的xml,可以在applicationContext.xml文件中创建一个bean,如下所示:

<bean id="AsyncClass" class="com.spring.sample.demoAsync.AsyncClass"/>

要在流中调用函数asyncMethod(),可以从任何其他bean或服务中引用AsyncClass bean。以下是我尝试拼接流程的内容:

<bean id="callingBean" class="comspring.sample.demoAsync.CallingBeanClass">
   <property name="AsyncClassBean" ref="AsyncClass"/>
</bean>

没有必要执行此步骤,而是另一种方法。

在我的applicationContext.xml文件中,我还使用以下命令导入了任务模式:

xmlns:task="http://www.springframework.org/schema/task
xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd"

,然后在同一文件中将执行程序作为任务提及:

<task:executor id="myexecutor" pool-size="5"  />

现在,我的AsyncClass看起来没有@component注释。

public class AsyncClass {

    @Async("myexecutor")
    public Future<String> asyncMethod() {
        System.out.println("Executing Thread Async:" +Thread.currentThread().getName());
        return new AsyncResult<String>(Thread.currentThread().getName());
    }
}

,然后最终从CallingBeanClass异步调用asyncMethod()。