Akka actors初始化失败

3
我是一位有用的助手,可以为您翻译文本。

我有一个使用Spring Boot + Akka编写的简单应用程序。很少情况下应用程序无法启动,并出现指向actor创建的错误消息:

<!-- language-all: java -->
akka.actor.ActorInitializationException: akka://AkkaSystem/user/MyActor: exception during creation

我可以帮你进行翻译。以下是关于Spring和Akka的配置:

Actor类

@Scope(SCOPE_PROTOTYPE)
@Component("MyActor")
public class MyActor extends UntypedActor {
....
}

SpringActorProducer类

public class SpringActorProducer implements IndirectActorProducer {
    final ApplicationContext applicationContext;
    final String actorBeanName;
    public SpringActorProducer(ApplicationContext applicationContext,
                           String actorBeanName) {
        this.applicationContext = applicationContext;
        this.actorBeanName = actorBeanName;
    }
    @Override
    public Actor produce() {
        return (Actor) applicationContext.getBean(actorBeanName);
    }
    @Override
    public Class<? extends Actor> actorClass() {
        return (Class<? extends Actor>) applicationContext.getType(actorBeanName);
    }
}

AkkaSpringExtension类

@Component
public class AkkaSpringExtension implements Extension {
    private ApplicationContext applicationContext;

    public void initialize(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    public Props props(String actorBeanName) {
        return Props.create(SpringActorProducer.class, applicationContext, actorBeanName);
    }
}

和配置类相关

@Configuration
public class AkkaConfiguration {
    @Autowired
    private ApplicationContext applicationContext;

    @Autowired
    private AkkaSpringExtension springExtension;

    @Bean
    public ActorSystem actorSystem() {
        ExecutorService executor = Executors.newCachedThreadPool();
        DelegatingSecurityContextExecutorService executorService = new DelegatingSecurityContextExecutorService(executor);
        ExecutionContext ec = ExecutionContexts.fromExecutorService(executorService);
        ActorSystem system = ActorSystem.create("AkkaSystem", customAkkaConfiguration(), this.getClass().getClassLoader(), ec);

        springExtension.initialize(applicationContext);
        return system;
    }

    @Bean
    public Config customAkkaConfiguration() {
        return ConfigFactory.load();
    }
}

接下来我在我的服务主体中创建一个actor:

private ActorRef myActor;
@Autowired
private ActorSystem actorSystem;
@Autowired
private AkkaSpringExtension springExtension;

public void afterPropertiesSet() throws Exception {
    myActor = actorSystem.actorOf(springExtension.props("MyActor"), "MyActor");
}

通常情况下一切都按照预期进行,但有时会发生异常(可能是每20次服务器启动中的1次):
MyActor[ERROR] [09/19/2016 10:14:07.705] [pool-3-thread-1] [akka://AkkaSystem/user/MyActor] Error creating bean with name 'MyActor': Injection of autowired dependencies failed; nested exception is java.lang.IllegalStateException: About-to-be-created singleton instance implicitly appeared through the creation of the factory bean that its bean definition points to
akka.actor.ActorInitializationException: akka://AkkaSystem/user/MyActor: exception during creation
    at akka.actor.ActorInitializationException$.apply(Actor.scala:174)
    at akka.actor.ActorCell.create(ActorCell.scala:607)
    at akka.actor.ActorCell.invokeAll$1(ActorCell.scala:461)
    at akka.actor.ActorCell.systemInvoke(ActorCell.scala:483)
    at akka.dispatch.Mailbox.processAllSystemMessages(Mailbox.scala:282)
    at akka.dispatch.Mailbox.run(Mailbox.scala:223)
    at org.springframework.security.concurrent.DelegatingSecurityContextRunnable.run(DelegatingSecurityContextRunnable.java:83)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1153)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.lang.Thread.run(Thread.java:785)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'MyActor': Injection of autowired dependencies failed; nested exception is java.lang.IllegalStateException: About-to-be-created singleton instance implicitly appeared through the creation of the factory bean that its bean definition points to
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:355)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:325)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1076)
    at com.swissre.cih.configuration.akka.SpringActorProducer.produce(SpringActorProducer.java:17)
    at akka.actor.Props.newActor(Props.scala:213)
    at akka.actor.ActorCell.newActor(ActorCell.scala:562)
    at akka.actor.ActorCell.create(ActorCell.scala:588)
    ... 8 more
Caused by: java.lang.IllegalStateException: About-to-be-created singleton instance implicitly appeared through the creation of the factory bean that its bean definition points to
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:378)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getSingletonFactoryBeanForTypeCheck(AbstractAutowireCapableBeanFactory.java:865)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryBean(AbstractAutowireCapableBeanFactory.java:796)
    at org.springframework.beans.factory.support.AbstractBeanFactory.isTypeMatch(AbstractBeanFactory.java:544)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:449)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:425)
    at org.springframework.beans.factory.BeanFactoryUtils.beanNamesForTypeIncludingAncestors(BeanFactoryUtils.java:220)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1199)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1054)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1019)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:566)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:349)
    ... 18 more

任何想法是什么出了问题?

也许这个主题与您的情况有关:http://stackoverflow.com/questions/31604738/illegalstateexception-thrown-by-spring-during-first-quartz-job-execution - Oleg Kurbatov
感谢您的帮助。提到的案例也涉及到bean初始化问题,但根本原因完全不同。 - Anatoly Antonov
那么你能否展示一下MyActor bean中的内容呢?具体来说,我们对其中的自动装配部分很感兴趣,因为日志显示“自动装配依赖项失败”。 - Oleg Kurbatov
有两个自动装配的bean:`@Autowired private MyMongoPersistenceService persistenceService; @Autowired private AkkaSpringExtension springExtension;`持久化服务用于访问Mongo DB,springExtension用于创建子Actor。 - Anatoly Antonov
1
MyMongoPersistenceService 是如何实例化的?它使用工厂方法还是工厂 Bean? - Oleg Kurbatov
MyMongoPersistenceService 使用自动装配的 mongoTemplate bean。该 bean 由单独的配置类初始化,在它失败时我能看到适当的错误消息。这不应该是根本原因,但我将尝试在没有注入任何 bean 的情况下重现此问题。 - Anatoly Antonov
1个回答

0
我将演员初始化从 afterPropertiesSet 移动到一个常规方法中,这样演员将在第一次方法调用时初始化,初始化失败也会消失。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接