我正在使用在activator上发布的Spring Akka示例来创建Spring托管bean演员.这是我目前正在使用的代码,包括一个演示类: 
@Component
class Test extends UntypedActor {
    @Autowired
    protected ObjectMapper objectMapper;
    protected final Account account;
    protected final Order order;
    public Test(Account account,Order order) {
        this.account = account;
        this.order = order;
    }
    @Override
    public void onReceive(Object message) throws Exception {
        if (message instanceof SomeCommand) {
            // Do something using the order and the account;
        } else if (message instanceof FooCommand) {
            // More stuff
        }
    }
}
@Component
public class SpringExtension extends AbstractExtensionId 
现在我的问题是,如何用自定义构造函数参数实例化一个actor.我曾考虑使用工厂或setter方法,但我不认为这是一个选项,因为我相信底层的Actor类是不可访问的.关于此事的任何意见都非常感谢.如果现在有问题,请发表评论. 
PS.如果您认为我的代码中存在错误或有更好的解决方法,请告诉我!我对Spring和Akka的经验很少,所以任何建议都表示赞赏.  
最佳答案 
您可以将其他参数作为varargs(Object …)传递给SpringExtensionImpl和SpringActorProducer.所以你的代码看起来像这样:
 
@Component
public class SpringExtensionImpl implements Extension {
   @Autowired
   private ApplicationContext applicationContext;
   public Props props(String actorBeanName,Object... args) {
       return (args != null && args.length > 0) ?
            Props.create(SpringActorProducer.class,actorBeanName,args) :
            Props.create(SpringActorProducer.class,actorBeanName);
    }
}
public class SpringActorProducer implements IndirectActorProducer {
    private final ApplicationContext applicationContext;
    private final String actorBeanName;
    private final Object[] args;
    public SpringActorProducer(ApplicationContext applicationContext,String actorBeanName) {
        this.applicationContext = applicationContext;
        this.actorBeanName = actorBeanName;
        this.args = null;
    }
    public SpringActorProducer(ApplicationContext applicationContext,String actorBeanName,Object... args) {
        this.applicationContext = applicationContext;
        this.actorBeanName = actorBeanName;
        this.args = args;
    }
    @Override
    public Actor produce() {
        return args == null ? 
              (Actor) applicationContext.getBean(actorBeanName):
              (Actor) applicationContext.getBean(actorBeanName,args);
    }
    @Override
    public Class extends Actor> actorClass() {
        return (Class extends Actor>) applicationContext.getType(actorBeanName);
    }
}
 
然后,您可以像这样创建Test actor: 
SpringExtensionImpl springExtensionImpl; actorSystem.actorOf(springExtensionImpl.create(Test.class,account,order));  
                        (编辑:李大同) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |