`
落叶留步
  • 浏览: 53239 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

spring异步任务相关

 
阅读更多

    自定义异步任务执行的Executor,默认用的是SimpleAsyncTaskExecutor

 

// AsyncExecutionInterceptor
@Override
public Object invoke(final MethodInvocation invocation) throws Throwable {
		Class<?> targetClass = (invocation.getThis() != null ? AopUtils.getTargetClass(invocation.getThis()) : null);
		Method specificMethod = ClassUtils.getMostSpecificMethod(invocation.getMethod(), targetClass);
		final Method userDeclaredMethod = BridgeMethodResolver.findBridgedMethod(specificMethod);

		AsyncTaskExecutor executor = determineAsyncExecutor(userDeclaredMethod);// a
		if (executor == null) {
			throw new IllegalStateException(
					"No executor specified and no default executor set on AsyncExecutionInterceptor either");
		}

		Callable<Object> task = new Callable<Object>() {
			@Override
			public Object call() throws Exception {
				try {
					Object result = invocation.proceed();
					if (result instanceof Future) {
						return ((Future<?>) result).get();
					}
				}
				catch (ExecutionException ex) {
					handleError(ex.getCause(), userDeclaredMethod, invocation.getArguments());
				}
				catch (Throwable ex) {
					handleError(ex, userDeclaredMethod, invocation.getArguments());
				}
				return null;
			}
		};

		return doSubmit(task, executor, invocation.getMethod().getReturnType());
	}

   a.AsyncTaskExecutor executor = determineAsyncExecutor(userDeclaredMethod);// a

// AsyncExecutionAspectSupport
protected AsyncTaskExecutor determineAsyncExecutor(Method method) {
		AsyncTaskExecutor executor = this.executors.get(method);
		if (executor == null) {
			Executor targetExecutor;
			String qualifier = getExecutorQualifier(method);
			if (StringUtils.hasLength(qualifier)) {
				targetExecutor = findQualifiedExecutor(this.beanFactory, qualifier);
			}
			else {
				targetExecutor = this.defaultExecutor;
				if (targetExecutor == null) {
					synchronized (this.executors) {
						if (this.defaultExecutor == null) {
							this.defaultExecutor = getDefaultExecutor(this.beanFactory);// b
						}
						targetExecutor = this.defaultExecutor;
					}
				}
			}
			if (targetExecutor == null) {
				return null;
			}
			executor = (targetExecutor instanceof AsyncListenableTaskExecutor ?
					(AsyncListenableTaskExecutor) targetExecutor : new TaskExecutorAdapter(targetExecutor));
			this.executors.put(method, executor);
		}
		return executor;
	}

 b.this.defaultExecutor = getDefaultExecutor(this.beanFactory);// b

// AsyncExecutionInterceptor
@Override
protected Executor getDefaultExecutor(BeanFactory beanFactory) {
		Executor defaultExecutor = super.getDefaultExecutor(beanFactory);// c
		return (defaultExecutor != null ? defaultExecutor : new SimpleAsyncTaskExecutor());
	}

 c.Executor defaultExecutor = super.getDefaultExecutor(beanFactory);// c

// AsyncExecutionAspectSupport
protected Executor getDefaultExecutor(BeanFactory beanFactory) {
		if (beanFactory != null) {
			try {
				// Search for TaskExecutor bean... not plain Executor since that would
				// match with ScheduledExecutorService as well, which is unusable for
				// our purposes here. TaskExecutor is more clearly designed for it.
				return beanFactory.getBean(TaskExecutor.class);
			}
			catch (NoUniqueBeanDefinitionException ex) {
				logger.debug("Could not find unique TaskExecutor bean", ex);
				try {
					return beanFactory.getBean(DEFAULT_TASK_EXECUTOR_BEAN_NAME, Executor.class);// 
				}
				catch (NoSuchBeanDefinitionException ex2) {
					if (logger.isInfoEnabled()) {
						logger.info("More than one TaskExecutor bean found within the context, and none is named " +
								"'taskExecutor'. Mark one of them as primary or name it 'taskExecutor' (possibly " +
								"as an alias) in order to use it for async processing: " + ex.getBeanNamesFound());
					}
				}
			}
			catch (NoSuchBeanDefinitionException ex) {
				logger.debug("Could not find default TaskExecutor bean", ex);
				try {
					return beanFactory.getBean(DEFAULT_TASK_EXECUTOR_BEAN_NAME, Executor.class);
				}
				catch (NoSuchBeanDefinitionException ex2) {
					logger.info("No task executor bean found for async processing: " +
							"no bean of type TaskExecutor and no bean named 'taskExecutor' either");
				}
				// Giving up -> either using local default executor or none at all...
			}
		}
		return null;
	}

 

 

分享到:
评论

相关推荐

    基于Spring打造简单高效通用的异步任务处理系统

    在构建一个基于Spring的简单高效通用异步任务处理系统时,我们的主要目标是实现轻量级、简单、高效、通用、高扩展性和高可靠性的解决方案。在这个系统中,我们将利用Spring框架的功能,如Job调度和线程池封装,以及...

    spring异步调用的例子

    在Spring框架中,异步调用是一种提升应用性能和响应速度的重要技术。它允许你在不阻塞当前线程的情况下执行耗时的操作,从而提高系统的...通过理解这些概念并实践相关示例,你将能够更好地掌握Spring异步调用的运用。

    Spring 异步多线程动态任务处理的使用心得

    在现代应用中,高效地处理并发任务是至关重要的,Spring为此提供了异步任务处理的功能,可以显著提升系统的响应速度和性能。本文将深入探讨在Spring中如何利用多线程和动态任务来实现异步处理,并分享一些实践心得。...

    Spring MVC异步模式

    在使用`@Async`之前,需要配置一个`TaskExecutor`,这是Spring用于执行异步任务的接口。Spring MVC默认提供了一个简单的`SimpleAsyncTaskExecutor`,但通常我们会选择更高效的实现,如`ThreadPoolTaskExecutor`。 ...

    spring线程池(同步、异步).docx

    一、Spring异步线程池类图 Spring提供了一系列的`TaskExecutor`实现,它们根据不同的需求和场景有不同的特性和行为。这些实现包括但不限于: 1. `SimpleAsyncTaskExecutor`:每次请求都会启动新的线程,不进行线程...

    spring3.0异步

    为了启用异步处理,需要配置`AsyncConfigurer`接口或者`&lt;task:annotation-driven/&gt;`元素,并提供一个`Executor` bean来处理异步任务。 ### 3. Spring MVC 异步处理 在Spring MVC中,我们可以通过`@Async`注解实现...

    spring定时任务关键jar包(齐全)

    `spring-context-support.jar`是Spring框架对Quartz和Commons JCR等第三方调度库的支持,同时也包含Spring自己的`TaskExecutor`和`TaskScheduler`接口,用于实现异步任务和定时任务。 1. **Spring TaskExecutor**: ...

    spring的定时任务和异步方法

    需要注意的是,异步方法必须在一个启用了`@EnableAsync`的配置类中使用,Spring会自动配置一个任务执行器来处理这些异步任务。 Spring的定时任务和异步方法是提高系统效率和实现复杂业务逻辑的重要工具。通过合理...

    springboot异步任务案例

    在Spring Boot框架中,异步任务处理是一种常见需求,它能提高应用的性能和响应速度。Spring Boot提供了简单易用的API和注解来支持异步任务的实现,特别是通过`@Async`注解和定时任务`@Scheduled`。下面我们将深入...

    Spring3.2异步处理http请求

    `AsyncConfigurer`是Spring提供的接口,用于自定义异步任务的配置,包括`TaskExecutor`的选择和设置。`TaskExecutor`是Spring的核心组件,负责线程池的管理,用于执行异步任务。 ```java @Configuration @...

    spring 任务调度

    - **基本概念**:Spring Task是Spring框架的一部分,提供了基本的定时任务调度功能,包括`@Scheduled`注解用于标记定时任务,以及`TaskScheduler`和`ThreadPoolTaskScheduler`接口用于异步执行任务。 - **@...

    Spring定时任务

    Spring提供`@Async`注解来支持异步任务执行,可以将定时任务与主线程分离,避免阻塞。同时,通过`@Scheduled`注解的`concurrent`属性,可以控制多个实例是否并发执行。 8. **监听任务状态** Spring还提供了`...

    Java课程实验 Spring Boot 任务管理(源代码+实验报告)

    3.使用Spring的异步任务(AsyncTask): 使用@Async注解可以将普通的方法异步执行,使其成为一个异步任务。可以在方法上添加@Async注解并配合@EnableAsync注解将其激活。 4.使用第三方库,如Quartz: 除了使用Spring...

    Spring定时任务实现(非Web项目)

    1. **ThreadPoolTaskExecutor**:这是一个线程池任务执行器,它允许我们异步执行任务,适用于大量并发的任务执行。 2. **ScheduledTaskRegistrar**:这是一个注册器,用来注册定时任务。 3. **...

    Spring 定时任务源码(spring 三种定时任务的实现方式)

    TaskExecutor接口是Spring提供的一个异步任务执行接口,它并不直接支持定时任务,但可以通过配合ScheduledExecutorService或者ThreadPoolTaskScheduler来实现定时任务。ScheduledExecutorService是Java的并发库提供...

    Spring实现任务调度.rar

    `TaskExecutor`接口提供了一个简单的API来执行异步任务。你可以使用`ThreadPoolTaskExecutor`或`SimpleAsyncTaskExecutor`等实现类来配置线程池或者简单地为每个任务创建新线程。配置`TaskExecutor`时,可以调整...

    Springboot启用async异步调用

    因此,我们可以通过配置自定义的`TaskExecutor`来调整异步任务的执行策略,例如使用线程池: ```java @Configuration @EnableAsync public class AppConfig implements AsyncConfigurer { @Override public ...

    spring在@Bean注解中initMethod调用方法异步

    5. `AsyncTaskExecutor`:这是Spring提供的接口,用于执行异步任务。在`initMethod`异步调用中,`AsyncTaskExecutor`会用来执行bean的初始化方法。 6. `AsyncInitBeanHolder`:这个类可能是用来管理异步初始化的...

    Java多线程之定时任务 以及 SpringBoot多线程实现定时任务——异步任务

    1. SpringBoot 自定义线程池以及多线程间的异步调用(@Async、@EnableAsync) 2.Java多线程之定时任务 以及 SpringBoot多线程实现定时任务 3.@EnableScheduling 与 @Scheduled

Global site tag (gtag.js) - Google Analytics