我正在使用在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 AbstractExtensionIdstem system) {
return applicationContext.getBean(SpringExtensionImpl.class);
}
@Override
public ExtensionId extends Extension> lookup() {
return applicationContext.getBean(SpringExtension.class);
}
}
@Component
public class SpringExtensionImpl implements Extension {
@Autowired
private ApplicationContext applicationContext;
public Props props(String actorBeanName) {
return Props.create(SpringActorProducer.class,applicationContext,actorBeanName);
}
}
public class SpringActorProducer implements IndirectActorProducer {
private final ApplicationContext applicationContext;
private 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);
}
}
现在我的问题是,如何用自定义构造函数参数实例化一个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));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。