2016-09-19 2 views
2

저는 Spring Boot + Akka로 간단한 어플리케이션을 가지고 있습니다.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); 
    } 
} 
:

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

나는 봄 Akka의 구성은 다음과 같습니다 드물게 응용 프로그램 오류 메시지가 배우의 창조를 가리키는으로 시작되지

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(); 
    } 
} 

그 후 나는 내 서비스의 몸에 배우를 만드는거야 :

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 

어떤 아이디어가 잘못 될 수 있습니까?

+0

이 주제가 어떻게 든 귀하의 사건과 관련이 있습니다. http://stackoverflow.com/questions/31604738/illegalstateexception-thrown-by-spring-during-first-quartz-job-execution –

+0

도움 주셔서 감사합니다. 언급 된 경우는 빈 초기화 문제이지만, 근본 원인은 완전히 다릅니다. –

+0

그러면'MyActor' bean에 무엇이 있는지 보여줄 수 있습니까? 특히 'autowired dependencies의 삽입이 실패했습니다.'라는 로그가 있기 때문에 autowired가 흥미 롭습니다. –

답변

0

액터 초기화를 afterPropertiesSet에서 일반 메서드로 이동 했으므로 액터가 첫 번째 메서드 호출과 초기화 실패시 초기화됩니다.

관련 문제