使用@Async方法

时间:2017-10-04 12:12:22

标签: spring-boot javabeans spring-async spring-config

我已经编辑了这个,因为我意识到我误诊了错误的原因。导致该错误的原因是我在抽象类中有一个异步方法,该方法由bean实例化。我已将此方法添加到下面的抽象类中。如果我注释掉@Async注释,代码就会构建并运行'。这给了我现在看的地方,但我会留下这个问题以防万一有人可以提供帮助并让我起床。跑得快一点!

我正在尝试重构一个使用xml配置来使用SpringBoot和代码配置的java / spring应用程序。这对我来说是一个很老的学习曲线。

我遇到了一个错误,我认为这个错误已经得到了很好的记录,但是我无法理解文档。基本上创建一个bean,然后在另一个bean的构造函数中使用。将其移动到代码配置时我得到的错误是......

Failed to instantiate [com.app.data.dataTransformer]: 
    Factory method 'dataTransformerObj' threw exception; nested exception is java.lang.IllegalStateException: 
    @Bean method AsyncConfiguration.dataWriteBean called as a bean reference for type 
        [com.app.data.dataWriteBean] but overridden by non-compatible bean instance of type [com.sun.proxy.$Proxy118]. 

从一些谷歌搜索我认为这与将一个bean传递给另一个bean的机制有关,因此这个bean成为一个代理bean。

所以xml配置就像这样...

<beans:bean id="dataReader" class="AsyncAccountReader"/>
<beans:bean id="dataWriter" class="AsyncAccountWriter"/>
<beans:bean class="DataTransformer">
    <beans:qualifier value="dataTransformerObj"/>
    <beans:constructor-arg index="0" value="Account"/>
    <beans:constructor-arg index="1" ref="dataReader"/>
    <beans:constructor-arg index="2" ref="dataWriter"/>
    <beans:constructor-arg index="3" ref="threadPoolTaskExecutor"/>
    <beans:constructor-arg index="4" value="10"/>
    <beans:property name="displayOrder" value="4"/>
</beans:bean>

这很好用(Spring 4 MVC java 8(从7开始升级,代码转换最少)。

到目前为止,代码配置看起来像这样

    @Configuration
    @EnableAsync
    public class AsyncConfiguration {

    @Bean
    public ThreadPoolTaskExecutor asyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(20);
        executor.setMaxPoolSize(30);
        executor.setQueueCapacity(15);
        executor.setThreadNamePrefix("threadPoolTaskExecutor-");
        executor.initialize();
        return executor;
    }

    @Bean
    public AsyncAccountReader dataReader() throws Exception {
        return new AsyncAccountReader();
    }

    @Bean
    public AsyncAccountWriter dataWriter() throws Exception {
        return new AsyncAccountWriter();
    }

    @Bean
    public AsyncDataTransformer esProjectTransformer() throws Exception {
        return new AsyncDataTransformer("Account", dataReader(), dataWriter());   
    }

AsyncAccountReader不会导致任何问题当我包含基于抽象类的类的编写器时,会出现错误(上面)

接口

public interface TransformWriter<T> {
    void writePage(int page, List<T> pageItems, TransformCompleteCallback callback);
}

抽象类

public abstract class AbstractTransformWriter<T> implements TransformWriter<T> {

    @Async
    @Override
    public void writePage(int page, List<T> pageItems, TransformCompleteCallback callback) {
        try {
            asyncWritePage(page, pageItems);
        } catch (Exception e) {
            LOGGER.error("Failed to run async writePage", e);
        } finally {
            callback.callback();
        }
    }

    public abstract void asyncWritePage(int page, List<T> pageItems);
}

具体类

public class AsyncAccountWriter extends AbstractTransformWriter<Account> {

    @Autowired
    public void setDbService(DBService dbService) {
        this.dbService= dbService;
    }

    @Override
    public void asyncWritePage(int page, List<Account> accounts) {
        ...

如果我已经包含太多或者为了指向相关内容而削减太多,那么道歉。

关键是我想如果我删除@Async注释代码构建并运行,如果不是我得到上面的错误。任何人都可以告诉我为什么这是一个问题,并指出我在实施解决方案的写作方向?

0 个答案:

没有答案