当前位置: 首页 > 面试题库 >

从4.2.0.RC3升级到4.2.0.RELEASE时出现Spring Async问题

危裕
2023-03-14
问题内容

我有一个使用spring(4.2.x)工件的Web应用程序spring-webmvc,spring-messaging,spring-websocket

我在spring config java类中具有以下@ Enable *批注

@EnableWebMvc
@EnableWebSocketMessageBroker
@EnableAsync
@EnableMBeanExport

WebSocket用于将消息广播到浏览器客户端。几乎没有用@Async注释的异步方法

该应用程序在Spring
4.2.0.RC3版本上运行良好。但是,当我将其更改为GA版本4.2.0.RELEASE时,启动时出现以下异常。如果我删除@EnableAsync,它可以正常工作,但是我需要异步功能。

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework.core.task.TaskExecutor] is defined: expected single matching bean but found 4: clientOutboundChannelExecutor,messageBrokerTaskScheduler,clientInboundChannelExecutor,brokerChannelExecutor
    org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:366)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:332)
    org.springframework.scheduling.annotation.AsyncAnnotationBeanPostProcessor.html" target="_blank">setBeanFactory(AsyncAnnotationBeanPostProcessor.java:128)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1597)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1565)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305)
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201)
    org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:228)
    org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:682)
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:522)
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:667)
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:539)
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:493)
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)

问题答案:

你的一个中@Configuration必须实现AsyncConfigurer指定特定TaskExecutor@Async方法。

否则,将会使从中选择哪个混淆applicationContext

即使可以正常使用RC3也没关系,因此该错误已针对进行了修复GA

更新

源代码AsyncAnnotationBeanPostProcessor如下所示:

Executor executorToUse = this.executor;
if (executorToUse == 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.
        executorToUse = beanFactory.getBean(TaskExecutor.class);
    }
    catch (NoUniqueBeanDefinitionException ex) {
        try {
            executorToUse = beanFactory.getBean(DEFAULT_TASK_EXECUTOR_BEAN_NAME, TaskExecutor.class);
        }
        catch (NoSuchBeanDefinitionException ex2) {
            throw new IllegalStateException("More than one TaskExecutor bean exists within the context, " +
                    "and none is named 'taskExecutor'. Mark one of them as primary or name it " +
                    "'taskExecutor' (possibly as an alias); or specify the AsyncConfigurer interface " +
                    "and implement getAsyncExecutor() accordingly.", ex);
        }
    }
    catch (NoSuchBeanDefinitionException ex) {
        logger.debug("Could not find default TaskExecutor bean", ex);
        // Giving up -> falling back to default executor within the advisor...
    }
}

因此,我想在从RC3迁移到GA之前,您已经taskExecutor对此事有所了解。

正如您在StackTrace上看到的那样,已经有一个这样的bean …



 类似资料:
  • 在android版本为4.1.2的时候,这段代码运行良好。但是在4.2.0之后,代码就不工作了,下面是我的代码 我的依赖是

  • 在Android Studio的提示下,我将我项目的Android Gradle插件从4.2.0-beta02升级到4.2.0-beta03。现在,每次同步构建文件时,都会出现以下构建错误: 此错误以前没有显示。下面是生成错误的模块的构建文件: 那么,这是最新AGP版本的一个bug,还是我的构建文件有什么问题,以前被忽略了,但现在被标记了?(我试着注释掉块的整个主体,但错误依然存在。我还试着使缓存

  • 我正在更新我们应用程序中落后的一些maven依赖项,从flyway maven插件4.2.0升级时遇到了一个问题,我们的reset和migrate make命令失败了,我找不到任何有用的结果。 最初,我试图从4.2.0转移到5.2.4。当我无法解决我的错误时,我退回到5.0.0的单个版本。在5.0.0的发行说明之后,我将添加到我的flyway-$env.properties文件中,并更新了我的Ma

  • 我刚刚将我的Android Studio从1.0 RC 2升级到1.0.1。 之后,我被提示将gradle插件从0.14.0更新到1.0.0。 一旦我这么做了,Gradle构建就失败了- 还有其他人面临过类似的问题吗?非常感谢! 我的身材。格拉德尔-

  • 应用程序抛出以下错误: org.springframework.beans.factory.NoUniqueBean定义异常:没有定义[org.springframework.transaction.PlatformTransactionManager]类型的合格bean:预期的单个匹配bean,但找到3 大家好,我们有一个webapp,我们升级到了上面的配置,它在java 8、tomcat 8上

  • 我试图将struts版本从2.3.35升级到2.5.17,但是遇到了如下问题: 我一直在使用本指南迁移到strut版本2.5.17:https://cwiki.apache.org/confluence/display/WW/Struts2.3到2.5迁移 我怀疑这是瓷砖的问题。 我已将所有与struts2-ties-plugin相关的jar升级到2.5.17版,包括struts2-ties-pl

  • 我试图安装Laravel使用Composer,但我一直得到以下错误: 警告:输入: '\' (ASCII=92)状态=1中的意外字符在第46行 /homepages/45/d487622789/htdocs/laravel/artisan 解析错误:语法错误,第46行 /homepages/45/d487622789/htdocs/laravel/artisan意外T_STRING 脚本php a